]> rtime.felk.cvut.cz Git - frescor/fna.git/blob - src_frescan/frescan_negotiator_thread.c
d0a02e81e080f6c69d672515921d9cc17afaff9a
[frescor/fna.git] / src_frescan / frescan_negotiator_thread.c
1 /*!
2  * @file frescan_negotiator_thread.c
3  *
4  * @brief FRESCAN negotiator thread
5  *
6  * This module contains the negotiator thread, with an operation to create it.
7  *
8  * @version 0.01
9  *
10  * @date 1-Apr-2008
11  *
12  * @author Daniel Sangorrin <daniel.sangorrin@unican.es>
13  *
14  */
15
16 #include <assert.h>
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"
24
25 static void *frescan_neg_thread(void *arg);
26
27 /**
28  * frescan_negotiator_thread_create()
29  */
30
31 int frescan_negotiator_thread_create(frescan_network_t net)
32 {
33         int ret;
34         fosa_thread_attr_t attr;
35
36         ret = fosa_thread_attr_init(&attr);
37         if (ret != 0) {
38                 ERROR("could not init thread attributes\n");
39                 return ret;
40         }
41
42         ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO);
43         if (ret != 0) {
44                 ERROR("could not set neg thread prio %d\n",
45                       FRESCAN_NEG_THREAD_PRIO);
46                 return ret;
47         }
48
49         ret = fosa_thread_create(&the_networks[net].neg_thread_id,
50                                  &attr,
51                                  frescan_neg_thread,
52                                  (void *)(uint32_t)net);
53
54         if (ret != 0) {
55                 ERROR("could not create the negotiator thread\n");
56                 return ret;
57         }
58
59         ret = fosa_thread_attr_destroy(&attr);
60         if (ret != 0) {
61                 ERROR("could not destroy thread attributes\n");
62                 return ret;
63         }
64
65         return 0;
66 }
67
68 /**
69  * frescan_neg_thread - the thread that negotiates contracts
70  */
71
72 static void *frescan_neg_thread(void *arg)
73 {
74         int err;
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;
81
82         DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n");
83
84         while(1) {
85                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n");
86
87                 err = frescan_requestqueue_dequeue(&request);
88                 assert(err == 0);
89
90                 err = frescan_request_get_type(request, &type);
91                 assert(err == 0);
92
93                 switch(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);
98                                 assert(err == 0);
99                                 err = frescan_request_get_reply(request, &reply);
100                                 assert(err == 0);
101                                 err = frescan_request_get_return_info(request, (void *)&neg_return_info);
102                                 assert(err == 0);
103
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,
110                                                              &server_params,
111                                                              &neg_return_info->id);
112                                 assert(err == 0);
113
114                                 err = frescan_replyobject_signal(reply);
115                                 assert(err == 0);
116                                 break;
117
118                         case FRESCAN_RENEGOTIATE:
119                                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
120                                       "FRESCAN_RENEGOTIATE request\n");
121                                 break;
122
123                         case FRESCAN_CANCEL:
124                                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
125                                       "FRESCAN_CANCEL request\n");
126                                 break;
127
128                         default:
129                                 ERROR("wrong request type %d\n", type);
130                 }
131         }
132
133         return NULL;
134 }