Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add a simcall for process_on_exit
authorSamuel Lepetit <samuel.lepetit@inria.fr>
Mon, 25 Jun 2012 11:39:50 +0000 (13:39 +0200)
committerSamuel Lepetit <samuel.lepetit@inria.fr>
Mon, 25 Jun 2012 11:39:50 +0000 (13:39 +0200)
include/simgrid/simix.h
src/msg/msg_process.c
src/simix/smx_smurf.c
src/simix/smx_smurf_private.h
src/simix/smx_user.c

index f541a1b..bdfa009 100644 (file)
@@ -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);
index a37cc6b..5d3c7d4 100644 (file)
@@ -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);
 }
index 4e63e54..0e7ac6c 100644 (file)
@@ -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,
index 083008a..6bc5391 100644 (file)
@@ -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;
index 25f75a3..803a6e6 100644 (file)
@@ -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