X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1bfdc9a38c22af6a9becf133be154a2fa2bc6589..34dd38ccdbfdf5f3a06cac25d733902aa5a2d26c:/src/simix/smx_network.c?ds=sidebyside diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index f613a519b2..54eda9e942 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -8,6 +8,8 @@ #include "xbt/log.h" #include "mc/mc.h" #include "xbt/dict.h" +#include "smpi/private.h" + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_network, simix, "Logging specific to SIMIX (network)"); @@ -82,7 +84,7 @@ void SIMIX_rdv_free(void *data) xbt_fifo_free(rdv->comm_fifo); xbt_fifo_free(rdv->done_comm_fifo); - xbt_free(rdv); + xbt_free(rdv); } xbt_dict_t SIMIX_get_rdv_points() @@ -351,26 +353,26 @@ void SIMIX_comm_destroy_internal_actions(smx_action_t action) } } -void SIMIX_pre_comm_send(smx_simcall_t simcall, smx_rdv_t rdv, +void SIMIX_pre_comm_send(smx_simcall_t simcall, smx_process_t src, 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, + smx_action_t comm = SIMIX_comm_isend(src, rdv, task_size, rate, src_buff, src_buff_size, match_fun, NULL, copy_data_fun, data, 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, +smx_action_t SIMIX_pre_comm_isend(smx_simcall_t simcall, smx_process_t src, 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 (*clean_fun)(void *), + 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, + return SIMIX_comm_isend(src, rdv, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached); } @@ -803,6 +805,9 @@ void SIMIX_comm_finish(smx_action_t action) it from the other actions in the waitany list. Afterwards, get the position of the actual action in the waitany dynar and return it as the result of the simcall */ + + if (simcall->call == SIMCALL_NONE) //FIXME: maybe a better way to handle this case + continue; // if process handling comm is killed if (simcall->call == SIMCALL_COMM_WAITANY) { SIMIX_waitany_remove_simcall_from_actions(simcall); if (!MC_is_active()) @@ -895,33 +900,13 @@ void SIMIX_comm_finish(smx_action_t action) simcall->issuer->waiting_action = NULL; xbt_fifo_remove(simcall->issuer->comms, action); if(action->comm.detached){ - smx_process_t proc; - int still_alive = 0; - if(simcall->issuer == action->comm.src_proc){ - if(action->comm.dst_proc){ - xbt_swag_foreach(proc, simix_global->process_list) - { - if(proc==action->comm.dst_proc){ - still_alive=1; - break; - } - } - } - if(still_alive) xbt_fifo_remove(action->comm.dst_proc->comms, action); + if(action->comm.dst_proc) + xbt_fifo_remove(action->comm.dst_proc->comms, action); } if(simcall->issuer == action->comm.dst_proc){ if(action->comm.src_proc) - if(action->comm.dst_proc){ - xbt_swag_foreach(proc, simix_global->process_list) - { - if(proc==action->comm.src_proc){ - still_alive=1; - break; - } - } - } - if(still_alive) xbt_fifo_remove(action->comm.src_proc->comms, action); + xbt_fifo_remove(action->comm.src_proc->comms, action); } } SIMIX_simcall_answer(simcall); @@ -964,15 +949,6 @@ void SIMIX_post_comm(smx_action_t action) /* destroy the surf actions associated with the Simix communication */ SIMIX_comm_destroy_internal_actions(action); - /* remove the communication action from the list of pending communications - * of both processes (if they still exist) */ - if (action->comm.src_proc) { - xbt_fifo_remove(action->comm.src_proc->comms, action); - } - if (action->comm.dst_proc) { - xbt_fifo_remove(action->comm.dst_proc->comms, action); - } - /* if there are simcalls associated with the action, then answer them */ if (xbt_fifo_size(action->simcalls)) { SIMIX_comm_finish(action);