Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cleanups: there is no random in the platforms since a while
[simgrid.git] / src / msg / msg_process.cpp
index e0681b1..ab3bc9b 100644 (file)
@@ -8,6 +8,7 @@
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "src/simix/smx_process_private.h"
+#include "src/simix/smx_private.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg,
                                 "Logging specific to MSG (process)");
@@ -41,7 +42,7 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc)
     simcall_process_set_data(smx_proc, NULL);
   }
 
-  TRACE_msg_process_end(smx_proc);
+  TRACE_msg_process_destroy(smx_proc->name, smx_proc->pid);
   // free the data if a function was provided
   if (msg_proc && msg_proc->data && msg_global->process_data_cleanup) {
     msg_global->process_data_cleanup(msg_proc->data);
@@ -166,11 +167,9 @@ msg_process_t MSG_process_create_with_environment(const char *name,
 
   /* Let's create the process: SIMIX may decide to start it right now,
    * even before returning the flow control to us */
- process = simcall_process_create(name, code, simdata, sg_host_get_name(host), -1,
 process = simcall_process_create(name, code, simdata, sg_host_get_name(host), -1,
                            argc, argv, properties,0);
 
-  TRACE_msg_process_create(name, SIMIX_process_get_PID(process), host);
-
   if (!process) {
     /* Undo everything we have just changed */
     xbt_free(simdata);
@@ -182,6 +181,59 @@ msg_process_t MSG_process_create_with_environment(const char *name,
   return process;
 }
 
+static
+int MSG_maestro(int argc, char** argv)
+{
+  int res = MSG_main();
+  return res;
+}
+
+/* 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 != NULL, "Invalid parameters: host and code params must not be NULL");
+  simdata_process_t simdata = xbt_new0(s_simdata_process_t, 1);
+  msg_process_t process;
+
+  /* Simulator data for MSG */
+  simdata->waiting_action = NULL;
+  simdata->waiting_task = NULL;
+  simdata->m_host = host;
+  simdata->argc = 0;
+  simdata->argv = NULL;
+  simdata->data = data;
+  simdata->last_errno = MSG_OK;
+
+  /* Let's create the process: SIMIX may decide to start it right now,
+   * even before returning the flow control to us */
+  process = SIMIX_process_attach(name, simdata, sg_host_get_name(host), properties, NULL);
+  if (!process)
+    xbt_die("Could not attach");
+  simcall_process_on_exit(process,(int_f_pvoid_pvoid_t)TRACE_msg_process_kill,process);
+  return process;
+}
+
+/** 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(void)
+{
+  SIMIX_process_detach();
+}
+
 /** \ingroup m_process_management
  * \param process poor victim
  *