From: Samuel Lepetit Date: Mon, 25 Jun 2012 11:39:50 +0000 (+0200) Subject: Add a simcall for process_on_exit X-Git-Tag: v3_8~469 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/a145185a6729e2829a778ebef14602aff5ee2eda?hp=20801428bec07ed58c348d25ad39878f2c208389 Add a simcall for process_on_exit --- diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index f541a1bb73..bdfa009e86 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -335,6 +335,7 @@ XBT_PUBLIC(const char *) simcall_process_get_name(smx_process_t process); XBT_PUBLIC(int) simcall_process_is_suspended(smx_process_t process); XBT_PUBLIC(xbt_dict_t) simcall_process_get_properties(smx_process_t host); XBT_PUBLIC(void) simcall_process_set_kill_time(smx_process_t process, double kill_time); +XBT_PUBLIC(void) simcall_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data); /* Sleep control */ XBT_PUBLIC(e_smx_state_t) simcall_process_sleep(double duration); diff --git a/src/msg/msg_process.c b/src/msg/msg_process.c index a37cc6b0ce..5d3c7d42e1 100644 --- a/src/msg/msg_process.c +++ b/src/msg/msg_process.c @@ -191,7 +191,7 @@ m_process_t MSG_process_create_with_environment(const char *name, } else { #ifdef HAVE_TRACING - SIMIX_process_on_exit(process,(int_f_pvoid_t)TRACE_msg_process_kill,MSG_process_self()); + simcall_process_on_exit(process,(int_f_pvoid_t)TRACE_msg_process_kill,MSG_process_self()); #endif } return process; @@ -486,5 +486,5 @@ smx_context_t MSG_process_get_smx_ctx(m_process_t process) { * You should use them to free the data used by your process. */ void MSG_process_on_exit(int_f_pvoid_t fun, void *data) { - SIMIX_process_on_exit(MSG_process_self(),fun,data); + simcall_process_on_exit(MSG_process_self(),fun,data); } diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index 4e63e54bea..0e7ac6ce92 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -357,7 +357,12 @@ void SIMIX_simcall_pre(smx_simcall_t simcall, int value) SIMIX_process_get_data(simcall->process_get_data.process); SIMIX_simcall_answer(simcall); break; - + case SIMCALL_PROCESS_ON_EXIT: + SIMIX_process_on_exit(simcall->process_on_exit.process, + simcall->process_on_exit.fun, + simcall->process_on_exit.data); + SIMIX_simcall_answer(simcall); + break; case SIMCALL_PROCESS_SET_DATA: SIMIX_process_set_data( simcall->process_set_data.process, diff --git a/src/simix/smx_smurf_private.h b/src/simix/smx_smurf_private.h index 083008a093..6bc53914be 100644 --- a/src/simix/smx_smurf_private.h +++ b/src/simix/smx_smurf_private.h @@ -45,6 +45,7 @@ SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_NAME),\ SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_IS_SUSPENDED),\ SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_PROPERTIES),\ SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_SLEEP),\ +SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_ON_EXIT),\ SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_CREATE),\ SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_DESTROY),\ SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_GEY_BY_NAME),\ @@ -289,6 +290,12 @@ typedef struct s_smx_simcall { e_smx_state_t result; } process_sleep; + struct { + smx_process_t process; + int_f_pvoid_t fun; + void *data; + } process_on_exit; + struct { const char *name; smx_rdv_t result; diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index 25f75a3df0..803a6e6580 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -609,7 +609,20 @@ xbt_dict_t simcall_process_get_properties(smx_process_t process) SIMIX_simcall_push(simcall->issuer); return simcall->process_get_properties.result; } +/** \ingroup m_process_management + * \brief Add an on_exit function + * Add an on_exit function which will be executed when the process exits/is killed. + */ +XBT_PUBLIC(void) simcall_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data) { + smx_simcall_t simcall = SIMIX_simcall_mine(); + simcall->call = SIMCALL_PROCESS_ON_EXIT; + simcall->process_on_exit.process = process; + simcall->process_on_exit.fun = fun; + simcall->process_on_exit.data = data; + + SIMIX_simcall_push(simcall->issuer); +} /** \brief Creates a new sleep SIMIX action. * * This function creates a SURF action and allocates the data necessary