From: thiery Date: Mon, 21 Feb 2011 13:10:54 +0000 (+0000) Subject: Allow MSG_process_cleanup(p) to be called by other processes than p X-Git-Tag: v3.6_beta2~271 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/ccd47bd5695175720f504772d3b2dfd517075639 Allow MSG_process_cleanup(p) to be called by other processes than p git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9672 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/simix/simix.h b/include/simix/simix.h index 458f61ad97..b0911f6466 100644 --- a/include/simix/simix.h +++ b/include/simix/simix.h @@ -60,7 +60,6 @@ XBT_PUBLIC(void) SIMIX_host_self_set_data(void *data); XBT_PUBLIC(void*) SIMIX_host_self_get_data(void); /********************************* Process ************************************/ -XBT_PUBLIC(void) SIMIX_process_cleanup(smx_process_t arg); XBT_PUBLIC(int) SIMIX_process_count(void); XBT_INLINE XBT_PUBLIC(smx_process_t) SIMIX_process_self(void); XBT_PUBLIC(const char*) SIMIX_process_self_get_name(void); @@ -128,7 +127,7 @@ XBT_PUBLIC(void) SIMIX_req_process_create(smx_process_t *process, XBT_PUBLIC(void) SIMIX_req_process_kill(smx_process_t process); /* Process handling */ -XBT_PUBLIC(void) SIMIX_req_process_cleanup(void *arg); /* FIXME: This function shouldn't be called from outside SIMIX */ +XBT_PUBLIC(void) SIMIX_req_process_cleanup(smx_process_t process); XBT_PUBLIC(void) SIMIX_req_process_change_host(smx_process_t process, const char *source, const char *dest); XBT_PUBLIC(void) SIMIX_req_process_suspend(smx_process_t process); diff --git a/src/msg/m_process.c b/src/msg/m_process.c index 47cef63a83..ba8115e874 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -28,13 +28,16 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg, /******************************** Process ************************************/ void __MSG_process_cleanup(smx_process_t smx_proc) { - /* This function should be always be executed by the process being - * cleaned up */ - if(smx_proc != SIMIX_process_self()) - THROW_IMPOSSIBLE; - /* arg is no longer used, just kept to avoid changing the interface */ - m_process_t proc = SIMIX_process_self_get_data(); + m_process_t proc; + + if (smx_proc == SIMIX_process_self()) { + /* avoid a SIMIX request if this function is called by the process itself */ + proc = SIMIX_process_self_get_data(); + } + else { + proc = SIMIX_req_process_get_data(smx_proc); + } #ifdef HAVE_TRACING TRACE_msg_process_end(proc); @@ -43,7 +46,8 @@ void __MSG_process_cleanup(smx_process_t smx_proc) if (msg_global) xbt_swag_remove(proc, msg_global->process_list); - SIMIX_process_cleanup(smx_proc); + SIMIX_req_process_cleanup(smx_proc); + if (proc->name) { free(proc->name); proc->name = NULL; diff --git a/src/simix/process_private.h b/src/simix/process_private.h index e6f89a91a1..7a265549e2 100644 --- a/src/simix/process_private.h +++ b/src/simix/process_private.h @@ -56,6 +56,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t killer); void SIMIX_process_killall(void); smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args); void SIMIX_create_maestro_process(void); +void SIMIX_process_cleanup(smx_process_t arg); void SIMIX_process_empty_trash(void); void SIMIX_process_yield(void); xbt_running_ctx_t *SIMIX_process_get_running_context(void); diff --git a/src/simix/smurf_private.h b/src/simix/smurf_private.h index c580320aac..97cbbd83e6 100644 --- a/src/simix/smurf_private.h +++ b/src/simix/smurf_private.h @@ -32,6 +32,7 @@ SIMIX_REQ_ENUM_ELEMENT(REQ_HOST_EXECUTION_SET_PRIORITY),\ SIMIX_REQ_ENUM_ELEMENT(REQ_HOST_EXECUTION_WAIT),\ SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_CREATE),\ SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_KILL),\ +SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_CLEANUP),\ SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_CHANGE_HOST),\ SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_SUSPEND),\ SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_RESUME),\ @@ -225,6 +226,10 @@ typedef struct s_smx_req { smx_process_t process; } process_kill; + struct { + smx_process_t process; + } process_cleanup; + struct { smx_process_t process; const char *source; diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index d92bfdc6c0..fb7d994f21 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -366,6 +366,11 @@ void SIMIX_request_pre(smx_req_t req, int value) SIMIX_request_answer(req); break; + case REQ_PROCESS_CLEANUP: + SIMIX_process_cleanup(req->process_cleanup.process); + SIMIX_request_answer(req); + break; + case REQ_PROCESS_CHANGE_HOST: SIMIX_process_change_host( req->process_change_host.process, diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index e27464e046..78460582f9 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -345,6 +345,18 @@ void SIMIX_req_process_kill(smx_process_t process) SIMIX_request_push(); } +/** \brief Cleans up a SIMIX process. + * \param process poor victim + */ +void SIMIX_req_process_cleanup(smx_process_t process) +{ + smx_req_t req = SIMIX_req_mine(); + + req->call = REQ_PROCESS_CLEANUP; + req->process_cleanup.process = process; + SIMIX_request_push(); +} + /** * \brief Migrates an agent to another location. *