XBT_ATTRIB_DEPRECATED_v325("Please use ActorImpl::get_user_data()") XBT_PUBLIC void* SIMIX_process_self_get_data();
XBT_ATTRIB_DEPRECATED_v325("Please manifest if you actually need this function") XBT_PUBLIC
int SIMIX_process_has_pending_comms(smx_actor_t process);
-XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data);
+XBT_ATTRIB_DEPRECATED_v325("Please use SIMIX_process_on_exit(smx_actor_t, const std::function<void(bool)>&)") XBT_PUBLIC
+ void SIMIX_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data);
SG_END_DECL()
#ifdef __cplusplus
-XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process,
- const std::function<void(bool /*failed*/, void* /*data*/)>& fun, void* data);
+XBT_ATTRIB_DEPRECATED_v325("Please use SIMIX_process_on_exit(smx_actor_t, const std::function<void(bool)>&)") XBT_PUBLIC
+ void SIMIX_process_on_exit(smx_actor_t process, const std::function<void(int, void*)>& fun, void* data);
+XBT_PUBLIC void SIMIX_process_on_exit(smx_actor_t process, const std::function<void(bool /*failed*/)>& fun);
#endif
/****************************** Communication *********************************/
}
// Execute the termination callbacks
- smx_process_exit_status_t exit_status = (context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+ bool failed = context_->iwannadie;
while (not on_exit.empty()) {
- s_smx_process_exit_fun_t exit_fun = on_exit.back();
+ auto exit_fun = on_exit.back();
on_exit.pop_back();
- (exit_fun.fun)(exit_status, exit_fun.arg);
+ exit_fun(failed);
}
/* cancel non-blocking activities */
return kill_timer ? kill_timer->get_date() : 0;
}
-static void dying_daemon(int /*exit_status*/, void* data)
-{
- std::vector<ActorImpl*>* vect = &simix_global->daemons;
-
- auto it = std::find(vect->begin(), vect->end(), static_cast<ActorImpl*>(data));
- xbt_assert(it != vect->end(), "The dying daemon is not a daemon after all. Please report that bug.");
-
- /* Don't move the whole content since we don't really care about the order */
- std::swap(*it, vect->back());
- vect->pop_back();
-}
-
void ActorImpl::yield()
{
XBT_DEBUG("Yield actor '%s'", get_cname());
if (not daemon_) {
daemon_ = true;
simix_global->daemons.push_back(this);
- SIMIX_process_on_exit(this, dying_daemon, this);
+ SIMIX_process_on_exit(this, [this](bool) {
+ auto& vect = simix_global->daemons;
+ auto it = std::find(vect.begin(), vect.end(), this);
+ xbt_assert(it != vect.end(), "The dying daemon is not a daemon after all. Please report that bug.");
+
+ /* Don't move the whole content since we don't really care about the order */
+ std::swap(*it, vect.back());
+ vect.pop_back();
+ });
}
}
activity::ActivityImplPtr ActorImpl::join(ActorImpl* actor, double timeout)
{
- activity::ActivityImplPtr res = this->sleep(timeout);
- intrusive_ptr_add_ref(res.get());
- SIMIX_process_on_exit(actor,
- [](int, void* arg) {
- auto sleep = static_cast<activity::SleepImpl*>(arg);
- if (sleep->surf_action_)
- sleep->surf_action_->finish(resource::Action::State::FINISHED);
- intrusive_ptr_release(sleep);
- },
- res.get());
- return res;
+ activity::ActivityImplPtr sleep = this->sleep(timeout);
+ SIMIX_process_on_exit(actor, [sleep](bool) {
+ if (sleep->surf_action_)
+ sleep->surf_action_->finish(resource::Action::State::FINISHED);
+ });
+ return sleep;
}
activity::ActivityImplPtr ActorImpl::sleep(double duration)
void SIMIX_process_on_exit(smx_actor_t actor, int_f_pvoid_pvoid_t fun, void* data)
{
- SIMIX_process_on_exit(actor, [fun](int a, void* b) { fun((void*)(intptr_t)a, b); }, data);
+ SIMIX_process_on_exit(actor, [fun, data](bool failed) {
+ intptr_t status = failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+ fun(reinterpret_cast<void*>(status), data);
+ });
}
-void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(bool, void*)>& fun, void* data)
+void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(int, void*)>& fun, void* data)
{
- xbt_assert(actor, "current process not found: are you in maestro context ?");
+ SIMIX_process_on_exit(actor, [fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); });
+}
- actor->on_exit.emplace_back(s_smx_process_exit_fun_t{fun, data});
+void SIMIX_process_on_exit(smx_actor_t actor, const std::function<void(bool /*failed*/)>& fun)
+{
+ xbt_assert(actor, "current process not found: are you in maestro context ?");
+ actor->on_exit.emplace_back(fun);
}
/** @brief Restart a process, starting it again from the beginning. */
#include <map>
#include <memory>
-struct s_smx_process_exit_fun_t {
- std::function<void(bool, void*)> fun;
- void* arg;
-};
-
namespace simgrid {
namespace kernel {
namespace actor {
activity::ActivityImplPtr waiting_synchro = nullptr; /* the current blocking synchro if any */
std::list<activity::ActivityImplPtr> comms; /* the current non-blocking communication synchros */
s_smx_simcall simcall;
- std::vector<s_smx_process_exit_fun_t> on_exit; /* list of functions executed when the process dies */
+ std::vector<std::function<void(bool)>> on_exit; /* list of functions executed when the process dies */
std::function<void()> code;
simix::Timer* kill_timer = nullptr;
XBT_LOG_NEW_CATEGORY(msg, "All MSG categories");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_kernel, msg, "Logging specific to MSG (kernel)");
-MSG_Global_t msg_global = nullptr;
+bool MSG_Global_t::debug_multiple_use = false;
+
+MSG_Global_t* msg_global = nullptr;
simgrid::xbt::Extension<simgrid::s4u::Actor, simgrid::msg::ActorUserData> simgrid::msg::ActorUserData::EXTENSION_ID;
static void MSG_exit();
TRACE_global_init();
if (not msg_global) {
-
- msg_global = new s_MSG_Global_t();
- if (not simgrid::msg::ActorUserData::EXTENSION_ID.valid())
- simgrid::msg::ActorUserData::EXTENSION_ID = simgrid::s4u::Actor::extension_create<simgrid::msg::ActorUserData>();
-
- msg_global->debug_multiple_use = false;
- simgrid::config::bind_flag(msg_global->debug_multiple_use, "msg/debug-multiple-use",
+ simgrid::config::bind_flag(MSG_Global_t::debug_multiple_use, "msg/debug-multiple-use",
"Print backtraces of both processes when there is a conflict of multiple use of a task");
SIMIX_global_init(argc, argv);
+ msg_global = new MSG_Global_t();
+ if (not simgrid::msg::ActorUserData::EXTENSION_ID.valid())
+ simgrid::msg::ActorUserData::EXTENSION_ID = simgrid::s4u::Actor::extension_create<simgrid::msg::ActorUserData>();
+
msg_global->sent_msg = 0;
msg_global->task_copy_callback = nullptr;
msg_global->process_data_cleanup = nullptr;
} // namespace simgrid
/************************** Global variables ********************************/
-struct s_MSG_Global_t {
- bool debug_multiple_use; /* whether we want an error message when reusing the same Task for 2 things */
+struct MSG_Global_t {
+ static bool debug_multiple_use; /* whether we want an error message when reusing the same Task for 2 things */
std::atomic_int_fast32_t sent_msg; /* Total amount of messages sent during the simulation */
void (*task_copy_callback)(msg_task_t task, msg_process_t src, msg_process_t dst);
void_f_pvoid_t process_data_cleanup;
};
-typedef s_MSG_Global_t* MSG_Global_t;
-XBT_PUBLIC_DATA MSG_Global_t msg_global;
+XBT_PUBLIC_DATA MSG_Global_t* msg_global;
/*************************************************************/
XBT_PRIVATE void MSG_comm_copy_data_from_SIMIX(simgrid::kernel::activity::CommImpl* comm, void* buff, size_t buff_size);
});
}
-void Actor::on_exit(int_f_pvoid_pvoid_t fun,
- void* data) /* deprecated: cleanup SIMIX_process_on_exit: change prototype of second parameter and
- remove the last one */
+void Actor::on_exit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */
{
- simix::simcall([this, fun, data] { SIMIX_process_on_exit(pimpl_, fun, data); });
+ on_exit([fun, data](bool failed) {
+ intptr_t status = failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+ fun(reinterpret_cast<void*>(status), data);
+ });
}
void Actor::on_exit(const std::function<void(int, void*)>& fun, void* data) /* deprecated */
{
- on_exit([fun, data](bool exit) { fun(exit, data); });
+ on_exit([fun, data](bool failed) { fun(failed ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS, data); });
}
void Actor::on_exit(const std::function<void(bool /*failed*/)>& fun) const
{
- simix::simcall(
- [this, fun] { SIMIX_process_on_exit(pimpl_, [fun](int a, void* /*data*/) { fun(a != 0); }, nullptr); });
+ simix::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); });
}
void Actor::migrate(Host* new_host)