From: Martin Quinson Date: Thu, 8 Jun 2017 04:56:24 +0000 (+0200) Subject: refcount should be automatic now, and initialized to 0 X-Git-Tag: v3.16~102 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/8e4039652526033642b167e65ad9c1e34fdd6c43 refcount should be automatic now, and initialized to 0 --- diff --git a/src/kernel/activity/ActivityImpl.cpp b/src/kernel/activity/ActivityImpl.cpp index 02733ec904..ea655de7eb 100644 --- a/src/kernel/activity/ActivityImpl.cpp +++ b/src/kernel/activity/ActivityImpl.cpp @@ -16,7 +16,7 @@ ActivityImpl::~ActivityImpl() = default; void ActivityImpl::ref() { - xbt_assert(refcount_ != 0); + xbt_assert(refcount_ >= 0); refcount_++; XBT_CDEBUG(simix_network, "%p->refcount++ ~> %d", this, (int)refcount_); if (XBT_LOG_ISENABLED(simix_network, xbt_log_priority_trace)) @@ -26,8 +26,7 @@ void ActivityImpl::ref() void ActivityImpl::unref() { XBT_CDEBUG(simix_network, "%p->refcount-- ~> %d", this, ((int)refcount_) - 1); - xbt_assert(refcount_ > 0, - "This activity has a negative refcount! You can only call test() or wait() once per activity."); + xbt_assert(refcount_ >= 0); refcount_--; if (XBT_LOG_ISENABLED(simix_network, xbt_log_priority_trace)) xbt_backtrace_display_current(); diff --git a/src/kernel/activity/ActivityImpl.hpp b/src/kernel/activity/ActivityImpl.hpp index 1496c41717..be030363e8 100644 --- a/src/kernel/activity/ActivityImpl.hpp +++ b/src/kernel/activity/ActivityImpl.hpp @@ -41,7 +41,7 @@ namespace activity { friend void intrusive_ptr_release(ActivityImpl * activity); private: - std::atomic_int_fast32_t refcount_{1}; + std::atomic_int_fast32_t refcount_{0}; }; }}} // namespace simgrid::kernel::activity diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 445aabc6d3..ea43de9a68 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -780,7 +780,6 @@ void SIMIX_process_sleep_destroy(smx_activity_t synchro) if (sleep->surf_sleep) { sleep->surf_sleep->unref(); sleep->surf_sleep = nullptr; - sleep->unref(); } } diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index c7a084b775..7ea1ff4f56 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -26,7 +26,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_network, simix, "SIMIX network-related syn static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall); static void SIMIX_comm_copy_data(smx_activity_t comm); -static void SIMIX_comm_start(smx_activity_t synchro); +static void SIMIX_comm_start(simgrid::kernel::activity::CommImplPtr synchro); /** * \brief Checks if there is a communication activity queued in a deque matching our needs @@ -106,7 +106,7 @@ XBT_PRIVATE smx_activity_t simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx _find_matching_comm(&mbox->comm_queue, SIMIX_COMM_RECEIVE, match_fun, data, this_comm, /*remove_matching*/ true); if (not other_comm) { - other_comm = this_comm; + other_comm = std::move(this_comm); if (mbox->permanent_receiver != nullptr) { //this mailbox is for small messages, which have to be sent right now @@ -446,22 +446,19 @@ void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall) * \brief Starts the simulation of a communication synchro. * \param synchro the communication synchro */ -static inline void SIMIX_comm_start(smx_activity_t synchro) +static inline void SIMIX_comm_start(simgrid::kernel::activity::CommImplPtr comm) { - simgrid::kernel::activity::CommImplPtr comm = - boost::static_pointer_cast(synchro); - /* If both the sender and the receiver are already there, start the communication */ - if (synchro->state == SIMIX_READY) { + if (comm->state == SIMIX_READY) { simgrid::s4u::Host* sender = comm->src_proc->host; simgrid::s4u::Host* receiver = comm->dst_proc->host; comm->surf_comm = surf_network_model->communicate(sender, receiver, comm->task_size, comm->rate); - comm->surf_comm->setData(&*synchro); + comm->surf_comm->setData(comm.get()); comm->state = SIMIX_RUNNING; - XBT_DEBUG("Starting communication %p from '%s' to '%s' (surf_action: %p)", synchro.get(), sender->cname(), + XBT_DEBUG("Starting communication %p from '%s' to '%s' (surf_action: %p)", comm.get(), sender->cname(), receiver->cname(), comm->surf_comm); /* If a link is failed, detect it immediately */