/**
* 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<smx_actor_t>(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<smx_actor_t>(xbt_swag_extract(simix_global->process_to_destroy));
}
}
*
* \return the process created
*/
-smx_actor_t SIMIX_process_create(
- const char *name,
- std::function<void()> 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<void()> 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());
process->ppid = parent_process->pid;
/* SMPI process have their own data segment and each other inherit from their father */
#if HAVE_SMPI
- if (smpi_privatize_global_variables) {
+ if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
if (parent_process->pid != 0) {
SIMIX_segment_index_set(process, parent_process->segment_index);
} else {
/* 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<simgrid::simix::Host>() == nullptr)
+ host->extension_set<simgrid::simix::Host>(new simgrid::simix::Host());
+
/* Add the process to it's host process list */
xbt_swag_insert(process, host->extension<simgrid::simix::Host>()->process_list);
process->ppid = parent_process->pid;
/* SMPI process have their own data segment and each other inherit from their father */
#if HAVE_SMPI
- if (smpi_privatize_global_variables) {
+ if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
if (parent_process->pid != 0) {
SIMIX_segment_index_set(process, parent_process->segment_index);
} else {
{
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. */