ActorImpl::~ActorImpl()
{
delete this->context;
- if (this->properties)
- xbt_dict_free(&this->properties);
- if (this->on_exit)
- xbt_dynar_free(&this->on_exit);
+ xbt_dict_free(&this->properties);
}
void create_maestro(std::function<void()> code)
sleep->surf_sleep = nullptr;
}
sleep->unref();
+ // intrusive_ptr_release(process); // FIXME: We are leaking here. See comment in SIMIX_process_join()
return 0;
}
{
smx_activity_t res = SIMIX_process_sleep(issuer, timeout);
static_cast<simgrid::kernel::activity::ActivityImpl*>(res)->ref();
+ /* We are leaking the process here, but if we don't take the ref, we get a "use after free".
+ * The correct solution would be to derivate the type SynchroSleep into a SynchroProcessJoin,
+ * but the code is not clean enough for now for this.
+ * The C API should first be properly replaced with the C++ one, which is a fair amount of work.
+ */
+ intrusive_ptr_add_ref(process);
SIMIX_process_on_exit(process, (int_f_pvoid_pvoid_t)SIMIX_process_join_finish, res);
return res;
}
void SIMIX_process_on_exit_runall(smx_actor_t process) {
s_smx_process_exit_fun_t exit_fun;
smx_process_exit_status_t exit_status = (process->context->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
- while (!xbt_dynar_is_empty(process->on_exit)) {
- exit_fun = xbt_dynar_pop_as(process->on_exit,s_smx_process_exit_fun_t);
+ while (!process->on_exit.empty()) {
+ exit_fun = process->on_exit.back();
(exit_fun.fun)((void*)exit_status, exit_fun.arg);
+ process->on_exit.pop_back();
}
}
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 ?");
- if (!process->on_exit) {
- process->on_exit = xbt_dynar_new(sizeof(s_smx_process_exit_fun_t), nullptr);
- }
-
s_smx_process_exit_fun_t exit_fun = {fun, data};
- xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun);
+ process->on_exit.push_back(exit_fun);
}
/**