X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eadbe829389f23151f79257824f3164d7801bbc7..f06f53287a228a869aba211842c5e46ab29b116a:/src/s4u/s4u_Actor.cpp diff --git a/src/s4u/s4u_Actor.cpp b/src/s4u/s4u_Actor.cpp index 01c2763203..5732d13a6a 100644 --- a/src/s4u/s4u_Actor.cpp +++ b/src/s4u/s4u_Actor.cpp @@ -28,22 +28,23 @@ xbt::signal s4u::Actor::on_sleep; xbt::signal s4u::Actor::on_wake_up; xbt::signal s4u::Actor::on_migration_start; xbt::signal s4u::Actor::on_migration_end; +xbt::signal s4u::Actor::on_termination; xbt::signal s4u::Actor::on_destruction; // ***** Actor creation ***** -ActorPtr Actor::self() +Actor* Actor::self() { kernel::context::Context* self_context = kernel::context::Context::self(); if (self_context == nullptr) - return ActorPtr(); + return nullptr; - return self_context->get_actor()->iface(); + return self_context->get_actor()->ciface(); } 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(); }); - return actor->ciface(); + return actor->iface(); } ActorPtr Actor::start(const std::function& code) @@ -76,17 +77,32 @@ void intrusive_ptr_release(Actor* actor) { intrusive_ptr_release(actor->pimpl_); } +int Actor::get_refcount() +{ + return pimpl_->get_refcount(); +} // ***** Actor methods ***** void Actor::join() { - simcall_process_join(this->pimpl_, -1); + join(-1); } void Actor::join(double timeout) { - simcall_process_join(this->pimpl_, timeout); + auto issuer = SIMIX_process_self(); + auto target = pimpl_; + simix::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; + } + }); } void Actor::set_auto_restart(bool autorestart) @@ -101,22 +117,14 @@ void Actor::set_auto_restart(bool autorestart) }); } -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 */ -{ - simix::simcall([this, fun, data] { SIMIX_process_on_exit(pimpl_, fun, data); }); -} - void Actor::on_exit(const std::function& 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& 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) @@ -240,15 +248,15 @@ void Actor::kill_all() simix::simcall([self] { self->kill_all(); }); } -std::unordered_map* Actor::get_properties() +const std::unordered_map* Actor::get_properties() const { - return simix::simcall([this] { return this->pimpl_->get_properties(); }); + return pimpl_->get_properties(); } /** Retrieve the property value (or nullptr if not set) */ -const char* Actor::get_property(const std::string& key) +const char* Actor::get_property(const std::string& key) const { - return simix::simcall([this, &key] { return pimpl_->get_property(key); }); + return pimpl_->get_property(key); } void Actor::set_property(const std::string& key, const std::string& value) @@ -297,11 +305,11 @@ void yield() simix::simcall([] { /* do nothing*/ }); } -XBT_PUBLIC void sleep_until(double timeout) +XBT_PUBLIC void sleep_until(double wakeup_time) { double now = SIMIX_get_clock(); - if (timeout > now) - sleep_for(timeout - now); + if (wakeup_time > now) + sleep_for(wakeup_time - now); } void execute(double flops) @@ -450,43 +458,6 @@ void migrate(Host* new_host) SIMIX_process_self()->iface()->migrate(new_host); } -std::string getName() /* deprecated */ -{ - return get_name(); -} -const char* getCname() /* deprecated */ -{ - return get_cname(); -} -bool isMaestro() /* deprecated */ -{ - return is_maestro(); -} -aid_t getPid() /* deprecated */ -{ - return get_pid(); -} -aid_t getPpid() /* deprecated */ -{ - return get_ppid(); -} -Host* getHost() /* deprecated */ -{ - return get_host(); -} -void on_exit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */ -{ - SIMIX_process_self()->iface()->on_exit([fun, data](int a) { fun((void*)(intptr_t)a, data); }); -} -void onExit(int_f_pvoid_pvoid_t fun, void* data) /* deprecated */ -{ - on_exit([fun, data](int a) { fun((void*)(intptr_t)a, data); }); -} -void kill() /* deprecated */ -{ - exit(); -} - } // namespace this_actor } // namespace s4u } // namespace simgrid @@ -565,7 +536,7 @@ xbt_dict_t sg_actor_get_properties(sg_actor_t actor) { xbt_assert(actor != nullptr, "Invalid parameter: First argument must not be nullptr"); xbt_dict_t as_dict = xbt_dict_new_homogeneous(xbt_free_f); - std::unordered_map* props = actor->get_properties(); + const std::unordered_map* props = actor->get_properties(); if (props == nullptr) return nullptr; for (auto const& kv : *props) { @@ -713,3 +684,39 @@ void sg_actor_detach() { simgrid::kernel::actor::ActorImpl::detach(); } + +aid_t sg_actor_self_get_pid() +{ + return simgrid::s4u::this_actor::get_pid(); +} + +aid_t sg_actor_self_get_ppid() +{ + return simgrid::s4u::this_actor::get_ppid(); +} + +const char* sg_actor_self_get_name() +{ + return simgrid::s4u::this_actor::get_cname(); +} + +sg_actor_t sg_actor_self() +{ + return simgrid::s4u::Actor::self(); +} + +void sg_actor_self_execute(double flops) +{ + simgrid::s4u::this_actor::execute(flops); +} + +/** @brief Take an extra reference on that actor to prevent it to be garbage-collected */ +void sg_actor_ref(sg_actor_t actor) +{ + intrusive_ptr_add_ref(actor); +} +/** @brief Release a reference on that actor so that it can get be garbage-collected */ +void sg_actor_unref(sg_actor_t actor) +{ + intrusive_ptr_release(actor); +}