X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/fd32cdde4a2c823af49b94bf2568193bf0569014..7ebdd8b62d5f50250007c4eeab9659266cb53590:/src_frescan/frescan_bwres_threads.c?ds=sidebyside diff --git a/src_frescan/frescan_bwres_threads.c b/src_frescan/frescan_bwres_threads.c index 3216a1b..ef750b8 100644 --- a/src_frescan/frescan_bwres_threads.c +++ b/src_frescan/frescan_bwres_threads.c @@ -135,7 +135,7 @@ static void *frescan_manager_thread(void *arg) } if(req_data->request_node != the_networks[net].local_node) { - ret = frescan_requests_free(req); + ret = frescan_requests_free(req); // acceptor request assert(ret == 0); } } @@ -233,20 +233,98 @@ static void frescan_manager_neg(frescan_request_data_t *req_data) static void frescan_manager_reneg(frescan_request_data_t *req_data) { + int ret; + bool accepted; + frescan_contract_t old_contract; + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n"); + + if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) { + // scheduling analysis + ret = frescan_sa_update_contract + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node, + req_data->contract, + &old_contract); + assert(ret == 0); + + 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 { + ret = frescan_sa_update_contract + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node, + &old_contract, + NULL); + 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); + assert(ret == 0); + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "master external, sending reply\n"); + + req_data->type = FRESCAN_REP_NEG; + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "send renegotiation request to master\n"); + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } } /** - * frescan_manager_neg + * frescan_manager_cancel */ static void frescan_manager_cancel(frescan_request_data_t *req_data) { + int ret; + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n"); + + if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) { + ret = frescan_sa_remove_contract + (&the_networks[req_data->net].scenario, + req_data->ss, + req_data->request_node); + assert(ret == 0); + } else { + DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, + "send cancel request to master\n"); + ret = frescan_messages_send_request(req_data); + assert(ret == 0); + } + + if (req_data->request_node == the_networks[req_data->net].local_node) { + ret = frescan_bwres_robjs_signal(req_data->robj); + assert(ret == 0); + } } /** - * frescan_manager_neg + * frescan_manager_repneg */ static void frescan_manager_repneg(frescan_request_data_t *req_data)