ActorPtr Actor::createActor(const char* name, s4u::Host* host, std::function<void()> code)
{
- simgrid::simix::ActorImpl* actor = simcall_process_create(name, std::move(code), nullptr, host, nullptr);
+ simgrid::kernel::actor::ActorImpl* actor = simcall_process_create(name, std::move(code), nullptr, host, nullptr);
return actor->iface();
}
{
simgrid::simix::ActorCodeFactory& factory = SIMIX_get_actor_code_factory(function);
simgrid::simix::ActorCode code = factory(std::move(args));
- simgrid::simix::ActorImpl* actor = simcall_process_create(name, std::move(code), nullptr, host, nullptr);
+ simgrid::kernel::actor::ActorImpl* actor = simcall_process_create(name, std::move(code), nullptr, host, nullptr);
return actor->iface();
}
*/
void Actor::migrate(Host* new_host)
{
+ std::string key;
+ simgrid::instr::LinkType* link = nullptr;
+ if (TRACE_actor_is_enabled()) {
+ static long long int counter = 0;
+
+ key = std::to_string(counter);
+ counter++;
+
+ // start link
+ container_t actor_container = simgrid::instr::Container::byName(instr_pid(this));
+ link = simgrid::instr::Container::getRoot()->getLink("ACTOR_LINK");
+ link->startEvent(actor_container, "M", key);
+
+ // destroy existing container of this process
+ actor_container->removeFromParent();
+ }
+
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.
}
SIMIX_process_change_host(this->pimpl_, new_host);
});
+
+ if (TRACE_actor_is_enabled()) {
+ // create new container on the new_host location
+ simgrid::instr::Container::byName(new_host->getName())->createChild(instr_pid(this), "ACTOR");
+ // end link
+ link->endEvent(simgrid::instr::Container::byName(instr_pid(this)), "M", key);
+ }
}
s4u::Host* Actor::getHost()
void Actor::suspend()
{
if (TRACE_actor_is_enabled())
- simgrid::instr::Container::byName(instr_pid(this))->getState("MSG_PROCESS_STATE")->pushEvent("suspend");
+ simgrid::instr::Container::byName(instr_pid(this))->getState("ACTOR_STATE")->pushEvent("suspend");
simcall_process_suspend(pimpl_);
}
{
simgrid::simix::kernelImmediate([this] { pimpl_->resume(); });
if (TRACE_actor_is_enabled())
- simgrid::instr::Container::byName(instr_pid(this))->getState("MSG_PROCESS_STATE")->popEvent();
+ simgrid::instr::Container::byName(instr_pid(this))->getState("ACTOR_STATE")->popEvent();
}
int Actor::isSuspended()
void suspend()
{
if (TRACE_actor_is_enabled())
- instr::Container::byName(getName() + "-" + std::to_string(getPid()))
- ->getState("MSG_PROCESS_STATE")
- ->pushEvent("suspend");
+ instr::Container::byName(getName() + "-" + std::to_string(getPid()))->getState("ACTOR_STATE")->pushEvent("suspend");
simcall_process_suspend(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();
+ instr::Container::byName(getName() + "-" + std::to_string(getPid()))->getState("ACTOR_STATE")->popEvent();
}
bool isSuspended()
{
SIMIX_process_self()->iface()->migrate(new_host);
}
+
} // namespace this_actor
} // namespace s4u
} // namespace simgrid
/* **************************** Public C interface *************************** */
-SG_BEGIN_DECL()
+
/** \ingroup m_actor_management
* \brief Returns the process ID of \a actor.
*
actor->daemonize();
}
-SG_END_DECL()
+/** \ingroup m_actor_management
+ * \brief Migrates an actor to another location.
+ *
+ * This function changes the value of the #sg_host_t on which \a actor is running.
+ */
+void sg_actor_migrate(sg_actor_t process, sg_host_t host)
+{
+ process->migrate(host);
+}
+
+/** \ingroup m_actor_management
+* \brief Wait for the completion of a #sg_actor_t.
+*
+* \param actor the actor to wait for
+* \param timeout wait until the actor is over, or the timeout expires
+*/
+void sg_actor_join(sg_actor_t actor, double timeout)
+{
+ actor->join(timeout);
+}
+
+void sg_actor_kill(sg_actor_t actor)
+{
+ actor->kill();
+}
+
+/** \ingroup m_actor_management
+ * \brief Set the kill time of an actor.
+ *
+ * \param actor an actor
+ * \param kill_time the time when the actor is killed.
+ */
+void sg_actor_set_kill_time(sg_actor_t actor, double kill_time)
+{
+ actor->setKillTime(kill_time);
+}