]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_threads.c
changes until i get bwres_negotiate_in_slave and in_master work... TODO: test more...
[frescor/fna.git] / src_frescan / frescan_bwres_threads.c
index 38bcc21f535b0fd77157962bb3df874a555057d2..a33b36db54eb6f8e1d90f61103d7041ec32ca3c9 100644 (file)
@@ -231,10 +231,13 @@ static void *frescan_acceptor_thread(void *arg)
 
 static void frescan_manager_req_gn(frescan_bwres_request_data_t *req_data)
 {
-        int ret;
+        int ret, i;
         frescan_node_t me;
         bool accepted;
         frescan_bwres_sa_scenario_t *scenario;
+        frescan_ss_t ss;
+        frescan_server_params_t server_params;
+        frescan_bwres_vres_t *vres;
 
         me = frescan_data[req_data->net].local_node;
 
@@ -274,6 +277,28 @@ static void frescan_manager_req_gn(frescan_bwres_request_data_t *req_data)
         }
 
         if (req_data->request_node == me) {
+                // create servers for new contracts
+                for(i=0; i<req_data->contracts_to_neg->size; i++) {
+                        vres = &frescan_data[req_data->net].scenario.
+                                        vres_pool[me]
+                                                 [req_data->ss_new->ss[i]];
+
+                        server_params.budget = frsh_rel_time_to_usec(
+                                        frsh_sa_time_to_rel_time(vres->old_c)) /
+                                        FRESCAN_FRAME_TX_TIME_US;
+
+                        server_params.period = frsh_sa_time_to_rel_time
+                                                                (vres->old_t);
+                        server_params.prio   = vres->old_p;
+
+                        // Create server
+                        ret = frescan_servers_create(req_data->net,
+                                                     &server_params,
+                                                     &ss);
+                        assert(ret == 0);
+                        assert (req_data->ss_new->ss[i] == ss);
+                }
+
                 DEBUG(FRESCAN_BWRES_MANAGER_ENABLE_DEBUG, "signal robj\n");
                 ret = frescan_bwres_robjs_signal(req_data->robj);
                 assert(ret == 0);
@@ -294,19 +319,14 @@ static void frescan_manager_gn_prepare_scenario
                                  frescan_bwres_request_data_t *req_data)
 {
         int ret, i;
-        frescan_server_params_t server_params;
 
         // NEG-GROUP
-        server_params.budget         = 0;
-        server_params.period.tv_sec  = 0;
-        server_params.period.tv_nsec = 0;
-        server_params.prio           = 0;
-
         for(i=0; i<req_data->contracts_to_neg->size; i++) {
-                ret = frescan_servers_create(req_data->net,
-                                             &server_params,
-                                             &req_data->ss_new->ss[i]);
-                assert(ret == 0);
+                ret = freelist_alloc(&frescan_data[req_data->net].scenario.
+                                      ss_id_freelist[req_data->request_node]);
+                assert(ret >= 0);
+
+                req_data->ss_new->ss[i] = (frescan_ss_t)ret;
 
                 ret = frescan_bwres_sa_add_contract
                                 (scenario,
@@ -363,8 +383,9 @@ static void frescan_manager_gn_restore_scenario
                                  NULL);
                 assert(ret == 0);
 
-                ret = frescan_servers_destroy(req_data->net,
-                                              req_data->ss_new->ss[i]);
+                ret = freelist_free(&frescan_data[req_data->net].scenario.
+                                        ss_id_freelist[req_data->request_node],
+                                    req_data->ss_new->ss[i]);
                 assert(ret == 0);
         }
 
@@ -396,18 +417,24 @@ static void frescan_manager_gn_restore_scenario
 
 static void frescan_manager_rep_gn(frescan_bwres_request_data_t *req_data)
 {
-        int ret;
-        frescan_bwres_request_data_t *orig_req_data;
+        int ret, i;
+        frescan_bwres_request_data_t *caller_req;
 
-        ret = frescan_bwres_requests_get_data(req_data->req, &orig_req_data);
+        ret = frescan_bwres_requests_get_data(req_data->req, &caller_req);
         assert(ret == 0);
 
         DEBUG(FRESCAN_BWRES_MANAGER_ENABLE_DEBUG,
               "reply to gn, return value:%d\n", req_data->return_value);
 
-        orig_req_data->return_value = req_data->return_value;
+        caller_req->return_value = req_data->return_value;
+
+        assert (req_data->ss_new->size == caller_req->contracts_to_neg->size);
+
+        for (i=0; i<req_data->ss_new->size; i++) {
+                caller_req->ss_new->ss[i] = req_data->ss_new->ss[i];
+        }
 
-        ret = frescan_bwres_robjs_signal(orig_req_data->robj);
+        ret = frescan_bwres_robjs_signal(caller_req->robj);
         assert(ret == 0);
 }
 
@@ -420,6 +447,7 @@ static void frescan_manager_req_mc(frescan_bwres_request_data_t *req_data)
         int ret;
 
         ret = frescan_bwres_mode_change_local(req_data->net,
-                                              req_data->mode_change_type);
+                                              req_data->mode_change_type,
+                                              req_data->ss_to_cancel);
         assert(ret == 0);
 }