X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3502bf1993d45e8fd54892262565aef8b1914b3d..04f2226028a38d3e30f5d7d30ef53b7274f34cca:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index a5410cc03e..970ececb15 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -74,7 +74,7 @@ smx_actor_t SIMIX_process_self() */ int SIMIX_process_has_pending_comms(smx_actor_t process) { - return xbt_fifo_size(process->comms) > 0; + return process->comms.size() > 0; } /** @@ -95,8 +95,8 @@ void SIMIX_process_cleanup(smx_actor_t process) xbt_os_mutex_acquire(simix_global->mutex); /* cancel non-blocking communications */ - smx_activity_t synchro = static_cast(xbt_fifo_pop(process->comms)); - while (synchro != nullptr) { + smx_activity_t synchro = static_cast(process->comms.front()); + while (!process->comms.empty()) { simgrid::kernel::activity::Comm *comm = static_cast(synchro); /* make sure no one will finish the comm after this process is destroyed, @@ -122,14 +122,15 @@ void SIMIX_process_cleanup(smx_actor_t process) if (comm->detached && comm->src_proc != nullptr) { /* the comm will be freed right now, remove it from the sender */ - xbt_fifo_remove(comm->src_proc->comms, comm); + comm->src_proc->comms.remove(comm); } comm->unref(); } else { xbt_die("Communication synchro %p is in my list but I'm not the sender nor the receiver", synchro); } - synchro = static_cast(xbt_fifo_pop(process->comms)); + process->comms.pop_front(); + synchro = static_cast(process->comms.front()); } XBT_DEBUG("%p should not be run anymore",process); @@ -164,12 +165,7 @@ namespace simix { ActorImpl::~ActorImpl() { delete this->context; - if (this->properties) - xbt_dict_free(&this->properties); - if (this->comms != nullptr) - xbt_fifo_free(this->comms); - if (this->on_exit) - xbt_dynar_free(&this->on_exit); + xbt_dict_free(&this->properties); } void create_maestro(std::function code) @@ -178,7 +174,6 @@ void create_maestro(std::function code) /* Create maestro process and initialize it */ maestro = new simgrid::simix::ActorImpl(); maestro->pid = simix_process_maxpid++; - maestro->ppid = -1; maestro->name = ""; maestro->data = nullptr; @@ -221,7 +216,6 @@ smx_actor_t SIMIX_process_create( xbt_dict_t properties, smx_actor_t parent_process) { - smx_actor_t process = nullptr; XBT_DEBUG("Start process %s on host '%s'", name, host->cname()); @@ -229,67 +223,57 @@ smx_actor_t SIMIX_process_create( XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, host->cname()); return nullptr; } - else { - process = new simgrid::simix::ActorImpl(); - - xbt_assert(code && host != nullptr, "Invalid parameters"); - /* Process data */ - process->pid = simix_process_maxpid++; - process->name = simgrid::xbt::string(name); - process->host = host; - process->data = data; - process->comms = xbt_fifo_new(); - process->simcall.issuer = process; - /* Initiliaze data segment to default value */ - SIMIX_segment_index_set(process, -1); - - if (parent_process != nullptr) { - process->ppid = parent_process->pid; - /* SMPI process have their own data segment and each other inherit from their father */ + + smx_actor_t process = new simgrid::simix::ActorImpl(); + + xbt_assert(code && host != nullptr, "Invalid parameters"); + /* Process data */ + process->pid = simix_process_maxpid++; + process->name = simgrid::xbt::string(name); + process->host = host; + process->data = data; + process->simcall.issuer = process; + + if (parent_process != nullptr) { + 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 (parent_process->pid != 0) { - SIMIX_segment_index_set(process, parent_process->segment_index); - } else { - SIMIX_segment_index_set(process, process->pid - 1); - } - } + if (smpi_privatize_global_variables) { + if (parent_process->pid != 0) { + SIMIX_segment_index_set(process, parent_process->segment_index); + } else { + SIMIX_segment_index_set(process, process->pid - 1); + } + } #endif - } else { - process->ppid = -1; - } + } - process->auto_restart = false; - process->code = code; + process->code = code; - XBT_VERB("Create context %s", process->name.c_str()); - process->context = SIMIX_context_new(std::move(code), simix_global->cleanup_process_function, process); + XBT_VERB("Create context %s", process->name.c_str()); + process->context = SIMIX_context_new(std::move(code), simix_global->cleanup_process_function, process); + + /* Add properties */ + process->properties = properties; - /* Add properties */ - process->properties = properties; + /* Add the process to it's host process list */ + xbt_swag_insert(process, host->extension()->process_list); - /* Add the process to it's host process list */ - xbt_swag_insert(process, host->extension()->process_list); + XBT_DEBUG("Start context '%s'", process->name.c_str()); - XBT_DEBUG("Start context '%s'", process->name.c_str()); + /* Now insert it in the global process list and in the process to run list */ + simix_global->process_list[process->pid] = process; + XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->cname()); + xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process); - /* Now insert it in the global process list and in the process to run list */ - simix_global->process_list[process->pid] = process; - XBT_DEBUG("Inserting %s(%s) in the to_run list", process->cname(), host->cname()); - xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process); + /* Tracing the process creation */ + TRACE_msg_process_create(process->cname(), process->pid, process->host); - /* Tracing the process creation */ - TRACE_msg_process_create(process->cname(), process->pid, process->host); - } return process; } -smx_actor_t SIMIX_process_attach( - const char* name, - void *data, - const char* hostname, - xbt_dict_t properties, - smx_actor_t parent_process) +smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostname, xbt_dict_t properties, + smx_actor_t parent_process) { // This is mostly a copy/paste from SIMIX_process_new(), // it'd be nice to share some code between those two functions. @@ -309,11 +293,8 @@ smx_actor_t SIMIX_process_attach( process->name = std::string(name); process->host = host; process->data = data; - process->comms = xbt_fifo_new(); process->simcall.issuer = process; - process->ppid = -1; - /* Initiliaze data segment to default value */ - SIMIX_segment_index_set(process, -1); + if (parent_process != nullptr) { process->ppid = parent_process->pid; /* SMPI process have their own data segment and each other inherit from their father */ @@ -329,7 +310,6 @@ smx_actor_t SIMIX_process_attach( } /* Process data for auto-restart */ - process->auto_restart = false; process->code = nullptr; XBT_VERB("Create context %s", process->name.c_str()); @@ -431,7 +411,7 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { exec->unref(); } else if (comm != nullptr) { - xbt_fifo_remove(process->comms, process->waiting_synchro); + process->comms.remove(process->waiting_synchro); comm->cancel(); // Remove first occurrence of &process->simcall: @@ -492,7 +472,7 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const simgrid::kernel::activity::Comm *comm = dynamic_cast(process->waiting_synchro); if (comm != nullptr) { - xbt_fifo_remove(process->comms, comm); + process->comms.remove(comm); comm->cancel(); } @@ -712,6 +692,7 @@ static int SIMIX_process_join_finish(smx_process_exit_status_t status, smx_activ sleep->surf_sleep = nullptr; } sleep->unref(); + // intrusive_ptr_release(process); // FIXME: We are leaking here. See comment in SIMIX_process_join() return 0; } @@ -719,6 +700,12 @@ smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, doubl { smx_activity_t res = SIMIX_process_sleep(issuer, timeout); static_cast(res)->ref(); + /* We are leaking the process here, but if we don't take the ref, we get a "use after free". + * The correct solution would be to derivate the type SynchroSleep into a SynchroProcessJoin, + * but the code is not clean enough for now for this. + * The C API should first be properly replaced with the C++ one, which is a fair amount of work. + */ + intrusive_ptr_add_ref(process); SIMIX_process_on_exit(process, (int_f_pvoid_pvoid_t)SIMIX_process_join_finish, res); return res; } @@ -869,22 +856,19 @@ xbt_dynar_t SIMIX_processes_as_dynar() { void SIMIX_process_on_exit_runall(smx_actor_t process) { s_smx_process_exit_fun_t exit_fun; smx_process_exit_status_t exit_status = (process->context->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS; - while (!xbt_dynar_is_empty(process->on_exit)) { - exit_fun = xbt_dynar_pop_as(process->on_exit,s_smx_process_exit_fun_t); + while (!process->on_exit.empty()) { + exit_fun = process->on_exit.back(); (exit_fun.fun)((void*)exit_status, exit_fun.arg); + process->on_exit.pop_back(); } } void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void *data) { xbt_assert(process, "current process not found: are you in maestro context ?"); - if (!process->on_exit) { - process->on_exit = xbt_dynar_new(sizeof(s_smx_process_exit_fun_t), nullptr); - } - s_smx_process_exit_fun_t exit_fun = {fun, data}; - xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun); + process->on_exit.push_back(exit_fun); } /**