+namespace simgrid {
+namespace s4u {
+
+// ***** Actor creation *****
+ActorPtr Actor::self()
+{
+ smx_context_t self_context = SIMIX_context_self();
+ if (self_context == nullptr)
+ return simgrid::s4u::ActorPtr();
+
+ return self_context->process()->iface();
+}
+
+ActorPtr Actor::createActor(const char* name, s4u::Host* host, std::function<void()> code)
+{
+ smx_actor_t actor = simcall_process_create(name, std::move(code), nullptr, host, nullptr);
+ return actor->iface();
+}
+
+ActorPtr Actor::createActor(const char* name, s4u::Host* host, const char* function, std::vector<std::string> args)
+{
+ simgrid::simix::ActorCodeFactory& factory = SIMIX_get_actor_code_factory(function);
+ simgrid::simix::ActorCode code = factory(std::move(args));
+ smx_actor_t actor = simcall_process_create(name, std::move(code), nullptr, host, nullptr);
+ return actor->iface();
+}
+
+// ***** Actor methods *****
+
+void Actor::join() {
+ simcall_process_join(this->pimpl_, -1);
+}
+
+void Actor::setAutoRestart(bool autorestart) {
+ simcall_process_auto_restart_set(pimpl_,autorestart);
+}
+
+void Actor::onExit(int_f_pvoid_pvoid_t fun, void* data)
+{
+ simcall_process_on_exit(pimpl_, fun, data);
+}
+
+void Actor::migrate(Host* new_host)
+{
+ simcall_process_set_host(pimpl_, new_host);
+}
+
+s4u::Host* Actor::host()
+{
+ return this->pimpl_->host;
+}
+
+const char* Actor::cname()
+{
+ return this->pimpl_->name.c_str();
+}
+
+simgrid::xbt::string Actor::name()
+{
+ return this->pimpl_->name;
+}
+
+int Actor::pid()
+{
+ return this->pimpl_->pid;
+}
+
+int Actor::ppid()
+{
+ return this->pimpl_->ppid;
+}
+
+void Actor::suspend()
+{
+ simcall_process_suspend(pimpl_);