Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
refcount should be automatic now, and initialized to 0
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 8 Jun 2017 04:56:24 +0000 (06:56 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Tue, 13 Jun 2017 20:19:58 +0000 (22:19 +0200)
src/kernel/activity/ActivityImpl.cpp
src/kernel/activity/ActivityImpl.hpp
src/simix/ActorImpl.cpp
src/simix/smx_network.cpp

index 02733ec..ea655de 100644 (file)
@@ -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();
index 1496c41..be03036 100644 (file)
@@ -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
 
index 445aabc..ea43de9 100644 (file)
@@ -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();
   }
 }
 
index c7a084b..7ea1ff4 100644 (file)
@@ -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<simgrid::kernel::activity::CommImpl>(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 */