]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_threads.c
add the infraestructure for storing the negotiated contracts and performing the analy...
[frescor/fna.git] / src_frescan / frescan_bwres_threads.c
index 86eda2e28ad147ca817a20306dba30447fde2305..3216a1b2779c40fbbeb0cd2d79e5342537bff1fe 100644 (file)
@@ -19,6 +19,7 @@
 #include "frescan_bwres_threads.h"
 #include "frescan_bwres_messages.h"
 #include "frescan_bwres_requests.h"
+#include "frescan_bwres_analysis.h"
 #include "frescan_config.h"
 #include "frescan_debug.h"
 #include "frescan_data.h"
@@ -175,19 +176,37 @@ static void frescan_manager_neg(frescan_request_data_t *req_data)
         DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n");
 
         if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+                // scheduling analysis
+                ret = frescan_sa_add_contract
+                                (&the_networks[req_data->net].scenario,
+                                 req_data->contract,
+                                 req_data->ss,
+                                 req_data->request_node);
+                assert(ret == 0);
 
-                // NOTE: req_data->ss is an INPUT parameter
-                accepted = true; // TODO: sched analysis
-                ret = 0;  // TODO: sched analysis
+                ret = frescan_sa_sched_test
+                                (&the_networks[req_data->net].scenario,
+                                 &accepted);
+                assert(ret == 0);
 
                 if (accepted) {
+                        ret = frescan_sa_get_final_values
+                                        (&the_networks[req_data->net].scenario,
+                                         req_data->ss,
+                                         req_data->request_node,
+                                         &req_data->final_values);
+                        assert(ret == 0);
                         req_data->return_value = FRESCAN_REQ_ACCEPTED;
                 } else {
-                        req_data->return_value = (ret == 0) ?
-                                                  FRESCAN_REQ_NOT_ACCEPTED :
-                                                  FRESCAN_REQ_ERROR;
+                        ret = frescan_sa_remove_contract
+                                        (&the_networks[req_data->net].scenario,
+                                         req_data->ss,
+                                         req_data->request_node);
+                        assert(ret == 0);
+                        req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED;
                 }
 
+                // signal or reply the results
                 if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
                         DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n");
                         ret = frescan_bwres_robjs_signal(req_data->robj);
@@ -241,6 +260,7 @@ static void frescan_manager_repneg(frescan_request_data_t *req_data)
         assert(ret == 0);
 
         neg_req_data->return_value = req_data->return_value;
+        neg_req_data->final_values = req_data->final_values;
 
         ret = frescan_bwres_robjs_signal(neg_req_data->robj);
         assert(ret == 0);