X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/68569408149f1d2cd89af49248dc64ba673ebad2..08e94eb0482589e4b287cbea301b84daf52635bd:/src/msg/msg_process.cpp diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index 7f00a859ee..d95e2db3c4 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -1,9 +1,10 @@ -/* Copyright (c) 2004-2018. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2019. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ #include "msg_private.hpp" +#include "simgrid/Exception.hpp" #include "simgrid/s4u/Host.hpp" #include "src/instr/instr_private.hpp" #include "src/simix/ActorImpl.hpp" @@ -13,7 +14,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg, "Logging specific to MSG (proc std::string instr_pid(msg_process_t proc) { - return std::string(proc->get_cname()) + "-" + std::to_string(proc->get_pid()); + return std::string(proc->get_name()) + "-" + std::to_string(proc->get_pid()); } /******************************** Process ************************************/ @@ -67,6 +68,8 @@ msg_process_t MSG_process_create_with_arguments(const char *name, xbt_main_func_ msg_process_t MSG_process_create_with_environment(const char *name, xbt_main_func_t code, void *data, msg_host_t host, int argc, char **argv, xbt_dict_t properties) { + xbt_assert(host != nullptr, "Invalid parameters: host param must not be nullptr"); + simgrid::simix::ActorCode function; if (code) function = simgrid::xbt::wrap_main(code, argc, static_cast(argv)); @@ -79,62 +82,26 @@ msg_process_t MSG_process_create_with_environment(const char *name, xbt_main_fun props[key] = value; xbt_dict_free(&properties); - msg_process_t res = MSG_process_create_from_stdfunc(name, std::move(function), data, host, &props); + smx_actor_t self = SIMIX_process_self(); + smx_actor_t actor = nullptr; + try { + actor = simgrid::simix::simcall([name, function, data, host, &props, self] { + return simgrid::kernel::actor::ActorImpl::create(std::move(name), std::move(function), data, host, &props, self) + .get(); + }); + } catch (simgrid::HostFailureException const&) { + xbt_die("Could not create a new process on failed host %s.", host->get_cname()); + } + for (int i = 0; i != argc; ++i) xbt_free(argv[i]); xbt_free(argv); - return res; -} - -msg_process_t MSG_process_create_from_stdfunc(std::string name, simgrid::simix::ActorCode code, void* data, - msg_host_t host, std::unordered_map* properties) -{ - xbt_assert(code != nullptr && host != nullptr, "Invalid parameters: host and code params must not be nullptr"); - - smx_actor_t process = simcall_process_create(name, std::move(code), data, host, properties); - if (process == nullptr) + if (actor == nullptr) return nullptr; MSG_process_yield(); - return process->ciface(); -} - -/* Become a process in the simulation - * - * Currently this can only be called by the main thread (once) and only work with some thread factories - * (currently ThreadContextFactory). - * - * In the future, it might be extended in order to attach other threads created by a third party library. - */ -msg_process_t MSG_process_attach(const char *name, void *data, msg_host_t host, xbt_dict_t properties) -{ - xbt_assert(host != nullptr, "Invalid parameters: host and code params must not be nullptr"); - std::unordered_map props; - xbt_dict_cursor_t cursor = nullptr; - char* key; - char* value; - xbt_dict_foreach (properties, cursor, key, value) - props[key] = value; - xbt_dict_free(&properties); - - /* Let's create the process: SIMIX may decide to start it right now, even before returning the flow control to us */ - smx_actor_t process = SIMIX_process_attach(name, data, host->get_cname(), &props, nullptr); - if (not process) - xbt_die("Could not attach"); - MSG_process_yield(); - return process->ciface(); -} - -/** @brief Detach a process attached with `MSG_process_attach()` - * - * This is called when the current process has finished its job. - * Used in the main thread, it waits for the simulation to finish before returning. When it returns, the other - * simulated processes and the maestro are destroyed. - */ -void MSG_process_detach() -{ - SIMIX_process_detach(); + return actor->ciface(); } /** @brief Returns the user data of a process. @@ -193,7 +160,7 @@ int MSG_process_get_number() int MSG_process_self_PID() { smx_actor_t self = SIMIX_process_self(); - return self == nullptr ? 0 : self->pid_; + return self == nullptr ? 0 : self->get_pid(); } /** @brief Return the PPID of the current process. @@ -227,8 +194,10 @@ smx_context_t MSG_process_get_smx_ctx(msg_process_t process) { // deprecated -- * The on_exit functions are the functions executed when your process is killed. * You should use them to free the data used by your process. */ -void MSG_process_on_exit(int_f_pvoid_pvoid_t fun, void *data) { - simgrid::s4u::this_actor::on_exit([fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data); +void MSG_process_on_exit(int_f_int_pvoid_t fun, void* data) +{ + simgrid::s4u::this_actor::on_exit( + [fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); }); } /** @brief Take an extra reference on that process to prevent it to be garbage-collected */