X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b9bd3bea7e7a0ad74c2e978c2e8fcb21b370862c..d17f206ea75d3cccc5f1b83b67f58d4fe87781d1:/src/simix/smx_network.cpp diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index 60e790058c..569d72f0b1 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -84,7 +84,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 +97,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) { @@ -137,7 +137,7 @@ static smx_synchro_t _find_matching_comm(std::deque *deque, e_smx XBT_DEBUG("Found a matching communication synchro %p", comm); if (remove_matching) deque->erase(it); - comm->refcount++; + comm->ref(); #if HAVE_MC comm->mbox_cpy = comm->mbox; #endif @@ -155,44 +155,7 @@ static smx_synchro_t _find_matching_comm(std::deque *deque, e_smx /******************************************************************************/ /* Communication synchros */ /******************************************************************************/ - -/** - * \brief Destroy a communicate synchro - * \param synchro The communicate synchro to be destroyed - */ -void SIMIX_comm_destroy(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - - XBT_DEBUG("Destroy synchro %p (refcount: %d), state: %d", comm, comm->refcount, (int)comm->state); - - if (comm->refcount <= 0) { - xbt_backtrace_display_current(); - xbt_die("This comm has a negative refcount! You must not call test() or wait() more than once on a given communication."); - } - comm->refcount--; - if (comm->refcount > 0) - return; - XBT_DEBUG("Really free communication %p; refcount is now %d", comm, comm->refcount); - - comm->cleanupSurf(); - - if (comm->detached && comm->state != SIMIX_DONE) { - /* the communication has failed and was detached: - * we have to free the buffer */ - if (comm->clean_fun) { - comm->clean_fun(comm->src_buff); - } - comm->src_buff = NULL; - } - - if(comm->mbox) - SIMIX_mbox_remove(comm->mbox, comm); - - delete comm; -} - -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), @@ -204,7 +167,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,7 +178,7 @@ smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t sr XBT_DEBUG("send from %p", mbox); /* Prepare a synchro describing us, so that it gets passed to the user-provided filter of other side */ - smx_synchro_t this_synchro = new simgrid::simix::Comm(SIMIX_COMM_SEND); + simgrid::simix::Comm* this_synchro = new simgrid::simix::Comm(SIMIX_COMM_SEND); /* Look for communication synchro matching our needs. We also provide a description of * ourself so that the other side also gets a chance of choosing if it wants to match with us. @@ -234,7 +197,7 @@ smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t sr //this mailbox is for small messages, which have to be sent right now other_synchro->state = SIMIX_READY; other_comm->dst_proc=mbox->permanent_receiver; - other_comm->refcount++; + other_comm->ref(); mbox->done_comm_queue->push_back(other_synchro); other_comm->mbox=mbox; XBT_DEBUG("pushing a message into the permanent receive fifo %p, comm %p", mbox, &(other_comm)); @@ -244,8 +207,7 @@ smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t sr } } else { XBT_DEBUG("Receive already pushed"); - - SIMIX_comm_destroy(this_synchro); + this_synchro->unref(); other_comm->state = SIMIX_READY; other_comm->type = SIMIX_COMM_READY; @@ -253,11 +215,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 = 1; - other_comm->refcount--; + other_comm->detached = true; other_comm->clean_fun = clean_fun; } else { other_comm->clean_fun = NULL; @@ -284,7 +244,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), @@ -295,7 +255,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), @@ -310,7 +270,7 @@ smx_synchro_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_mailbox_t mbox, void void *data, double rate) { XBT_DEBUG("recv from %p %p", mbox, mbox->comm_queue); - smx_synchro_t this_synchro = new simgrid::simix::Comm(SIMIX_COMM_RECEIVE); + simgrid::simix::Comm* this_synchro = new simgrid::simix::Comm(SIMIX_COMM_RECEIVE); smx_synchro_t other_synchro; //communication already done, get it inside the fifo of completed comms @@ -333,8 +293,8 @@ smx_synchro_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_mailbox_t mbox, void other_comm->type = SIMIX_COMM_DONE; other_comm->mbox = NULL; } - other_comm->refcount--; - SIMIX_comm_destroy(this_synchro); + other_comm->unref(); + static_cast(this_synchro)->unref(); } } else { /* Prepare a synchro describing us, so that it gets passed to the user-provided filter of other side */ @@ -350,7 +310,7 @@ smx_synchro_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_mailbox_t mbox, void other_synchro = this_synchro; SIMIX_mbox_push(mbox, this_synchro); } else { - SIMIX_comm_destroy(this_synchro); + this_synchro->unref(); simgrid::simix::Comm *other_comm = static_cast(other_synchro); other_comm->state = SIMIX_READY; @@ -392,32 +352,30 @@ smx_synchro_t SIMIX_comm_iprobe(smx_process_t dst_proc, smx_mailbox_t mbox, int int tag, int (*match_fun)(void *, void *, smx_synchro_t), void *data) { XBT_DEBUG("iprobe from %p %p", mbox, mbox->comm_queue); - smx_synchro_t this_synchro; + simgrid::simix::Comm* this_comm; int smx_type; if(type == 1){ - this_synchro = new simgrid::simix::Comm(SIMIX_COMM_SEND); + this_comm = new simgrid::simix::Comm(SIMIX_COMM_SEND); smx_type = SIMIX_COMM_RECEIVE; } else{ - this_synchro = new simgrid::simix::Comm(SIMIX_COMM_RECEIVE); + this_comm = new simgrid::simix::Comm(SIMIX_COMM_RECEIVE); smx_type = SIMIX_COMM_SEND; } smx_synchro_t other_synchro=NULL; if(mbox->permanent_receiver && ! mbox->done_comm_queue->empty()){ XBT_DEBUG("first check in the permanent recv mailbox, to see if we already got something"); other_synchro = - _find_matching_comm(mbox->done_comm_queue, (e_smx_comm_type_t) smx_type, match_fun, data, this_synchro,/*remove_matching*/false); + _find_matching_comm(mbox->done_comm_queue, (e_smx_comm_type_t) smx_type, match_fun, data, this_comm,/*remove_matching*/false); } if (!other_synchro){ XBT_DEBUG("check if we have more luck in the normal mailbox"); - other_synchro = _find_matching_comm(mbox->comm_queue, (e_smx_comm_type_t) smx_type, match_fun, data, this_synchro,/*remove_matching*/false); + other_synchro = _find_matching_comm(mbox->comm_queue, (e_smx_comm_type_t) smx_type, match_fun, data, this_comm,/*remove_matching*/false); } - if(other_synchro) { - simgrid::simix::Comm *other_comm = static_cast(other_synchro); - other_comm->refcount--; - } + if(other_synchro) + other_synchro->unref(); - SIMIX_comm_destroy(this_synchro); + this_comm->unref(); return other_synchro; } @@ -589,16 +547,13 @@ static inline void SIMIX_comm_start(smx_synchro_t synchro) /* If any of the process is suspend, create the synchro but stop its execution, it will be restarted when the sender process resume */ - if (SIMIX_process_is_suspended(comm->src_proc) || - SIMIX_process_is_suspended(comm->dst_proc)) { - /* FIXME: check what should happen with the synchro state */ - + 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) were suspended since it initiated the communication", - sg_host_get_name(comm->src_proc->host), comm->src_proc->name); + XBT_DEBUG("The communication is suspended on startup because src (%s@%s) was suspended since it initiated the communication", + 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) were suspended since it initiated the communication", - sg_host_get_name(comm->dst_proc->host), comm->dst_proc->name); + XBT_DEBUG("The communication is suspended on startup because dst (%s@%s) was suspended since it initiated the communication", + comm->dst_proc->name.c_str(), sg_host_get_name(comm->dst_proc->host)); comm->surf_comm->suspend(); } @@ -680,7 +635,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) { @@ -726,6 +681,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); @@ -733,46 +690,7 @@ void SIMIX_comm_finish(smx_synchro_t synchro) } while (destroy_count-- > 0) - SIMIX_comm_destroy(synchro); -} - -/** - * \brief This function is called when a Surf communication synchro is finished. - * \param synchro the corresponding Simix communication - */ -void SIMIX_post_comm(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - - /* Update synchro state */ - if (comm->src_timeout && - comm->src_timeout->getState() == simgrid::surf::Action::State::done) - synchro->state = SIMIX_SRC_TIMEOUT; - else if (comm->dst_timeout && - comm->dst_timeout->getState() == simgrid::surf::Action::State::done) - synchro->state = SIMIX_DST_TIMEOUT; - else if (comm->src_timeout && - comm->src_timeout->getState() == simgrid::surf::Action::State::failed) - synchro->state = SIMIX_SRC_HOST_FAILURE; - else if (comm->dst_timeout && - comm->dst_timeout->getState() == simgrid::surf::Action::State::failed) - synchro->state = SIMIX_DST_HOST_FAILURE; - else if (comm->surf_comm && - comm->surf_comm->getState() == simgrid::surf::Action::State::failed) { - synchro->state = SIMIX_LINK_FAILURE; - } else - synchro->state = SIMIX_DONE; - - XBT_DEBUG("SIMIX_post_comm: comm %p, state %d, src_proc %p, dst_proc %p, detached: %d", - comm, (int)comm->state, comm->src_proc, comm->dst_proc, comm->detached); - - /* destroy the surf actions associated with the Simix communication */ - comm->cleanupSurf(); - - /* if there are simcalls associated with the synchro, then answer them */ - if (xbt_fifo_size(synchro->simcalls)) { - SIMIX_comm_finish(comm); - } + static_cast(synchro)->unref(); } /******************************************************************************/