+
+ simcall_process_on_exit(process, (int_f_pvoid_pvoid_t)TRACE_msg_process_kill, process);
+ return process->ciface();
+}
+
+SG_BEGIN_DECL()
+
+/* Become a process in the simulation
+ *
+ * Currently this can only be called by the main thread (once) and only work with some thread factories
+ * (currently ThreadContextFactory).
+ *
+ * In the future, it might be extended in order to attach other threads created by a third party library.
+ */
+msg_process_t MSG_process_attach(const char *name, void *data, msg_host_t host, xbt_dict_t properties)
+{
+ xbt_assert(host != nullptr, "Invalid parameters: host and code params must not be nullptr");
+
+ /* Let's create the process: SIMIX may decide to start it right now, even before returning the flow control to us */
+ smx_actor_t process = SIMIX_process_attach(name, new simgrid::MsgActorExt(data), host->cname(), properties, nullptr);
+ if (not process)
+ xbt_die("Could not attach");
+ simcall_process_on_exit(process,(int_f_pvoid_pvoid_t)TRACE_msg_process_kill,process);
+ return process->ciface();
+}
+
+/** Detach a process attached with `MSG_process_attach()`
+ *
+ * This is called when the current process has finished its job.
+ * Used in the main thread, it waits for the simulation to finish before returning. When it returns, the other
+ * simulated processes and the maestro are destroyed.
+ */
+void MSG_process_detach()
+{
+ SIMIX_process_detach();