X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1b3f13567c671abae42aaf0bb5ed2bd103c4bf25..1b4a8972a1314491e32bfca68b22657c332f6e5a:/src/simix/smx_network.c diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index 9797825fc9..f613a519b2 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -31,8 +31,6 @@ static void SIMIX_comm_start(smx_action_t action); void SIMIX_network_init(void) { rdv_points = xbt_dict_new_homogeneous(SIMIX_rdv_free); - if(MC_is_active()) - MC_ignore_global_variable("smx_total_comms"); } void SIMIX_network_exit(void) @@ -357,11 +355,12 @@ void SIMIX_pre_comm_send(smx_simcall_t simcall, smx_rdv_t rdv, double task_size, double rate, void *src_buff, size_t src_buff_size, int (*match_fun)(void *, void *,smx_action_t), + void (*copy_data_fun)(smx_action_t, void*, size_t), void *data, double timeout){ smx_action_t comm = SIMIX_comm_isend(simcall->issuer, rdv, task_size, rate, - src_buff, src_buff_size, match_fun, NULL, + src_buff, src_buff_size, match_fun, NULL, copy_data_fun, data, 0); - simcall->mc_value = 0; + SIMCALL_SET_MC_VALUE(simcall, 0); SIMIX_pre_comm_wait(simcall, comm, timeout); } smx_action_t SIMIX_pre_comm_isend(smx_simcall_t simcall, smx_rdv_t rdv, @@ -369,9 +368,10 @@ smx_action_t SIMIX_pre_comm_isend(smx_simcall_t simcall, smx_rdv_t rdv, void *src_buff, size_t src_buff_size, int (*match_fun)(void *, void *,smx_action_t), void (*clean_fun)(void *), + void (*copy_data_fun)(smx_action_t, void*, size_t), void *data, int detached){ return SIMIX_comm_isend(simcall->issuer, rdv, task_size, rate, src_buff, - src_buff_size, match_fun, clean_fun, data, detached); + src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached); } smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv, @@ -379,6 +379,7 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv, void *src_buff, size_t src_buff_size, int (*match_fun)(void *, void *,smx_action_t), void (*clean_fun)(void *), // used to free the action in case of problem after a detached send + void (*copy_data_fun)(smx_action_t, void*, size_t), // used to copy data if not default one void *data, int detached) { @@ -439,6 +440,8 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv, other_action->comm.src_data = data; other_action->comm.match_fun = match_fun; + other_action->comm.copy_data_fun = copy_data_fun; + if (MC_is_active()) { other_action->state = SIMIX_RUNNING; @@ -452,26 +455,29 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv, void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size, int (*match_fun)(void *, void *, smx_action_t), + void (*copy_data_fun)(smx_action_t, void*, size_t), void *data, double timeout, double rate) { smx_action_t comm = SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, - dst_buff_size, match_fun, data, rate); - simcall->mc_value = 0; + dst_buff_size, match_fun, copy_data_fun, data, rate); + SIMCALL_SET_MC_VALUE(simcall, 0); SIMIX_pre_comm_wait(simcall, comm, timeout); } smx_action_t SIMIX_pre_comm_irecv(smx_simcall_t simcall, smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size, int (*match_fun)(void *, void *, smx_action_t), + void (*copy_data_fun)(smx_action_t, void*, size_t), void *data, double rate) { return SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, dst_buff_size, - match_fun, data, rate); + match_fun, copy_data_fun, data, rate); } smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size, int (*match_fun)(void *, void *, smx_action_t), + void (*copy_data_fun)(smx_action_t, void*, size_t), // used to copy data if not default one void *data, double rate) { XBT_DEBUG("recv from %p %p\n", rdv, rdv->comm_fifo); @@ -543,6 +549,7 @@ smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv, other_action->comm.rate = rate; other_action->comm.match_fun = match_fun; + other_action->comm.copy_data_fun = copy_data_fun; /*if(already_received)//do the actual copy, because the first one after the comm didn't have all the info @@ -604,7 +611,7 @@ void SIMIX_pre_comm_wait(smx_simcall_t simcall, smx_action_t action, double time simcall->issuer->waiting_action = action; if (MC_is_active()) { - int idx = simcall->mc_value; + int idx = SIMCALL_GET_MC_VALUE(simcall); if (idx == 0) { action->state = SIMIX_DONE; } else { @@ -668,7 +675,7 @@ void SIMIX_pre_comm_testany(smx_simcall_t simcall, xbt_dynar_t actions) simcall_comm_testany__set__result(simcall, -1); if (MC_is_active()){ - int idx = simcall->mc_value; + int idx = SIMCALL_GET_MC_VALUE(simcall); if(idx == -1){ SIMIX_simcall_answer(simcall); }else{ @@ -698,7 +705,7 @@ void SIMIX_pre_comm_waitany(smx_simcall_t simcall, xbt_dynar_t actions) unsigned int cursor = 0; if (MC_is_active()){ - int idx = simcall->mc_value; + int idx = SIMCALL_GET_MC_VALUE(simcall); action = xbt_dynar_get_as(actions, idx, smx_action_t); xbt_fifo_push(action->simcalls, simcall); simcall_comm_waitany__set__result(simcall, idx); @@ -1172,8 +1179,13 @@ void SIMIX_comm_copy_data(smx_action_t comm) if (comm->comm.dst_buff_size) *comm->comm.dst_buff_size = buff_size; - if (buff_size > 0) - SIMIX_comm_copy_data_callback (comm, comm->comm.src_buff, buff_size); + if (buff_size > 0){ + if(comm->comm.copy_data_fun) + comm->comm.copy_data_fun (comm, comm->comm.src_buff, buff_size); + else + SIMIX_comm_copy_data_callback (comm, comm->comm.src_buff, buff_size); + } + /* Set the copied flag so we copy data only once */ /* (this function might be called from both communication ends) */