SIMIX_process_create(name, code,
data,
gras_os_myname(),
- argc, argv,
- /* no cleanup, thx, users will call gras_exit() */NULL);
+ argc, argv);
}
/* **************************************************************************
@ingroup m_datatypes_management_details @{ */
typedef struct s_smx_process {
- /* KEEP IT IN SYNC WITH s_xbt_thread_ from src/xbt_sg_thread.h */
char *name; /**< @brief process name if any */
smx_simdata_process_t simdata; /**< @brief simulator data */
s_xbt_swag_hookup_t process_hookup;
s_xbt_swag_hookup_t synchro_hookup;
s_xbt_swag_hookup_t host_proc_hookup;
void *data; /**< @brief user data */
- /* KEEP IT IN SYNC WITH s_smx_process_ from src/xbt_sg_thread.h */
} s_smx_process_t;
/** @} */
/* argc */ int,
/* argv */ char **);
XBT_PUBLIC(void) SIMIX_function_register_process_create(smx_creation_func_t *function);
-
XBT_PUBLIC(void) SIMIX_function_register_process_kill(void_f_pvoid_t *function);
+XBT_PUBLIC(void) SIMIX_function_register_process_cleanup(void_f_pvoid_t *function);
/************************** Host handling ***********************************/
/************************** Process handling *********************************/
XBT_PUBLIC(smx_process_t) SIMIX_process_create(const char *name,
xbt_main_func_t code, void *data,
- const char * hostname, int argc, char **argv,
- void * clean_process_function);
+ const char * hostname, int argc, char **argv);
XBT_PUBLIC(void) SIMIX_jprocess_create(const char *name,
smx_host_t host,
void *data,
void *jprocess, void *jenv,
- void * clean_process_function,
smx_process_t* res);
XBT_PUBLIC(void) SIMIX_process_kill(smx_process_t process);
process->simdata->m_host->simdata->s_host,
/*data*/ (void*)process,
jprocess_arg,env,
- __MSG_process_cleanup,
&process->simdata->s_process);
DEBUG1("context created (s_process=%p)",process->simdata->s_process);
xbt_assert0(msg_global,"MSG_global_init_args has to be called before MSG_launch_application.");
SIMIX_function_register_process_create(_MSG_process_create_from_SIMIX);
+ SIMIX_function_register_process_cleanup(__MSG_process_cleanup);
SIMIX_function_register_process_kill(_MSG_process_kill_from_SIMIX);
+
SIMIX_launch_application(file);
return;
simdata->argc = argc;
simdata->argv = argv;
simdata->s_process = SIMIX_process_create(name, code,
- (void*)process, host->name, argc, argv,
- __MSG_process_cleanup );
+ (void*)process, host->name, argc, argv);
if (SIMIX_process_self()) {
simdata->PPID = MSG_process_get_PID(SIMIX_process_self()->data);
xbt_dict_t registered_functions;
smx_creation_func_t *create_process_function;
void_f_pvoid_t* kill_process_function;
+ void_f_pvoid_t* cleanup_process_function;
} s_SIMIX_Global_t, *SIMIX_Global_t;
extern SIMIX_Global_t simix_global;
if (simix_global->create_process_function)
process = simix_global->create_process_function(parse_argv[0], parse_code, NULL, parse_host, parse_argc,parse_argv);
else
- process = SIMIX_process_create(parse_argv[0], parse_code, NULL, parse_host, parse_argc,parse_argv, NULL);
+ process = SIMIX_process_create(parse_argv[0], parse_code, NULL, parse_host, parse_argc,parse_argv);
if(kill_time > SIMIX_get_clock()) {
if (simix_global->kill_process_function)
simix_global->create_process_function = NULL;
simix_global->kill_process_function = NULL;
+ simix_global->cleanup_process_function = NULL;
}
}
DEBUG2("Launching %s on %s", args->name, args->hostname);
process = SIMIX_process_create(args->name, args->code,
args->data, args->hostname,
- args->argc,args->argv,NULL);
+ args->argc,args->argv);
if(args->kill_time > SIMIX_get_clock()) {
surf_timer_resource->extension_public->set(args->kill_time,
(void*) &SIMIX_process_kill,
{
xbt_assert0((simix_global->create_process_function == NULL), "Data already set");
- /* Assign create process */
simix_global->create_process_function = function;
-
- return ;
}
/**
{
xbt_assert0((simix_global->kill_process_function == NULL), "Data already set");
- /* Assign kill process */
simix_global->kill_process_function = function;
+}
- return ;
+/**
+ * \brief Registers a function to cleanup a process.
+ *
+ * This function registers an user function to be called when a new process ends properly.
+ * \param function cleanup process function
+ *
+ */
+void SIMIX_function_register_process_cleanup(void_f_pvoid_t* function)
+{
+ xbt_assert0((simix_global->cleanup_process_function == NULL), "Data already set");
+
+ simix_global->cleanup_process_function = function;
}
*/
smx_process_t SIMIX_process_create(const char *name,
xbt_main_func_t code, void *data,
- const char * hostname, int argc, char **argv,
- void * clean_process_function)
+ const char * hostname, int argc, char **argv)
{
smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1);
smx_process_t process = xbt_new0(s_smx_process_t,1);
simdata->cond = NULL;
simdata->argc = argc;
simdata->argv = argv;
- if (clean_process_function) {
- simdata->context = xbt_context_new(code, NULL, NULL,
- clean_process_function, process,
- simdata->argc, simdata->argv);
- }
- else {
- simdata->context = xbt_context_new(code, NULL, NULL,
- SIMIX_process_cleanup, process,
- simdata->argc, simdata->argv);
- }
+ simdata->context = xbt_context_new(code, NULL, NULL,
+ simix_global->cleanup_process_function, process,
+ simdata->argc, simdata->argv);
/* Process structure */
process->name = xbt_strdup(name);
void SIMIX_jprocess_create(const char *name, smx_host_t host,
void *data,
void *jprocess, void *jenv,
- void *clean_process_function,
smx_process_t *res)
{
smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1);
simdata->argc = 0;
simdata->argv = NULL;
- if (clean_process_function) {
- simdata->context = xbt_context_new(NULL, NULL, NULL,
- clean_process_function, process,
- /* argc/argv*/0,NULL);
- } else {
- simdata->context = xbt_context_new(NULL, NULL, NULL,
- SIMIX_process_cleanup, process,
- /* argc/argv*/0,NULL);
- }
+ simdata->context = xbt_context_new(NULL, NULL, NULL,
+ simix_global->cleanup_process_function, process,
+ /* argc/argv*/0,NULL);
/* Process structure */
process->name = xbt_strdup(name);