X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/134806f7924a468e3ebef661f39ae7bc50aa4ad3..ce8b0af8fc1fce880f8e6b99cd10c39b91fc33ee:/src_frescan/frescan_bwres_threads.c diff --git a/src_frescan/frescan_bwres_threads.c b/src_frescan/frescan_bwres_threads.c index 38bcc21..111985c 100644 --- a/src_frescan/frescan_bwres_threads.c +++ b/src_frescan/frescan_bwres_threads.c @@ -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; @@ -273,7 +276,31 @@ static void frescan_manager_req_gn(frescan_bwres_request_data_t *req_data) frescan_manager_gn_restore_scenario(scenario, req_data); } - if (req_data->request_node == me) { + if ((req_data->request_node == me) && + (req_data->return_value == FRESCAN_BWRES_REQ_ACCEPTED)) { + // create servers for new contracts + req_data->ss_new->size = req_data->contracts_to_neg->size; + for(i=0; iss_new->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 +321,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; icontracts_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, @@ -316,6 +338,8 @@ static void frescan_manager_gn_prepare_scenario assert(ret == 0); } + req_data->ss_new->size = req_data->contracts_to_neg->size; + // RENEG-GROUP scenario->backup_contracts_to_reneg.size = req_data->contracts_to_reneg->size; @@ -363,8 +387,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 +421,26 @@ 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); + caller_req->return_value = req_data->return_value; + assert (req_data->ss_new->size == caller_req->contracts_to_neg->size); + caller_req->ss_new->size = req_data->ss_new->size; + DEBUG(FRESCAN_BWRES_MANAGER_ENABLE_DEBUG, - "reply to gn, return value:%d\n", req_data->return_value); + "ret:%d ss_new->size:%u\n", + req_data->return_value, + caller_req->ss_new->size); - orig_req_data->return_value = req_data->return_value; + for (i=0; iss_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 +453,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); }