X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/09a0b55d933dfe1b6c5e77c6e6b55be1b4e6da66..b6ac23e9dc3754bbad244ed95e7aa386f7be5da6:/src/simix/smx_network.cpp?ds=sidebyside diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index 51a5ab74aa..7856a90d19 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -3,6 +3,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include + #include "src/surf/surf_interface.hpp" #include "src/simix/smx_private.h" #include "xbt/log.h" @@ -84,7 +86,7 @@ void SIMIX_mbox_set_receiver(smx_mailbox_t mbox, smx_process_t process) /** * \brief Pushes a communication synchro into a rendez-vous point * \param mbox The mailbox - * \param comm The communication synchro + * \param synchro The communication synchro */ static inline void SIMIX_mbox_push(smx_mailbox_t mbox, smx_synchro_t synchro) { @@ -97,7 +99,7 @@ static inline void SIMIX_mbox_push(smx_mailbox_t mbox, smx_synchro_t synchro) /** * \brief Removes a communication synchro from a rendez-vous point * \param mbox The rendez-vous point - * \param comm The communication synchro + * \param synchro The communication synchro */ void SIMIX_mbox_remove(smx_mailbox_t mbox, smx_synchro_t synchro) { @@ -155,7 +157,7 @@ static smx_synchro_t _find_matching_comm(std::deque *deque, e_smx /******************************************************************************/ /* Communication synchros */ /******************************************************************************/ -void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_process_t src, smx_mailbox_t mbox, +XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_process_t src, smx_mailbox_t mbox, double task_size, double rate, void *src_buff, size_t src_buff_size, int (*match_fun)(void *, void *,smx_synchro_t), @@ -167,7 +169,7 @@ void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_process_t src, smx_mai SIMCALL_SET_MC_VALUE(simcall, 0); simcall_HANDLER_comm_wait(simcall, comm, timeout); } -smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t src_proc, smx_mailbox_t mbox, +XBT_PRIVATE smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t src_proc, smx_mailbox_t mbox, double task_size, double rate, void *src_buff, size_t src_buff_size, int (*match_fun)(void *, void *,smx_synchro_t), @@ -215,11 +217,9 @@ smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t sr } xbt_fifo_push(src_proc->comms, other_synchro); - /* if the communication synchro is detached then decrease the refcount - * by one, so it will be eliminated by the receiver's destroy call */ + if (detached) { other_comm->detached = true; - other_comm->ref(); other_comm->clean_fun = clean_fun; } else { other_comm->clean_fun = NULL; @@ -246,7 +246,7 @@ smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t sr return (detached ? NULL : other_comm); } -void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_process_t receiver, smx_mailbox_t mbox, +XBT_PRIVATE void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_process_t receiver, smx_mailbox_t mbox, void *dst_buff, size_t *dst_buff_size, int (*match_fun)(void *, void *, smx_synchro_t), void (*copy_data_fun)(smx_synchro_t, void*, size_t), @@ -257,7 +257,7 @@ void simcall_HANDLER_comm_recv(smx_simcall_t simcall, smx_process_t receiver, sm simcall_HANDLER_comm_wait(simcall, comm, timeout); } -smx_synchro_t simcall_HANDLER_comm_irecv(smx_simcall_t simcall, smx_process_t receiver, smx_mailbox_t mbox, +XBT_PRIVATE smx_synchro_t simcall_HANDLER_comm_irecv(smx_simcall_t simcall, smx_process_t receiver, smx_mailbox_t mbox, void *dst_buff, size_t *dst_buff_size, int (*match_fun)(void *, void *, smx_synchro_t), void (*copy_data_fun)(smx_synchro_t, void*, size_t), @@ -386,7 +386,7 @@ void simcall_HANDLER_comm_wait(smx_simcall_t simcall, smx_synchro_t synchro, dou /* Associate this simcall to the wait synchro */ XBT_DEBUG("simcall_HANDLER_comm_wait, %p", synchro); - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); simcall->issuer->waiting_synchro = synchro; if (MC_is_active() || MC_record_replay_is_active()) { @@ -434,7 +434,7 @@ void simcall_HANDLER_comm_test(smx_simcall_t simcall, smx_synchro_t synchro) simcall_comm_test__set__result(simcall, comm->src_proc && comm->dst_proc); if (simcall_comm_test__get__result(simcall)){ synchro->state = SIMIX_DONE; - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); SIMIX_comm_finish(synchro); } else { SIMIX_simcall_answer(simcall); @@ -444,7 +444,7 @@ void simcall_HANDLER_comm_test(smx_simcall_t simcall, smx_synchro_t synchro) simcall_comm_test__set__result(simcall, (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING)); if (simcall_comm_test__get__result(simcall)) { - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); SIMIX_comm_finish(synchro); } else { SIMIX_simcall_answer(simcall); @@ -464,7 +464,7 @@ void simcall_HANDLER_comm_testany(smx_simcall_t simcall, xbt_dynar_t synchros) }else{ synchro = xbt_dynar_get_as(synchros, idx, smx_synchro_t); simcall_comm_testany__set__result(simcall, idx); - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); synchro->state = SIMIX_DONE; SIMIX_comm_finish(synchro); } @@ -474,7 +474,7 @@ void simcall_HANDLER_comm_testany(smx_simcall_t simcall, xbt_dynar_t synchros) xbt_dynar_foreach(simcall_comm_testany__get__comms(simcall), cursor,synchro) { if (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING) { simcall_comm_testany__set__result(simcall, cursor); - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); SIMIX_comm_finish(synchro); return; } @@ -490,7 +490,7 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros) if (MC_is_active() || MC_record_replay_is_active()){ int idx = SIMCALL_GET_MC_VALUE(simcall); synchro = xbt_dynar_get_as(synchros, idx, smx_synchro_t); - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); simcall_comm_waitany__set__result(simcall, idx); synchro->state = SIMIX_DONE; SIMIX_comm_finish(synchro); @@ -499,7 +499,7 @@ void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, xbt_dynar_t synchros) xbt_dynar_foreach(synchros, cursor, synchro){ /* associate this simcall to the the synchro */ - xbt_fifo_push(synchro->simcalls, simcall); + synchro->simcalls.push_back(simcall); /* see if the synchro is already finished */ if (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING){ @@ -515,8 +515,12 @@ void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall) unsigned int cursor = 0; xbt_dynar_t synchros = simcall_comm_waitany__get__comms(simcall); - xbt_dynar_foreach(synchros, cursor, synchro) - xbt_fifo_remove(synchro->simcalls, simcall); + xbt_dynar_foreach(synchros, cursor, synchro) { + // Remove the first occurence of simcall: + auto i = boost::range::find(synchro->simcalls, simcall); + if (i != synchro->simcalls.end()) + synchro->simcalls.erase(i); + } } /** @@ -552,10 +556,10 @@ static inline void SIMIX_comm_start(smx_synchro_t synchro) if (SIMIX_process_is_suspended(comm->src_proc) || SIMIX_process_is_suspended(comm->dst_proc)) { if (SIMIX_process_is_suspended(comm->src_proc)) XBT_DEBUG("The communication is suspended on startup because src (%s@%s) was suspended since it initiated the communication", - comm->src_proc->name, sg_host_get_name(comm->src_proc->host)); + comm->src_proc->name.c_str(), sg_host_get_name(comm->src_proc->host)); else XBT_DEBUG("The communication is suspended on startup because dst (%s@%s) was suspended since it initiated the communication", - comm->dst_proc->name, sg_host_get_name(comm->dst_proc->host)); + comm->dst_proc->name.c_str(), sg_host_get_name(comm->dst_proc->host)); comm->surf_comm->suspend(); } @@ -570,9 +574,10 @@ void SIMIX_comm_finish(smx_synchro_t synchro) { simgrid::simix::Comm *comm = static_cast(synchro); unsigned int destroy_count = 0; - smx_simcall_t simcall; - while ((simcall = (smx_simcall_t) xbt_fifo_shift(synchro->simcalls))) { + while (!synchro->simcalls.empty()) { + smx_simcall_t simcall = synchro->simcalls.front(); + synchro->simcalls.pop_front(); /* If a waitany simcall is waiting for this synchro to finish, then remove it from the other synchros in the waitany list. Afterwards, get the @@ -637,7 +642,7 @@ void SIMIX_comm_finish(smx_synchro_t synchro) synchro, comm->src_proc ? sg_host_get_name(comm->src_proc->host) : NULL, comm->dst_proc ? sg_host_get_name(comm->dst_proc->host) : NULL, - simcall->issuer->name, simcall->issuer, comm->detached); + simcall->issuer->name.c_str(), simcall->issuer, comm->detached); if (comm->src_proc == simcall->issuer) { XBT_DEBUG("I'm source"); } else if (comm->dst_proc == simcall->issuer) { @@ -683,6 +688,8 @@ void SIMIX_comm_finish(smx_synchro_t synchro) if(simcall->issuer == comm->dst_proc){ if(comm->src_proc) xbt_fifo_remove(comm->src_proc->comms, synchro); + //in case of a detached comm we have an extra ref to remove, as the sender won't do it + destroy_count++; } } SIMIX_simcall_answer(simcall);