#include "xbt/functional.hpp"
#include "xbt/log.h"
#include "xbt/sysdep.h"
+#include "xbt/utility.hpp"
#include "simgrid/s4u/Host.hpp"
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 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);
}
- xbt_swag_insert(process, simix_global->process_to_destroy);
process->context->iwannadie = 0;
xbt_os_mutex_release(simix_global->mutex);
*/
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 {
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);
}