X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7c4bef6efee6ba4a06f99e78ea1198d74dc520fc..b8996c34869f8fbd6edf7556d7bef921e55962ba:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index afdedc1bc5..29453b18e6 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -5,12 +5,12 @@ #include #include +#include #include #include #include -#include "xbt/dict.h" #include "xbt/ex.hpp" #include "xbt/functional.hpp" #include "xbt/log.h" @@ -79,8 +79,9 @@ void SIMIX_process_cleanup(smx_actor_t process) xbt_os_mutex_acquire(simix_global->mutex); /* cancel non-blocking communications */ - smx_activity_t synchro = process->comms.front(); while (not process->comms.empty()) { + smx_activity_t synchro = process->comms.front(); + process->comms.pop_front(); simgrid::kernel::activity::CommImplPtr comm = boost::static_pointer_cast(synchro); @@ -104,8 +105,6 @@ void SIMIX_process_cleanup(smx_actor_t process) } else { xbt_die("Communication synchro %p is in my list but I'm not the sender nor the receiver", synchro.get()); } - process->comms.pop_front(); - synchro = process->comms.front(); comm->cancel(); } @@ -141,7 +140,6 @@ namespace simix { ActorImpl::~ActorImpl() { delete this->context; - xbt_dict_free(&this->properties); } static int dying_daemon(void* exit_status, void* data) @@ -167,7 +165,7 @@ void ActorImpl::daemonize() } } -ActorImpl* ActorImpl::restart(ActorImpl* issuer) +simgrid::s4u::Actor* ActorImpl::restart() { XBT_DEBUG("Restarting process %s on %s", cname(), host->getCname()); @@ -183,17 +181,17 @@ ActorImpl* ActorImpl::restart(ActorImpl* issuer) arg.auto_restart = auto_restart; // kill the old process - SIMIX_process_kill(this, issuer); + SIMIX_process_kill(this, (this == simix_global->maestro_process) ? this : SIMIX_process_self()); // start the new process ActorImpl* actor = simix_global->create_process_function(arg.name.c_str(), std::move(arg.code), arg.data, arg.host, - arg.properties, nullptr); + arg.properties.get(), nullptr); if (arg.kill_time >= 0) simcall_process_set_kill_time(actor, arg.kill_time); if (arg.auto_restart) actor->auto_restart = arg.auto_restart; - return actor; + return actor->ciface(); } smx_activity_t ActorImpl::suspend(ActorImpl* issuer) @@ -265,8 +263,7 @@ void create_maestro(std::function code) } else { if (not simix_global) xbt_die("simix is not initialized, please call MSG_init first"); - maestro->context = - simix_global->context_factory->create_maestro(code, maestro); + maestro->context = simix_global->context_factory->create_maestro(code, maestro); } maestro->simcall.issuer = maestro; @@ -292,7 +289,7 @@ 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, simgrid::s4u::Host* host, - xbt_dict_t properties, smx_actor_t parent_process) + std::map* properties, smx_actor_t parent_process) { XBT_DEBUG("Start process %s on host '%s'", name, host->getCname()); @@ -332,7 +329,9 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v process->context = SIMIX_context_new(std::move(code), simix_global->cleanup_process_function, process); /* Add properties */ - process->properties = properties; + if (properties != nullptr) + for (auto const& kv : *properties) + process->setProperty(kv.first, kv.second); /* Make sure that the process is initialized for simix, in case we are called from the Host::onCreation signal */ if (host->extension() == nullptr) @@ -346,7 +345,7 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v /* 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->getCname()); - xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process); + simix_global->process_to_run.push_back(process); intrusive_ptr_add_ref(process); /* Tracing the process creation */ @@ -355,8 +354,8 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v 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, + std::map* 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. @@ -365,8 +364,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn XBT_DEBUG("Attach process %s on host '%s'", name, hostname); if (host->isOff()) { - XBT_WARN("Cannot launch process '%s' on failed host '%s'", - name, hostname); + XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, hostname); return nullptr; } @@ -398,11 +396,12 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn XBT_VERB("Create context %s", process->name.c_str()); if (not simix_global) xbt_die("simix is not initialized, please call MSG_init first"); - process->context = simix_global->context_factory->attach( - simix_global->cleanup_process_function, process); + process->context = simix_global->context_factory->attach(simix_global->cleanup_process_function, process); /* Add properties */ - process->properties = properties; + if (properties != nullptr) + for (auto const& kv : *properties) + process->setProperty(kv.first, kv.second); /* Add the process to it's host process list */ xbt_swag_insert(process, host->extension()->process_list); @@ -410,7 +409,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn /* 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->getCname()); - xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process); + simix_global->process_to_run.push_back(process); /* Tracing the process creation */ TRACE_msg_process_create(process->cname(), process->pid, process->host); @@ -429,16 +428,10 @@ void SIMIX_process_detach() if (not context) xbt_die("Not a suitable context"); - simix_global->cleanup_process_function(context->process()); - - // Let maestro ignore we are still alive: - // xbt_swag_remove(context->process(), simix_global->process_list); - - // TODO, Remove from proces list: - // xbt_swag_remove(process, sg_host_simix(host)->process_list); - + auto process = context->process(); + simix_global->cleanup_process_function(process); context->attach_stop(); - // delete context; + delete process; } /** @@ -454,15 +447,10 @@ void SIMIX_process_runall() { SIMIX_context_runall(); - xbt_dynar_t tmp = simix_global->process_that_ran; - simix_global->process_that_ran = simix_global->process_to_run; - simix_global->process_to_run = tmp; - xbt_dynar_reset(simix_global->process_to_run); + simix_global->process_to_run.swap(simix_global->process_that_ran); + simix_global->process_to_run.clear(); } -void simcall_HANDLER_process_kill(smx_simcall_t simcall, smx_actor_t process) { - SIMIX_process_kill(process, simcall->issuer); -} /** * \brief Internal function to kill a SIMIX process. * @@ -525,9 +513,11 @@ void SIMIX_process_kill(smx_actor_t process, smx_actor_t issuer) { process->waiting_synchro = nullptr; } - if (not xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) { + if (std::find(begin(simix_global->process_to_run), end(simix_global->process_to_run), process) == + end(simix_global->process_to_run) && + process != issuer) { XBT_DEBUG("Inserting %s in the to_run list", process->name.c_str()); - xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process); + simix_global->process_to_run.push_back(process); } } @@ -549,9 +539,8 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const simgrid::kernel::activity::ExecImplPtr exec = boost::dynamic_pointer_cast(process->waiting_synchro); - if (exec != nullptr) { - SIMIX_execution_cancel(process->waiting_synchro); - } + if (exec != nullptr && exec->surf_exec) + exec->surf_exec->cancel(); simgrid::kernel::activity::CommImplPtr comm = boost::dynamic_pointer_cast(process->waiting_synchro); @@ -564,9 +553,11 @@ void SIMIX_process_throw(smx_actor_t process, xbt_errcat_t cat, int value, const boost::dynamic_pointer_cast(process->waiting_synchro); if (sleep != nullptr) { SIMIX_process_sleep_destroy(process->waiting_synchro); - if (not xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self()) { + if (std::find(begin(simix_global->process_to_run), end(simix_global->process_to_run), process) == + end(simix_global->process_to_run) && + process != SIMIX_process_self()) { XBT_DEBUG("Inserting %s in the to_run list", process->name.c_str()); - xbt_dynar_push_as(simix_global->process_to_run, smx_actor_t, process); + simix_global->process_to_run.push_back(process); } } @@ -595,7 +586,7 @@ void simcall_HANDLER_process_killall(smx_simcall_t simcall, int reset_pid) { */ void SIMIX_process_killall(smx_actor_t issuer, int reset_pid) { - for (auto kv : simix_global->process_list) + for (auto const& kv : simix_global->process_list) if (kv.second != issuer) SIMIX_process_kill(kv.second, issuer); @@ -667,7 +658,7 @@ const char* SIMIX_process_self_get_name() { smx_actor_t SIMIX_process_get_by_name(const char* name) { - for (auto kv : simix_global->process_list) + for (auto const& kv : simix_global->process_list) if (kv.second->name == name) return kv.second; return nullptr; @@ -723,7 +714,12 @@ smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, doubl * 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); + SIMIX_process_on_exit(process, + [](void*, void* arg) { + return simgrid::simix::kernelImmediate( + [&] { return SIMIX_process_join_finish(SMX_EXIT_SUCCESS, arg); }); + }, + &*res); return res; } @@ -755,8 +751,7 @@ void SIMIX_process_sleep_destroy(smx_activity_t synchro) /** * \brief Calling this function makes the process to yield. * - * Only the current process can call this function, giving back the control to - * maestro. + * Only the current process can call this function, giving back the control to maestro. * * \param self the current process */ @@ -783,7 +778,8 @@ void SIMIX_process_yield(smx_actor_t self) /* Add the process to the list of process to restart, only if the host is down */ if (self->auto_restart && self->host->isOff()) { SIMIX_host_add_auto_restart_process(self->host, self->cname(), self->code, self->userdata, - SIMIX_timer_get_date(self->kill_timer), self->properties, self->auto_restart); + SIMIX_timer_get_date(self->kill_timer), self->getProperties(), + self->auto_restart); } XBT_DEBUG("Process %s@%s is dead", self->cname(), self->host->getCname()); self->context->stop(); @@ -815,32 +811,17 @@ void SIMIX_process_exception_terminate(xbt_ex_t * e) xbt_abort(); } -/** - * \brief Returns the list of processes to run. - */ -xbt_dynar_t SIMIX_process_get_runnable() +/** @brief Returns the list of processes to run. */ +const std::vector& simgrid::simix::process_get_runnable() { return simix_global->process_to_run; } -/** - * \brief Returns the process from PID. - */ +/** @brief Returns the process from PID. */ smx_actor_t SIMIX_process_from_PID(aid_t PID) { - if (simix_global->process_list.find(PID) == simix_global->process_list.end()) - return nullptr; - return simix_global->process_list.at(PID); -} - -/** @brief returns a dynar containing all currently existing processes */ -xbt_dynar_t SIMIX_processes_as_dynar() { - xbt_dynar_t res = xbt_dynar_new(sizeof(smx_actor_t),nullptr); - for (auto kv : simix_global->process_list) { - smx_actor_t proc = kv.second; - xbt_dynar_push(res,&proc); - } - return res; + auto process = simix_global->process_list.find(PID); + return process == simix_global->process_list.end() ? nullptr : process->second; } void SIMIX_process_on_exit_runall(smx_actor_t process) { @@ -862,17 +843,12 @@ void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void *d /** * \brief Sets the auto-restart status of the process. - * If set to 1, the process will be automatically restarted when its host - * comes back. + * If set to 1, the process will be automatically restarted when its host comes back. */ void SIMIX_process_auto_restart_set(smx_actor_t process, int auto_restart) { process->auto_restart = auto_restart; } -smx_actor_t simcall_HANDLER_process_restart(smx_simcall_t simcall, smx_actor_t process) { - return process->restart(simcall->issuer); -} - /** @brief Restart a process, starting it again from the beginning. */ /** * \ingroup simix_process_management @@ -892,9 +868,8 @@ smx_actor_t simcall_HANDLER_process_restart(smx_simcall_t simcall, smx_actor_t p * \param properties the properties of the process * \param auto_restart either it is autorestarting or not. */ -extern "C" -smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* data, sg_host_t host, int argc, - char** argv, xbt_dict_t properties) +extern "C" smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* data, sg_host_t host, + int argc, char** argv, std::map* properties) { if (name == nullptr) name = ""; @@ -907,7 +882,7 @@ smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* } smx_actor_t simcall_process_create(const char* name, std::function code, void* data, sg_host_t host, - xbt_dict_t properties) + std::map* properties) { if (name == nullptr) name = "";