X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5f8c565f507bde7a0d755ce762ac9971d4430042..48d16e98696450e0dc1ae85cfb8f84b41d15b409:/src/msg/msg_process.cpp diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index 279ebff597..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 ************************************/ @@ -81,53 +82,26 @@ msg_process_t MSG_process_create_with_environment(const char *name, xbt_main_fun props[key] = value; xbt_dict_free(&properties); - smx_actor_t process = simcall_process_create(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); - 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. @@ -186,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. @@ -220,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 */