X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8675d49409fce3798de57722ac24ffa983f0f3e5..67d3309c513219e94245694e6cfccacc19885e96:/src/s4u/s4u_Actor.cpp diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index b5bbadd696..7187920c3b 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -46,13 +46,14 @@ Actor* Actor::self() ActorPtr Actor::init(const std::string& name, s4u::Host* host) { smx_actor_t self = SIMIX_process_self(); - kernel::actor::ActorImpl* actor = simix::simcall([self, &name, host] { return self->init(name, host).get(); }); + kernel::actor::ActorImpl* actor = + kernel::actor::simcall([self, &name, host] { return self->init(name, host).get(); }); return actor->iface(); } ActorPtr Actor::start(const std::function& code) { - simgrid::simix::simcall([this, &code] { pimpl_->start(code); }); + simgrid::kernel::actor::simcall([this, &code] { pimpl_->start(code); }); return this; } @@ -60,7 +61,7 @@ ActorPtr Actor::create(const std::string& name, s4u::Host* host, const std::func { smx_actor_t self = SIMIX_process_self(); kernel::actor::ActorImpl* actor = - simix::simcall([self, &name, host, &code] { return self->init(name, host)->start(code); }); + kernel::actor::simcall([self, &name, host, &code] { return self->init(name, host)->start(code); }); return actor->iface(); } @@ -96,21 +97,20 @@ void Actor::join(double timeout) { auto issuer = SIMIX_process_self(); auto target = pimpl_; - simix::simcall_blocking([issuer, target, timeout] { + kernel::actor::simcall_blocking([issuer, target, timeout] { if (target->finished_) { // The joined process is already finished, just wake up the issuer right away issuer->simcall_answer(); } else { smx_activity_t sync = issuer->join(target, timeout); - sync->simcalls_.push_back(&issuer->simcall); - issuer->waiting_synchro = sync; + sync->register_simcall(&issuer->simcall); } }); } void Actor::set_auto_restart(bool autorestart) { - simix::simcall([this, autorestart]() { + kernel::actor::simcall([this, autorestart]() { xbt_assert(autorestart && not pimpl_->has_to_auto_restart()); // FIXME: handle all cases pimpl_->set_auto_restart(autorestart); @@ -127,17 +127,17 @@ void Actor::on_exit(const std::function& fun, void* data) /* d void Actor::on_exit(const std::function& fun) const { - simix::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); }); + kernel::actor::simcall([this, &fun] { SIMIX_process_on_exit(pimpl_, fun); }); } void Actor::migrate(Host* new_host) { s4u::Actor::on_migration_start(*this); - simix::simcall([this, new_host]() { + kernel::actor::simcall([this, new_host]() { if (pimpl_->waiting_synchro != nullptr) { // The actor is blocked on an activity. If it's an exec, migrate it too. - // FIXME: implement the migration of other kind of activities + // FIXME: implement the migration of other kinds of activities kernel::activity::ExecImplPtr exec = boost::dynamic_pointer_cast(pimpl_->waiting_synchro); xbt_assert(exec.get() != nullptr, "We can only migrate blocked actors when they are blocked on executions."); @@ -156,7 +156,7 @@ s4u::Host* Actor::get_host() const void Actor::daemonize() { - simix::simcall([this]() { pimpl_->daemonize(); }); + kernel::actor::simcall([this]() { pimpl_->daemonize(); }); } bool Actor::is_daemon() const @@ -186,13 +186,21 @@ aid_t Actor::get_ppid() const void Actor::suspend() { + auto issuer = SIMIX_process_self(); + auto target = pimpl_; s4u::Actor::on_suspend(*this); - simcall_process_suspend(pimpl_); + kernel::actor::simcall_blocking([issuer, target]() { + target->suspend(); + if (target != issuer) { + /* If we are suspending ourselves, then just do not finish the simcall now */ + issuer->simcall_answer(); + } + }); } void Actor::resume() { - simix::simcall([this] { pimpl_->resume(); }); + kernel::actor::simcall([this] { pimpl_->resume(); }); s4u::Actor::on_resume(*this); } @@ -203,7 +211,7 @@ bool Actor::is_suspended() void Actor::set_kill_time(double kill_time) { - simix::simcall([this, kill_time] { pimpl_->set_kill_time(kill_time); }); + kernel::actor::simcall([this, kill_time] { pimpl_->set_kill_time(kill_time); }); } /** @brief Get the kill time of an actor(or 0 if unset). */ @@ -217,7 +225,7 @@ void Actor::kill(aid_t pid) // deprecated kernel::actor::ActorImpl* killer = SIMIX_process_self(); kernel::actor::ActorImpl* victim = SIMIX_process_from_PID(pid); if (victim != nullptr) { - simix::simcall([killer, victim] { killer->kill(victim); }); + kernel::actor::simcall([killer, victim] { killer->kill(victim); }); } else { std::ostringstream oss; oss << "kill: (" << pid << ") - No such actor" << std::endl; @@ -228,7 +236,7 @@ void Actor::kill(aid_t pid) // deprecated void Actor::kill() { kernel::actor::ActorImpl* process = SIMIX_process_self(); - simix::simcall([this, process] { + kernel::actor::simcall([this, process] { xbt_assert(pimpl_ != simix_global->maestro_process, "Killing maestro is a rather bad idea"); process->kill(pimpl_); }); @@ -248,7 +256,7 @@ ActorPtr Actor::by_pid(aid_t pid) void Actor::kill_all() { kernel::actor::ActorImpl* self = SIMIX_process_self(); - simix::simcall([self] { self->kill_all(); }); + kernel::actor::simcall([self] { self->kill_all(); }); } const std::unordered_map* Actor::get_properties() const @@ -264,12 +272,12 @@ const char* Actor::get_property(const std::string& key) const void Actor::set_property(const std::string& key, const std::string& value) { - simix::simcall([this, &key, &value] { pimpl_->set_property(key, value); }); + kernel::actor::simcall([this, &key, &value] { pimpl_->set_property(key, value); }); } Actor* Actor::restart() { - return simix::simcall([this]() { return pimpl_->restart(); }); + return kernel::actor::simcall([this]() { return pimpl_->restart(); }); } // ***** this_actor ***** @@ -299,16 +307,14 @@ void sleep_for(double duration) kernel::actor::ActorImpl* issuer = SIMIX_process_self(); Actor::on_sleep(*issuer->ciface()); - simix::simcall_blocking([issuer, duration]() { + kernel::actor::simcall_blocking([issuer, duration]() { if (MC_is_active() || MC_record_replay_is_active()) { MC_process_clock_add(issuer, duration); issuer->simcall_answer(); return; } smx_activity_t sync = issuer->sleep(duration); - sync->simcalls_.push_back(&issuer->simcall); - issuer->waiting_synchro = sync; - + sync->register_simcall(&issuer->simcall); }); Actor::on_wake_up(*issuer->ciface()); @@ -317,7 +323,7 @@ void sleep_for(double duration) void yield() { - simix::simcall([] { /* do nothing*/ }); + kernel::actor::simcall([] { /* do nothing*/ }); } XBT_PUBLIC void sleep_until(double wakeup_time) @@ -435,23 +441,22 @@ Host* get_host() void suspend() { - kernel::actor::ActorImpl* actor = SIMIX_process_self(); - Actor::on_suspend(*actor->ciface()); - - simcall_process_suspend(actor); + kernel::actor::ActorImpl* self = SIMIX_process_self(); + s4u::Actor::on_suspend(*self->ciface()); + kernel::actor::simcall_blocking([self] { self->suspend(); }); } void resume() { kernel::actor::ActorImpl* self = SIMIX_process_self(); - simix::simcall([self] { self->resume(); }); + kernel::actor::simcall([self] { self->resume(); }); Actor::on_resume(*self->ciface()); } void exit() { kernel::actor::ActorImpl* self = SIMIX_process_self(); - simgrid::simix::simcall([self] { self->exit(); }); + simgrid::kernel::actor::simcall([self] { self->exit(); }); } void on_exit(const std::function& fun) @@ -735,3 +740,14 @@ void sg_actor_unref(sg_actor_t actor) { intrusive_ptr_release(actor); } + +/** @brief Return the user data of a #sg_actor_t */ +void* sg_actor_data(sg_actor_t actor) +{ + return actor->get_data(); +} +/** @brief Set the user data of a #sg_actor_t */ +void sg_actor_data_set(sg_actor_t actor, void* userdata) +{ + actor->set_data(userdata); +}