Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fighting more memory leaks in Chord
[simgrid.git] / src / simix / smx_process.c
index a9e96fa..7a169dd 100644 (file)
@@ -136,7 +136,7 @@ void SIMIX_process_create(smx_process_t *process,
   else {
     *process = xbt_new0(s_smx_process_t, 1);
 
-    xbt_assert0(((code != NULL) && (host != NULL)), "Invalid parameters");
+    xbt_assert(((code != NULL) && (host != NULL)), "Invalid parameters");
 
     /* Process data */
     (*process)->pid = simix_process_maxpid++;
@@ -166,6 +166,24 @@ void SIMIX_process_create(smx_process_t *process,
   }
 }
 
+/**
+ * \brief Executes the processes from simix_global->process_to_run.
+ *
+ * The processes of simix_global->process_to_run are run (in parallel if
+ * possible).  On exit, simix_global->process_to_run is empty, and
+ * simix_global->process_that_ran contains the list of processes that just ran.
+ * The two lists are swapped so, be careful when using them before and after a
+ * call to this function.
+ */
+void SIMIX_process_runall(void)
+{
+  SIMIX_context_runall(simix_global->process_to_run);
+  xbt_dynar_t tmp = simix_global->process_that_ran;
+  simix_global->process_that_ran = simix_global->process_to_run;
+  simix_global->process_to_run = tmp;
+  xbt_dynar_reset(simix_global->process_to_run);
+}
+
 /**
  * \brief Internal function to kill a SIMIX process.
  *
@@ -182,6 +200,8 @@ void SIMIX_process_kill(smx_process_t process) {
   process->blocked = 0;
   process->suspended = 0;
   /* FIXME: set doexception to 0 also? */
+  /* FIXME: asynchronous communication actions are not destroyed:
+   * another process may find a matching rdv with me after I'm freed */
 
   if (process->waiting_action) {
 
@@ -234,16 +254,17 @@ void SIMIX_process_killall(smx_process_t issuer)
 }
 
 void SIMIX_process_change_host(smx_process_t process,
-    const char *source, const char *dest)
+                              smx_host_t dest)
 {
-  smx_host_t h1 = NULL;
-  smx_host_t h2 = NULL;
-  xbt_assert0((process != NULL), "Invalid parameters");
-  h1 = SIMIX_host_get_by_name(source);
-  h2 = SIMIX_host_get_by_name(dest);
-  process->smx_host = h2;
-  xbt_swag_remove(process, h1->process_list);
-  xbt_swag_insert(process, h2->process_list);
+  xbt_assert((process != NULL), "Invalid parameters");
+  xbt_swag_remove(process, process->smx_host->process_list);
+  process->smx_host = dest;
+  xbt_swag_insert(process, dest->process_list);
+}
+
+void SIMIX_pre_process_change_host(smx_process_t process, smx_host_t dest)
+{
+  process->new_host = dest;
 }
 
 void SIMIX_pre_process_suspend(smx_req_t req)
@@ -291,7 +312,7 @@ void SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
 
 void SIMIX_process_resume(smx_process_t process, smx_process_t issuer)
 {
-  xbt_assert0((process != NULL), "Invalid parameters");
+  xbt_assert((process != NULL), "Invalid parameters");
 
   process->suspended = 0;
 
@@ -476,9 +497,6 @@ void SIMIX_process_sleep_destroy(smx_action_t action)
   XBT_DEBUG("Destroy action %p", action);
   if (action->sleep.surf_sleep)
     action->sleep.surf_sleep->model_type->action_unref(action->sleep.surf_sleep);
-#ifdef HAVE_TRACING
-  TRACE_smx_action_destroy(action);
-#endif
   xbt_mallocator_release(simix_global->action_mallocator, action);
 }
 
@@ -518,6 +536,11 @@ void SIMIX_process_yield(void)
     self->doexception = 0;
     RETHROW;
   }
+  
+  if (self->new_host) {
+    SIMIX_process_change_host(self, self->new_host);
+    self->new_host = NULL;
+  }
 }
 
 /* callback: context fetching */