X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4fa1717d674d45f694ea8637db1a32afcbd6cc8c..b60613a2c7267d689bc14020155ea38efc8135f9:/src/simix/ActorImpl.cpp diff --git a/src/simix/ActorImpl.cpp b/src/simix/ActorImpl.cpp index ec224ed131..fe72f94c8e 100644 --- a/src/simix/ActorImpl.cpp +++ b/src/simix/ActorImpl.cpp @@ -5,8 +5,8 @@ #include "mc/mc.h" #include "smx_private.hpp" +#include "src/kernel/activity/IoImpl.hpp" #include "src/kernel/activity/SleepImpl.hpp" -#include "src/kernel/activity/SynchroIo.hpp" #include "src/kernel/activity/SynchroRaw.hpp" #include "src/mc/mc_replay.hpp" #include "src/mc/remote/Client.hpp" @@ -141,7 +141,7 @@ ActorImpl::~ActorImpl() delete this->context; } -static int dying_daemon(void* exit_status, void* data) +static void dying_daemon(int /*exit_status*/, void* data) { std::vector* vect = &simix_global->daemons; @@ -151,9 +151,8 @@ static int dying_daemon(void* exit_status, void* data) /* 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() { @@ -248,7 +247,7 @@ smx_activity_t ActorImpl::sleep(double duration) return synchro; } -void create_maestro(std::function code) +void create_maestro(simgrid::simix::ActorCode code) { smx_actor_t maestro = nullptr; /* Create maestro process and initialize it */ @@ -258,7 +257,7 @@ void create_maestro(std::function code) maestro->setUserData(nullptr); if (not code) { - maestro->context = SIMIX_context_new(std::function(), nullptr, maestro); + maestro->context = SIMIX_context_new(simgrid::simix::ActorCode(), nullptr, maestro); } else { if (not simix_global) xbt_die("simix is not initialized, please call MSG_init first"); @@ -288,8 +287,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, simgrid::s4u::Host* host, - std::map* properties, smx_actor_t parent_process) +smx_actor_t SIMIX_process_create(const char* name, simgrid::simix::ActorCode code, void* data, simgrid::s4u::Host* host, + std::unordered_map* properties, smx_actor_t parent_process) { XBT_DEBUG("Start process %s on host '%s'", name, host->get_cname()); @@ -321,7 +320,7 @@ smx_actor_t SIMIX_process_create(const char* name, std::function code, v /* Add properties */ if (properties != nullptr) for (auto const& kv : *properties) - process->setProperty(kv.first, kv.second); + process->set_property(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 } smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostname, - std::map* properties, smx_actor_t parent_process) + std::unordered_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. @@ -382,7 +381,7 @@ smx_actor_t SIMIX_process_attach(const char* name, void* data, const char* hostn /* Add properties */ if (properties != nullptr) for (auto const& kv : *properties) - process->setProperty(kv.first, kv.second); + process->set_property(kv.first, kv.second); /* Add the process to it's host process list */ host->extension()->process_list.push_back(*process); @@ -652,12 +651,11 @@ smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, doubl smx_activity_t res = issuer->sleep(timeout); intrusive_ptr_add_ref(res.get()); SIMIX_process_on_exit(process, - [](void*, void* arg) { + [](int, void* arg) { auto sleep = static_cast(arg); if (sleep->surf_sleep) sleep->surf_sleep->finish(simgrid::kernel::resource::Action::State::FINISHED); intrusive_ptr_release(sleep); - return 0; }, res.get()); return res; @@ -713,7 +711,7 @@ 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->is_off()) { SIMIX_host_add_auto_restart_process(self->host, self->get_cname(), self->code, self->getUserData(), - SIMIX_timer_get_date(self->kill_timer), self->getProperties(), + SIMIX_timer_get_date(self->kill_timer), self->get_properties(), self->auto_restart); } XBT_DEBUG("Process %s@%s is dead", self->get_cname(), self->host->get_cname()); @@ -758,16 +756,20 @@ void SIMIX_process_on_exit_runall(smx_actor_t process) { while (not process->on_exit.empty()) { s_smx_process_exit_fun_t exit_fun = process->on_exit.back(); process->on_exit.pop_back(); - (exit_fun.fun)((void*)exit_status, exit_fun.arg); + (exit_fun.fun)(exit_status, exit_fun.arg); } } -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 ?"); +void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data) +{ + SIMIX_process_on_exit(process, [fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); +} - s_smx_process_exit_fun_t exit_fun = {fun, data}; +void SIMIX_process_on_exit(smx_actor_t process, std::function fun, void* data) +{ + xbt_assert(process, "current process not found: are you in maestro context ?"); - process->on_exit.push_back(exit_fun); + process->on_exit.emplace_back(s_smx_process_exit_fun_t{fun, data}); } /** @@ -796,11 +798,11 @@ void SIMIX_process_auto_restart_set(smx_actor_t process, int auto_restart) { * \param properties the properties of the process */ 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) + char** argv, std::unordered_map* properties) { if (name == nullptr) name = ""; - auto wrapped_code = simgrid::xbt::wrapMain(code, argc, argv); + auto wrapped_code = simgrid::xbt::wrap_main(code, argc, argv); for (int i = 0; i != argc; ++i) xbt_free(argv[i]); xbt_free(argv); @@ -808,8 +810,8 @@ smx_actor_t simcall_process_create(const char* name, xbt_main_func_t code, void* return res; } -smx_actor_t simcall_process_create(const char* name, std::function code, void* data, sg_host_t host, - std::map* properties) +smx_actor_t simcall_process_create(const char* name, simgrid::simix::ActorCode code, void* data, sg_host_t host, + std::unordered_map* properties) { if (name == nullptr) name = "";