Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix commit 825fb3d5095e6cce48885d1d04ab1ec3823dae6c
[simgrid.git] / src / simix / smx_process.c
index 009e927..cf9f267 100644 (file)
@@ -118,6 +118,8 @@ void SIMIX_process_empty_trash(void)
 
     xbt_fifo_free(process->comms);
 
+    xbt_dynar_free(&process->on_exit);
+
     free(process->name);
     free(process);
   }
@@ -711,3 +713,28 @@ xbt_dynar_t SIMIX_processes_as_dynar(void) {
   }
   return res;
 }
+void SIMIX_process_on_exit_runall(smx_process_t process) {
+  int cpt;
+  if (!process->on_exit) {
+    return;
+  }
+
+  smx_process_exit_fun_t exit_fun;
+
+  for (cpt = xbt_dynar_length(process->on_exit) - 1; cpt >= 0; cpt--) {
+    exit_fun = xbt_dynar_get_ptr(process->on_exit, cpt);
+    (exit_fun->fun)(exit_fun->arg);
+  }
+}
+void SIMIX_process_on_exit(int_f_pvoid_t fun, void *data) {
+  smx_process_t process = SIMIX_process_self();
+  xbt_assert(process, "current process not found: are you in maestro context ?");
+
+  if (!process->on_exit) {
+    process->on_exit = xbt_dynar_new(sizeof(s_smx_process_exit_fun_t), NULL);
+  }
+
+  s_smx_process_exit_fun_t exit_fun = {fun, data};
+
+  xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun);
+}