Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add test() for asynchronous executions
[simgrid.git] / src / simix / ActorImpl.cpp
index 2295dd3..2db4aeb 100644 (file)
@@ -115,7 +115,12 @@ void SIMIX_process_cleanup(smx_actor_t process)
   simix_global->process_list.erase(process->pid);
   if (process->host && process->host_process_list_hook.is_linked())
     simgrid::xbt::intrusive_erase(process->host->extension<simgrid::simix::Host>()->process_list, *process);
-  xbt_swag_insert(process, simix_global->process_to_destroy);
+  if (not process->smx_destroy_list_hook.is_linked()) {
+#if SIMGRID_HAVE_MC
+    xbt_dynar_push_as(simix_global->dead_actors_vector, smx_actor_t, process);
+#endif
+    simix_global->process_to_destroy.push_back(*process);
+  }
   process->context->iwannadie = 0;
 
   xbt_os_mutex_release(simix_global->mutex);
@@ -128,13 +133,15 @@ void SIMIX_process_cleanup(smx_actor_t process)
  */
 void SIMIX_process_empty_trash()
 {
-  smx_actor_t process = static_cast<smx_actor_t>(xbt_swag_extract(simix_global->process_to_destroy));
-
-  while (process) {
+  while (not simix_global->process_to_destroy.empty()) {
+    smx_actor_t process = &simix_global->process_to_destroy.front();
+    simix_global->process_to_destroy.pop_front();
     XBT_DEBUG("Getting rid of %p",process);
     intrusive_ptr_release(process);
-    process = static_cast<smx_actor_t>(xbt_swag_extract(simix_global->process_to_destroy));
   }
+#if SIMGRID_HAVE_MC
+  xbt_dynar_reset(simix_global->dead_actors_vector);
+#endif
 }
 
 namespace simgrid {
@@ -214,7 +221,7 @@ smx_activity_t ActorImpl::suspend(ActorImpl* issuer)
 
     return nullptr;
   } else {
-    return SIMIX_execution_start(this, "suspend", 0.0, 1.0, 0.0);
+    return SIMIX_execution_start("suspend", 0.0, 1.0, 0.0, this->host);
   }
 }
 
@@ -493,7 +500,11 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) {
         boost::dynamic_pointer_cast<simgrid::kernel::activity::IoImpl>(process->waiting_synchro);
 
     if (exec != nullptr) {
-      /* Nothing to do */
+      if (exec->surfAction_) {
+        exec->surfAction_->cancel();
+        exec->surfAction_->unref();
+        exec->surfAction_ = nullptr;
+      }
     } else if (comm != nullptr) {
       process->comms.remove(process->waiting_synchro);
       comm->cancel();
@@ -541,8 +552,8 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const
 
     simgrid::kernel::activity::ExecImplPtr exec =
         boost::dynamic_pointer_cast<simgrid::kernel::activity::ExecImpl>(process->waiting_synchro);
-    if (exec != nullptr && exec->surf_exec)
-      exec->surf_exec->cancel();
+    if (exec != nullptr && exec->surfAction_)
+      exec->surfAction_->cancel();
 
     simgrid::kernel::activity::CommImplPtr comm =
         boost::dynamic_pointer_cast<simgrid::kernel::activity::CommImpl>(process->waiting_synchro);