2 * @file frescan_negotiator_thread.c
4 * @brief FRESCAN negotiator thread
6 * This module contains the negotiator thread, with an operation to create it.
12 * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
17 #include "frescan_negotiator_thread.h"
18 #include "fosa_threads_and_signals.h" // fosa_thread_attr_init...
19 #include "frescan_config.h"
20 #include "frescan_debug.h"
21 #include "frescan_data.h"
22 #include "frescan_requests_queue.h"
23 #include "frescan_servers.h"
25 static void *frescan_neg_thread(void *arg);
28 * frescan_negotiator_thread_create()
31 int frescan_negotiator_thread_create(frescan_network_t net)
34 fosa_thread_attr_t attr;
36 ret = fosa_thread_attr_init(&attr);
38 ERROR("could not init thread attributes\n");
42 ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO);
44 ERROR("could not set neg thread prio %d\n",
45 FRESCAN_NEG_THREAD_PRIO);
49 ret = fosa_thread_create(&the_networks[net].neg_thread_id,
52 (void *)(uint32_t)net);
55 ERROR("could not create the negotiator thread\n");
59 ret = fosa_thread_attr_destroy(&attr);
61 ERROR("could not destroy thread attributes\n");
69 * frescan_neg_thread - the thread that negotiates contracts
72 static void *frescan_neg_thread(void *arg)
75 frescan_request_id_t request;
76 frescan_req_type_t type;
77 frescan_robj_id_t reply;
78 frescan_contract_t *contract;
79 frescan_neg_return_info_t *neg_return_info;
80 frescan_server_params_t server_params;
82 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n");
85 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n");
87 err = frescan_requestqueue_dequeue(&request);
90 err = frescan_request_get_type(request, &type);
94 case FRESCAN_NEGOTIATE:
95 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
96 "FRESCAN_NEGOTIATE request\n");
97 err = frescan_request_get_contract(request, &contract);
99 err = frescan_request_get_reply(request, &reply);
101 err = frescan_request_get_return_info(request, (void *)&neg_return_info);
104 // TODO: sched test + add contract to table
105 // so far always accepted witht he min values
106 neg_return_info->error = 0;
107 server_params.values = contract->min_values;
108 server_params.prio = contract->prio;
109 err = frescan_servers_create((frescan_network_t)(uint32_t)arg,
111 &neg_return_info->id);
114 err = frescan_replyobject_signal(reply);
118 case FRESCAN_RENEGOTIATE:
119 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
120 "FRESCAN_RENEGOTIATE request\n");
124 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
125 "FRESCAN_CANCEL request\n");
129 ERROR("wrong request type %d\n", type);