Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
MC: maintain a copy of simix_global->process_to_destroy in a dynar.
[simgrid.git] / src / simix / ActorImpl.cpp
index 3effdcb..1491a9e 100644 (file)
@@ -15,6 +15,7 @@
 #include "xbt/functional.hpp"
 #include "xbt/log.h"
 #include "xbt/sysdep.h"
+#include "xbt/utility.hpp"
 
 #include "simgrid/s4u/Host.hpp"
 
@@ -112,11 +113,14 @@ void SIMIX_process_cleanup(smx_actor_t process)
 
   XBT_DEBUG("%p should not be run anymore",process);
   simix_global->process_list.erase(process->pid);
-  if (process->host && process->host_process_list_hook.is_linked()) {
-    auto& list = process->host->extension<simgrid::simix::Host>()->process_list;
-    list.erase(list.iterator_to(*process));
+  if (process->host && process->host_process_list_hook.is_linked())
+    simgrid::xbt::intrusive_erase(process->host->extension<simgrid::simix::Host>()->process_list, *process);
+  if (not xbt_swag_belongs(process, simix_global->process_to_destroy)) {
+#if SIMGRID_HAVE_MC
+    xbt_dynar_push_as(simix_global->dead_actors_vector, smx_actor_t, process);
+#endif
+    xbt_swag_insert(process, simix_global->process_to_destroy);
   }
-  xbt_swag_insert(process, simix_global->process_to_destroy);
   process->context->iwannadie = 0;
 
   xbt_os_mutex_release(simix_global->mutex);
@@ -136,6 +140,9 @@ void SIMIX_process_empty_trash()
     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 {
@@ -600,8 +607,7 @@ void SIMIX_process_killall(smx_actor_t issuer, int reset_pid)
 void SIMIX_process_change_host(smx_actor_t process, sg_host_t dest)
 {
   xbt_assert((process != nullptr), "Invalid parameters");
-  auto& list = process->host->extension<simgrid::simix::Host>()->process_list;
-  list.erase(list.iterator_to(*process));
+  simgrid::xbt::intrusive_erase(process->host->extension<simgrid::simix::Host>()->process_list, *process);
   process->host = dest;
   dest->extension<simgrid::simix::Host>()->process_list.push_back(*process);
 }