X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9e467e2e13466a59c6909ae19783cd83591829ad..78c279dafeaf98e75a7db7ccb30c5179dd446353:/src/simix/smx_network.cpp diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index 54367da711..bec9527d1d 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -69,11 +69,6 @@ smx_mailbox_t SIMIX_mbox_get_by_name(const char *name) return (smx_mailbox_t) xbt_dict_get_or_null(mailboxes, name); } -smx_synchro_t SIMIX_mbox_get_head(smx_mailbox_t mbox) -{ - return mbox->comm_queue->empty()? nullptr:mbox->comm_queue->front(); -} - /** * \brief set the receiver of the rendez vous point to allow eager sends * \param mbox The rendez-vous point @@ -142,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 @@ -160,62 +155,6 @@ 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); - - SIMIX_comm_destroy_internal_actions(synchro); - - 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 SIMIX_comm_destroy_internal_actions(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - if (comm->surf_comm){ - comm->surf_comm->unref(); - comm->surf_comm = NULL; - } - - if (comm->src_timeout){ - comm->src_timeout->unref(); - comm->src_timeout = NULL; - } - - if (comm->dst_timeout){ - comm->dst_timeout->unref(); - comm->dst_timeout = NULL; - } -} - 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, @@ -239,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. @@ -258,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)); @@ -268,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; @@ -280,8 +218,8 @@ smx_synchro_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_process_t sr /* 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->ref(); other_comm->clean_fun = clean_fun; } else { other_comm->clean_fun = NULL; @@ -334,7 +272,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 @@ -357,8 +295,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 */ @@ -374,7 +312,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; @@ -416,40 +354,35 @@ 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; } void simcall_HANDLER_comm_wait(smx_simcall_t simcall, smx_synchro_t synchro, double timeout) { - /* the simcall may be a wait, a send or a recv */ - surf_action_t sleep; - /* Associate this simcall to the wait synchro */ XBT_DEBUG("simcall_HANDLER_comm_wait, %p", synchro); @@ -482,7 +415,7 @@ void simcall_HANDLER_comm_wait(smx_simcall_t simcall, smx_synchro_t synchro, dou if (synchro->state != SIMIX_WAITING && synchro->state != SIMIX_RUNNING) { SIMIX_comm_finish(synchro); } else { /* if (timeout >= 0) { we need a surf sleep action even when there is no timeout, otherwise surf won't tell us when the host fails */ - sleep = surf_host_sleep(simcall->issuer->host, timeout); + surf_action_t sleep = surf_host_sleep(simcall->issuer->host, timeout); sleep->setData(synchro); simgrid::simix::Comm *comm = static_cast(synchro); @@ -611,21 +544,18 @@ static inline void SIMIX_comm_start(smx_synchro_t synchro) XBT_DEBUG("Communication from '%s' to '%s' failed to start because of a link failure", sg_host_get_name(sender), sg_host_get_name(receiver)); comm->state = SIMIX_LINK_FAILURE; - SIMIX_comm_destroy_internal_actions(synchro); + comm->cleanupSurf(); } /* 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, 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, sg_host_get_name(comm->dst_proc->host)); comm->surf_comm->suspend(); } @@ -760,7 +690,7 @@ void SIMIX_comm_finish(smx_synchro_t synchro) } while (destroy_count-- > 0) - SIMIX_comm_destroy(synchro); + static_cast(synchro)->unref(); } /** @@ -794,52 +724,11 @@ void SIMIX_post_comm(smx_synchro_t synchro) comm, (int)comm->state, comm->src_proc, comm->dst_proc, comm->detached); /* destroy the surf actions associated with the Simix communication */ - SIMIX_comm_destroy_internal_actions(comm); + comm->cleanupSurf(); /* if there are simcalls associated with the synchro, then answer them */ - if (xbt_fifo_size(synchro->simcalls)) { + if (xbt_fifo_size(synchro->simcalls)) SIMIX_comm_finish(comm); - } -} - -/************* synchro Getters **************/ - -/** - * \brief Return the user data associated to the sender of the communication - * \param synchro The communication - * \return the user data - */ -void* SIMIX_comm_get_src_data(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - - return comm->src_data; -} - -/** - * \brief Return the user data associated to the receiver of the communication - * \param synchro The communication - * \return the user data - */ -void* SIMIX_comm_get_dst_data(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - - return comm->dst_data; -} - -smx_process_t SIMIX_comm_get_src_proc(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - - return comm->src_proc; -} - -smx_process_t SIMIX_comm_get_dst_proc(smx_synchro_t synchro) -{ - simgrid::simix::Comm *comm = static_cast(synchro); - - return comm->dst_proc; } /******************************************************************************/