]> rtime.felk.cvut.cz Git - frescor/fna.git/blob - src_frescan/frescan_negotiator_thread.c
implement send and receive in fna and bytes<->budget conversion functions... the...
[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
24 static void *frescan_neg_thread(void *arg);
25
26 /**
27  * frescan_negotiator_thread_create()
28  */
29
30 int frescan_negotiator_thread_create(frescan_network_t net)
31 {
32         int ret;
33         fosa_thread_attr_t attr;
34
35         ret = fosa_thread_attr_init(&attr);
36         if (ret != 0) {
37                 ERROR("could not init thread attributes\n");
38                 return ret;
39         }
40
41         ret = fosa_thread_attr_set_prio(&attr, FRESCAN_NEG_THREAD_PRIO);
42         if (ret != 0) {
43                 ERROR("could not set neg thread prio %d\n",
44                       FRESCAN_NEG_THREAD_PRIO);
45                 return ret;
46         }
47
48         ret = fosa_thread_create(&the_networks[net].neg_thread_id,
49                                  &attr,
50                                  frescan_neg_thread,
51                                  (void *)(uint32_t)net);
52
53         if (ret != 0) {
54                 ERROR("could not create the negotiator thread\n");
55                 return ret;
56         }
57
58         ret = fosa_thread_attr_destroy(&attr);
59         if (ret != 0) {
60                 ERROR("could not destroy thread attributes\n");
61                 return ret;
62         }
63
64         return 0;
65 }
66
67 /**
68  * frescan_neg_thread - the thread that negotiates contracts
69  */
70
71 static void *frescan_neg_thread(void *arg)
72 {
73         int err;
74         frescan_request_id_t request;
75         frescan_req_type_t   type;
76         frescan_robj_id_t    reply;
77         frescan_contract_t   *contract;
78         frescan_neg_return_info_t *neg_return_info;
79
80         DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "negotiator thread starts\n");
81
82         while(1) {
83                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG, "wait for a request\n");
84
85                 err = frescan_requestqueue_dequeue(&request);
86                 assert(err == 0);
87
88                 err = frescan_request_get_type(request, &type);
89                 assert(err == 0);
90
91                 switch(type) {
92                         case FRESCAN_NEGOTIATE:
93                                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
94                                       "FRESCAN_NEGOTIATE request\n");
95                                 err = frescan_request_get_contract(request, &contract);
96                                 assert(err == 0);
97                                 err = frescan_request_get_reply(request, &reply);
98                                 assert(err == 0);
99                                 err = frescan_request_get_return_info(request, (void *)&neg_return_info);
100                                 assert(err == 0);
101
102                                 neg_return_info->error = 0;
103                                 neg_return_info->id = 78;
104
105                                 err = frescan_replyobject_signal(reply);
106                                 assert(err == 0);
107                                 break;
108
109                         case FRESCAN_RENEGOTIATE:
110                                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
111                                       "FRESCAN_RENEGOTIATE request\n");
112                                 break;
113
114                         case FRESCAN_CANCEL:
115                                 DEBUG(FRESCAN_NEG_THREAD_ENABLE_DEBUG,
116                                       "FRESCAN_CANCEL request\n");
117                                 break;
118
119                         default:
120                                 ERROR("wrong request type %d\n", type);
121                 }
122         }
123
124         return NULL;
125 }