+
+void sg_actor_sleep_for(double duration)
+{
+ simgrid::s4u::this_actor::sleep_for(duration);
+}
+
+void sg_actor_sleep_until(double wakeup_time)
+{
+ simgrid::s4u::this_actor::sleep_until(wakeup_time);
+}
+
+sg_actor_t sg_actor_attach(const char* name, void* data, sg_host_t host, xbt_dict_t properties)
+{
+ xbt_assert(host != nullptr, "Invalid parameters: host and code params must not be nullptr");
+ std::unordered_map<std::string, std::string> props;
+ xbt_dict_cursor_t cursor = nullptr;
+ char* key;
+ char* value;
+ xbt_dict_foreach (properties, cursor, key, value)
+ props[key] = value;
+ xbt_dict_free(&properties);
+
+ /* Let's create the process: SIMIX may decide to start it right now, even before returning the flow control to us */
+ smx_actor_t actor = nullptr;
+ try {
+ actor = simgrid::kernel::actor::ActorImpl::attach(name, data, host, &props).get();
+ } catch (simgrid::HostFailureException const&) {
+ xbt_die("Could not attach");
+ }
+
+ simgrid::s4u::this_actor::yield();
+ return actor->ciface();
+}
+
+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();
+}
+
+void* sg_actor_self_data()
+{
+ return simgrid::s4u::Actor::self()->get_data();
+}
+
+void sg_actor_self_data_set(void* userdata)
+{
+ simgrid::s4u::Actor::self()->set_data(userdata);
+}
+
+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(const_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(const_sg_actor_t actor)
+{
+ intrusive_ptr_release(actor);
+}
+
+/** @brief Return the user data of a #sg_actor_t */
+void* sg_actor_data(const_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);
+}
+/** @brief Add a function to the list of "on_exit" functions for the current process.
+ * The on_exit functions are the functions executed when your process is killed.
+ * You should use them to free the data used by your process.
+ */
+void sg_actor_on_exit(int_f_int_pvoid_t fun, void* data)
+{
+ simgrid::s4u::this_actor::on_exit([fun, data](bool failed) { fun(failed ? 1 /*FAILURE*/ : 0 /*SUCCESS*/, data); });
+}