Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Allow MSG_process_cleanup(p) to be called by other processes than p
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 21 Feb 2011 13:10:54 +0000 (13:10 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 21 Feb 2011 13:10:54 +0000 (13:10 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9672 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/simix/simix.h
src/msg/m_process.c
src/simix/process_private.h
src/simix/smurf_private.h
src/simix/smx_smurf.c
src/simix/smx_user.c

index 458f61a..b0911f6 100644 (file)
@@ -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);
index 47cef63..ba8115e 100644 (file)
@@ -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;
index e6f89a9..7a26554 100644 (file)
@@ -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);
index c580320..97cbbd8 100644 (file)
@@ -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;
index d92bfdc..fb7d994 100644 (file)
@@ -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,
index e27464e..7846058 100644 (file)
@@ -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.
  *