* 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"
xbt_dict_free(&properties);
smx_actor_t self = SIMIX_process_self();
- smx_actor_t process = 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();
- });
+ 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();
+ return actor->ciface();
}
/** @brief Returns the user data of a process.
* 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 */