Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
First bricks for auto_restart support in SIMIX/MSG.
[simgrid.git] / src / msg / msg_process.c
index 2c03e8d..8da8fac 100644 (file)
@@ -53,8 +53,8 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc)
 
   // remove the process from its virtual machine
   if (msg_proc->vm) {
-       int pos = xbt_dynar_search(msg_proc->vm->processes,&smx_proc);
-       xbt_dynar_remove_at(msg_proc->vm->processes,pos, NULL);
+    int pos = xbt_dynar_search(msg_proc->vm->processes,&smx_proc);
+    xbt_dynar_remove_at(msg_proc->vm->processes,pos, NULL);
   }
 
   // free the MSG process
@@ -65,13 +65,16 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc)
 void MSG_process_create_from_SIMIX(smx_process_t* process, const char *name,
                                     xbt_main_func_t code, void *data,
                                     const char *hostname, double kill_time, int argc, char **argv,
-                                    xbt_dict_t properties)
+                                    xbt_dict_t properties, int auto_restart)
 {
   m_host_t host = MSG_get_host_by_name(hostname);
   m_process_t p = MSG_process_create_with_environment(name, code, data,
                                                       host, argc, argv,
                                                       properties);
-  MSG_process_set_kill_time(p,kill_time);
+  if (p) {
+    MSG_process_set_kill_time(p,kill_time);
+    MSG_process_auto_restart_set(p,auto_restart);
+  }
   *((m_process_t*) process) = p;
 }
 
@@ -177,12 +180,11 @@ m_process_t MSG_process_create_with_environment(const char *name,
 
 #ifdef HAVE_TRACING
   TRACE_msg_process_create(name, simdata->PID, simdata->m_host);
-#endif
-
+  #endif
   /* Let's create the process: SIMIX may decide to start it right now,
    * even before returning the flow control to us */
   simcall_process_create(&process, name, code, simdata, SIMIX_host_get_name(host->smx_host), -1,
-                           argc, argv, properties);
+                           argc, argv, properties,0);
 
   if (!process) {
     /* Undo everything we have just changed */
@@ -190,18 +192,14 @@ m_process_t MSG_process_create_with_environment(const char *name,
     xbt_free(simdata);
     return NULL;
   }
-
+  else {
+    #ifdef HAVE_TRACING
+    simcall_process_on_exit(process,(int_f_pvoid_t)TRACE_msg_process_kill,MSG_process_self());
+    #endif
+  }
   return process;
 }
 
-void MSG_process_kill_from_SIMIX(smx_process_t p)
-{
-#ifdef HAVE_TRACING
-  TRACE_msg_process_kill(p);
-#endif
-  MSG_process_kill(p);
-}
-
 /** \ingroup m_process_management
  * \param process poor victim
  *
@@ -209,10 +207,6 @@ void MSG_process_kill_from_SIMIX(smx_process_t p)
  */
 void MSG_process_kill(m_process_t process)
 {
-#ifdef HAVE_TRACING
-  TRACE_msg_process_kill(process);
-#endif
-
 //  /* FIXME: why do we only cancel communication actions? is this useful? */
 //  simdata_process_t p_simdata = simcall_process_get_data(process);
 //  if (p_simdata->waiting_task && p_simdata->waiting_task->simdata->comm) {
@@ -312,7 +306,7 @@ m_host_t MSG_process_get_host(m_process_t process)
  */
 m_process_t MSG_process_from_PID(int PID)
 {
-       return SIMIX_process_from_PID(PID);
+  return SIMIX_process_from_PID(PID);
 }
 
 /** @brief returns a list of all currently existing processes */
@@ -488,3 +482,21 @@ int MSG_process_is_suspended(m_process_t process)
 smx_context_t MSG_process_get_smx_ctx(m_process_t process) {
   return SIMIX_process_get_context(process);
 }
+/**
+ * \ingroup m_process_management
+ * \brief Add a function to the list of "on_exit" functions for the current process.
+ * The on_exit functions are the functions executed when your process is killed.
+ * You should use them to free the data used by your process.
+ */
+void MSG_process_on_exit(int_f_pvoid_t fun, void *data) {
+  simcall_process_on_exit(MSG_process_self(),fun,data);
+}
+/**
+ * \ingroup m_process_management
+ * \brief Sets the "auto-restart" flag of the process.
+ * If the flag is set to 1, the process will be automatically restarted when
+ * its host comes back up.
+ */
+XBT_PUBLIC(void) MSG_process_auto_restart_set(m_process_t process, int auto_restart) {
+  simcall_process_auto_restart_set(process,auto_restart);
+}