X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7f4f03348bd07609e258eb3b545bdafc2c881847..7d87bd675e40074957819b602f38fb905209990e:/src/msg/msg_process.cpp diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index e0681b1abd..ab3bc9bbe0 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -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 *