X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/360d1e6510190d279551d9ca0510badccb1f8b37..c7c5def2870e604025be03b866967c0c5e293afe:/src/s4u/s4u_actor.cpp diff --git a/src/s4u/s4u_actor.cpp b/src/s4u/s4u_actor.cpp index c888fb3a6f..5e07894d8d 100644 --- a/src/s4u/s4u_actor.cpp +++ b/src/s4u/s4u_actor.cpp @@ -21,6 +21,8 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_actor, "S4U actors"); namespace simgrid { namespace s4u { +simgrid::xbt::signal s4u::Actor::onCreation; + // ***** Actor creation ***** ActorPtr Actor::self() { @@ -74,9 +76,28 @@ void Actor::onExit(int_f_pvoid_pvoid_t fun, void* data) simcall_process_on_exit(pimpl_, fun, data); } +/** @brief Moves the actor to another host + * + * If the actor is currently blocked on an execution activity, the activity is also + * migrated to the new host. If it's blocked on another kind of activity, an error is + * raised as the mandated code is not written yet. Please report that bug if you need it. + * + * Asynchronous activities started by the actor are not migrated automatically, so you have + * to take care of this yourself (only you knows which ones should be migrated). + */ void Actor::migrate(Host* new_host) { - simgrid::simix::kernelImmediate([this, new_host]() { pimpl_->new_host = new_host; }); + simgrid::simix::kernelImmediate([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 + simgrid::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."); + exec->migrate(new_host); + } + SIMIX_process_change_host(this->pimpl_, new_host); + }); } s4u::Host* Actor::getHost() @@ -111,12 +132,17 @@ aid_t Actor::getPpid() void Actor::suspend() { + if (TRACE_actor_is_enabled()) + simgrid::instr::Container::byName(instr_pid(this))->getState("MSG_PROCESS_STATE")->pushEvent("suspend"); + simcall_process_suspend(pimpl_); } void Actor::resume() { simgrid::simix::kernelImmediate([this] { pimpl_->resume(); }); + if (TRACE_actor_is_enabled()) + simgrid::instr::Container::byName(instr_pid(this))->getState("MSG_PROCESS_STATE")->popEvent(); } int Actor::isSuspended() @@ -333,6 +359,10 @@ Host* getHost() void suspend() { + if (TRACE_actor_is_enabled()) + instr::Container::byName(getName() + "-" + std::to_string(getPid())) + ->getState("MSG_PROCESS_STATE") + ->pushEvent("suspend"); simcall_process_suspend(SIMIX_process_self()); } @@ -340,6 +370,9 @@ void resume() { smx_actor_t process = SIMIX_process_self(); simgrid::simix::kernelImmediate([process] { process->resume(); }); + + if (TRACE_actor_is_enabled()) + instr::Container::byName(getName() + "-" + std::to_string(getPid()))->getState("MSG_PROCESS_STATE")->popEvent(); } bool isSuspended() @@ -359,10 +392,13 @@ void onExit(int_f_pvoid_pvoid_t fun, void* data) simcall_process_on_exit(SIMIX_process_self(), fun, data); } +/** @brief Moves the current actor to another host + * + * @see simgrid::s4u::Actor::migrate() for more information + */ void migrate(Host* new_host) { - smx_actor_t process = SIMIX_process_self(); - simgrid::simix::kernelImmediate([process, new_host] { process->new_host = new_host; }); + SIMIX_process_self()->iface()->migrate(new_host); } } }