X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eedb2cc3ca50a8eeb8cd83dc7c01df75e3bf7989..7d87bd675e40074957819b602f38fb905209990e:/src/msg/msg_process.cpp diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index 5d588bdf95..ab3bc9bbe0 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -165,12 +165,6 @@ msg_process_t MSG_process_create_with_environment(const char *name, simdata->data = data; simdata->last_errno = MSG_OK; - /* The TRACE process is created before the SIMIX one - * to avoid issues when SIMIX decides to start the new - * process right now (before returning the flow control). */ - unsigned int next_pid = SIMIX_process_get_maxpid(); - TRACE_msg_process_create(name, next_pid, host); - /* 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, @@ -180,15 +174,66 @@ msg_process_t MSG_process_create_with_environment(const char *name, /* Undo everything we have just changed */ xbt_free(simdata); return NULL; - // FIXME: is the TRACE process destroyed in this case? } else { - xbt_assert(next_pid == process->pid, "Bad trace pid hack"); simcall_process_on_exit(process,(int_f_pvoid_pvoid_t)TRACE_msg_process_kill,process); } 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 *