XBT_DEBUG("Cleanup process %s (%p), waiting synchro %p", process->get_cname(), process,
process->waiting_synchro.get());
- /* Unregister from the kill timer if any */
- if (process->kill_timer != nullptr) {
- SIMIX_timer_remove(process->kill_timer);
- process->kill_timer = nullptr;
- }
-
simix_global->mutex.lock();
simix_global->process_list.erase(process->pid_);
delete this->context_;
}
+void ActorImpl::set_kill_time(double kill_time)
+{
+ if (kill_time <= SIMIX_get_clock())
+ return;
+ XBT_DEBUG("Set kill time %f for process %s@%s", kill_time, get_cname(), host_->get_cname());
+ kill_timer = SIMIX_timer_set(kill_time, [this] {
+ SIMIX_process_kill(this, nullptr);
+ kill_timer = nullptr;
+ });
+}
+
static void dying_daemon(int /*exit_status*/, void* data)
{
std::vector<ActorImpl*>* vect = &simix_global->daemons;
// start the new process
ActorImpl* actor =
SIMIX_process_create(arg.name, std::move(arg.code), arg.data, arg.host, arg.properties.get(), nullptr);
- simcall_process_set_kill_time(actor, arg.kill_time);
+ actor->set_kill_time(arg.kill_time);
actor->set_auto_restart(arg.auto_restart);
return actor->ciface();
simgrid::kernel::activity::SleepImpl* synchro = new simgrid::kernel::activity::SleepImpl();
synchro->host = host_;
- synchro->surf_sleep = host_->pimpl_cpu->sleep(duration);
- synchro->surf_sleep->set_data(synchro);
+ synchro->surf_action_ = host_->pimpl_cpu->sleep(duration);
+ synchro->surf_action_->set_data(synchro);
XBT_DEBUG("Create sleep synchronization %p", synchro);
return synchro;
if (i != actor->waiting_synchro->simcalls_.end())
actor->waiting_synchro->simcalls_.remove(&actor->simcall);
} else if (sleep != nullptr) {
- if (sleep->surf_sleep)
- sleep->surf_sleep->cancel();
+ if (sleep->surf_action_)
+ sleep->surf_action_->cancel();
sleep->post();
} else if (raw != nullptr) {
SIMIX_synchro_stop_waiting(actor, &actor->simcall);
SIMIX_process_on_exit(process,
[](int, void* arg) {
auto sleep = static_cast<simgrid::kernel::activity::SleepImpl*>(arg);
- if (sleep->surf_sleep)
- sleep->surf_sleep->finish(simgrid::kernel::resource::Action::State::FINISHED);
+ if (sleep->surf_action_)
+ sleep->surf_action_->finish(simgrid::kernel::resource::Action::State::FINISHED);
intrusive_ptr_release(sleep);
},
res.get());
simgrid::kernel::activity::SleepImplPtr sleep =
boost::dynamic_pointer_cast<simgrid::kernel::activity::SleepImpl>(synchro);
- if (sleep->surf_sleep) {
- sleep->surf_sleep->unref();
- sleep->surf_sleep = nullptr;
+ if (sleep->surf_action_) {
+ sleep->surf_action_->unref();
+ sleep->surf_action_ = nullptr;
}
}
return actor == simix_global->process_list.end() ? nullptr : actor->second;
}
-void SIMIX_process_on_exit_runall(smx_actor_t actor)
-{
- simgrid::s4u::Actor::on_destruction(actor->iface());
- smx_process_exit_status_t exit_status = (actor->context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
- while (not actor->on_exit.empty()) {
- s_smx_process_exit_fun_t exit_fun = actor->on_exit.back();
- actor->on_exit.pop_back();
- (exit_fun.fun)(exit_status, exit_fun.arg);
- }
-}
-
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);