From bc0c0b491241f28c083c4b6540944ed604242ba2 Mon Sep 17 00:00:00 2001 From: mquinson Date: Wed, 11 Jul 2007 11:36:03 +0000 Subject: [PATCH] More cleanups in simix and friends. Do not request users to pass a cleanup function to SIMIX_process_create. Instead, provide a SIMIX_function_register_process_cleanup function to set this globally git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3731 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/gras/Virtu/sg_process.c | 3 +-- src/include/simix/datatypes.h | 2 -- src/include/simix/simix.h | 6 ++---- src/java/jmsg.c | 1 - src/msg/deployment.c | 2 ++ src/msg/m_process.c | 3 +-- src/simix/private.h | 1 + src/simix/smx_deployment.c | 2 +- src/simix/smx_global.c | 21 +++++++++++++++------ src/simix/smx_process.c | 29 +++++++---------------------- 10 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/gras/Virtu/sg_process.c b/src/gras/Virtu/sg_process.c index 6f09110c0e..f985c86f31 100644 --- a/src/gras/Virtu/sg_process.c +++ b/src/gras/Virtu/sg_process.c @@ -24,8 +24,7 @@ void gras_agent_spawn(const char *name, void *data, SIMIX_process_create(name, code, data, gras_os_myname(), - argc, argv, - /* no cleanup, thx, users will call gras_exit() */NULL); + argc, argv); } /* ************************************************************************** diff --git a/src/include/simix/datatypes.h b/src/include/simix/datatypes.h index 93ddc97357..a3fb79559f 100644 --- a/src/include/simix/datatypes.h +++ b/src/include/simix/datatypes.h @@ -69,14 +69,12 @@ typedef struct s_smx_simdata_process *smx_simdata_process_t; @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; /** @} */ diff --git a/src/include/simix/simix.h b/src/include/simix/simix.h index 5e2e97b6ca..93cc3b7078 100644 --- a/src/include/simix/simix.h +++ b/src/include/simix/simix.h @@ -52,8 +52,8 @@ typedef void *(smx_creation_func_t)(/*name*/ const char *, /* 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 ***********************************/ @@ -77,14 +77,12 @@ XBT_PUBLIC(int) SIMIX_host_get_state(smx_host_t host); /************************** 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); diff --git a/src/java/jmsg.c b/src/java/jmsg.c index 0e539af967..ed3e9d9af1 100644 --- a/src/java/jmsg.c +++ b/src/java/jmsg.c @@ -114,7 +114,6 @@ Java_simgrid_msg_Msg_processCreate(JNIEnv* env, jclass cls, jobject jprocess_arg 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); diff --git a/src/msg/deployment.c b/src/msg/deployment.c index 4e05ed1465..b5d903bb51 100644 --- a/src/msg/deployment.c +++ b/src/msg/deployment.c @@ -32,7 +32,9 @@ void MSG_launch_application(const char *file) 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; diff --git a/src/msg/m_process.c b/src/msg/m_process.c index 96a8e4593b..baf331655a 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -107,8 +107,7 @@ m_process_t MSG_process_create_with_arguments(const char *name, 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); diff --git a/src/simix/private.h b/src/simix/private.h index 2c70b1eaaa..bafad3ecf9 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -40,6 +40,7 @@ typedef struct SIMIX_Global { 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; diff --git a/src/simix/smx_deployment.c b/src/simix/smx_deployment.c index afdc09d1af..055172d949 100644 --- a/src/simix/smx_deployment.c +++ b/src/simix/smx_deployment.c @@ -71,7 +71,7 @@ static void parse_process_finalize(void) 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) diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index 81f097b3b4..b4eed5c05d 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -40,6 +40,7 @@ void SIMIX_global_init(int *argc, char **argv) simix_global->create_process_function = NULL; simix_global->kill_process_function = NULL; + simix_global->cleanup_process_function = NULL; } } @@ -277,7 +278,7 @@ double SIMIX_solve(xbt_fifo_t actions_done, xbt_fifo_t actions_failed) 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, @@ -358,10 +359,7 @@ void SIMIX_function_register_process_create(smx_creation_func_t* function) { xbt_assert0((simix_global->create_process_function == NULL), "Data already set"); - /* Assign create process */ simix_global->create_process_function = function; - - return ; } /** @@ -375,8 +373,19 @@ void SIMIX_function_register_process_kill(void_f_pvoid_t* function) { 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; } diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 9b9fc843c9..915bc2bd28 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -51,8 +51,7 @@ void SIMIX_process_cleanup(void *arg) */ 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); @@ -67,16 +66,9 @@ smx_process_t SIMIX_process_create(const char *name, 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); @@ -107,7 +99,6 @@ smx_process_t SIMIX_process_create(const char *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); @@ -139,15 +130,9 @@ void SIMIX_jprocess_create(const char *name, smx_host_t host, 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); -- 2.20.1