X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/675af777129b162c18803e0ed698c787a09fc4c9..04f2226028a38d3e30f5d7d30ef53b7274f34cca:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index 81b03ef834..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; @@ -237,10 +232,7 @@ smx_actor_t SIMIX_process_create( 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; @@ -254,11 +246,8 @@ smx_actor_t SIMIX_process_create( } } #endif - } else { - process->ppid = -1; } - process->auto_restart = false; process->code = code; XBT_VERB("Create context %s", process->name.c_str()); @@ -304,11 +293,8 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn 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 */ @@ -324,7 +310,6 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn } /* Process data for auto-restart */ - process->auto_restart = false; process->code = nullptr; XBT_VERB("Create context %s", process->name.c_str()); @@ -426,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: @@ -487,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(); } @@ -707,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; } @@ -714,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; } @@ -864,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); } /**