X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/04f2226028a38d3e30f5d7d30ef53b7274f34cca..323124aa9c477698fe9e0670c3a0ad4d41af5b22:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 970ececb15..9e256c9b72 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -146,16 +146,16 @@ void SIMIX_process_cleanup(smx_actor_t process) /** * Garbage collection * - * Should be called some time to time to free the memory allocated for processes - * that have finished (or killed). + * Should be called some time to time to free the memory allocated for processes that have finished (or killed). */ void SIMIX_process_empty_trash() { - smx_actor_t process = nullptr; + smx_actor_t process = static_cast(xbt_swag_extract(simix_global->process_to_destroy)); - while ((process = (smx_actor_t) xbt_swag_extract(simix_global->process_to_destroy))) { + while (process) { XBT_DEBUG("Getting rid of %p",process); intrusive_ptr_release(process); + process = static_cast(xbt_swag_extract(simix_global->process_to_destroy)); } } @@ -168,6 +168,35 @@ ActorImpl::~ActorImpl() xbt_dict_free(&this->properties); } +static int dying_daemon(void* exit_status, void* data) +{ + std::vector* vect = &simix_global->daemons; + + auto it = std::find(vect->begin(), vect->end(), static_cast(data)); + xbt_assert(it != vect->end(), "The dying daemon is not a daemon after all. Please report that bug."); + + /* Don't move the whole content since we don't really care about the order */ + std::swap(*it, vect->back()); + vect->pop_back(); + + return 0; +} +/** This process will be terminated automatically when the last non-daemon process finishes */ +void ActorImpl::daemonize() +{ + if (!daemon) { + daemon = true; + simix_global->daemons.push_back(this); + SIMIX_process_on_exit(this, dying_daemon, this); + } +} + +/** Whether this process is daemonized */ +bool ActorImpl::isDaemon() +{ + return daemon; +} + void create_maestro(std::function code) { smx_actor_t maestro = nullptr; @@ -208,13 +237,8 @@ void SIMIX_maestro_create(void (*code)(void*), void* data) * * \return the process created */ -smx_actor_t SIMIX_process_create( - const char *name, - std::function code, - void *data, - sg_host_t host, - xbt_dict_t properties, - smx_actor_t parent_process) +smx_actor_t SIMIX_process_create(const char* name, std::function code, void* data, simgrid::s4u::Host* host, + xbt_dict_t properties, smx_actor_t parent_process) { XBT_DEBUG("Start process %s on host '%s'", name, host->cname()); @@ -256,6 +280,10 @@ smx_actor_t SIMIX_process_create( /* Add properties */ process->properties = properties; + /* Make sure that the process is initialized for simix, in case we are called from the Host::onCreation signal */ + if (host->extension() == nullptr) + host->extension_set(new simgrid::simix::Host()); + /* Add the process to it's host process list */ xbt_swag_insert(process, host->extension()->process_list); @@ -524,6 +552,7 @@ void simcall_HANDLER_process_set_host(smx_simcall_t simcall, smx_actor_t process { process->new_host = dest; } + void SIMIX_process_change_host(smx_actor_t process, sg_host_t dest) { xbt_assert((process != nullptr), "Invalid parameters"); @@ -573,12 +602,13 @@ void SIMIX_process_resume(smx_actor_t process) { XBT_IN("process = %p", process); - if(process->context->iwannadie) { + if (process->context->iwannadie) { XBT_VERB("Ignoring request to suspend a process that is currently dying."); return; } - if(!process->suspended) return; + if (!process->suspended) + return; process->suspended = 0; /* resume the synchronization that was blocking the resumed process. */