Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
added MPI_Get_processor_name()
[simgrid.git] / src / simix / smx_process.c
index 32f2537..0e92bfc 100644 (file)
@@ -21,7 +21,7 @@ void SIMIX_process_cleanup(void *arg)
 {
   xbt_swag_remove(arg, simix_global->process_to_run);
   xbt_swag_remove(arg, simix_global->process_list);
-  xbt_swag_remove(arg, ((smx_process_t)arg)->smx_host->process_list);
+  xbt_swag_remove(arg, ((smx_process_t) arg)->smx_host->process_list);
   xbt_swag_insert(arg, simix_global->process_to_destroy);
 }
 
@@ -32,15 +32,17 @@ void SIMIX_process_cleanup(void *arg)
  * that have finished (or killed).
  */
 void SIMIX_process_empty_trash(void)
-{ 
+{
   smx_process_t process = NULL;
 
-  while ((process = xbt_swag_extract(simix_global->process_to_destroy))){
+  while ((process = xbt_swag_extract(simix_global->process_to_destroy))) {
     SIMIX_context_free(process->context);
 
     /* Free the exception allocated at creation time */
     if (process->exception)
       free(process->exception);
+    if (process->properties)
+      xbt_dict_free(&process->properties);
 
     free(process->name);
     process->name = NULL;
@@ -57,11 +59,11 @@ void SIMIX_create_maestro_process()
   process = xbt_new0(s_smx_process_t, 1);
 
   /* Process data */
-  process->name = (char *)"";
+  process->name = (char *) "";
 
   process->exception = xbt_new(ex_ctx_t, 1);
   XBT_CTX_INITIALIZE(process->exception);
-  
+
   /* Create a dummy context for maestro */
   process->context = SIMIX_context_new(NULL, 0, NULL, NULL, NULL);
 
@@ -111,9 +113,9 @@ smx_process_t SIMIX_process_create(const char *name,
   process->cond = NULL;
   process->iwannadie = 0;
   process->data = data;
-  
+
   VERB1("Create context %s", process->name);
-  process->context = SIMIX_context_new(code, argc, argv, 
+  process->context = SIMIX_context_new(code, argc, argv,
                                        simix_global->cleanup_process_function,
                                        process);
 
@@ -128,7 +130,7 @@ smx_process_t SIMIX_process_create(const char *name,
 
   DEBUG1("Start context '%s'", process->name);
   SIMIX_context_start(process->context);
-   
+
   /* Now insert it in the global process list and in the process to run list */
   xbt_swag_insert(process, simix_global->process_list);
   DEBUG2("Inserting %s(%s) in the to_run list", process->name, host->name);
@@ -147,23 +149,47 @@ void SIMIX_process_kill(smx_process_t process)
 {
   DEBUG2("Killing process %s on %s", process->name, process->smx_host->name);
 
-  /* Cleanup if we were waiting for something */
-  if (process->mutex)
-    xbt_swag_remove(process, process->mutex->sleeping);
-
-  if (process->cond)
-    xbt_swag_remove(process, process->cond->sleeping);
-
-  DEBUG2("%p here! killing %p", simix_global->current_process, process);
-
   process->iwannadie = 1;
 
-  /* If I'm killing myself then stop otherwise schedule the process to kill */
-  if (process == SIMIX_process_self())
+  /* If I'm killing myself then stop otherwise schedule the process to kill
+   * Two different behaviors, if I'm killing my self, remove from mutex and condition and stop. Otherwise, first we must schedule the process, wait its ending and after remove it from mutex and condition */
+  if (process == SIMIX_process_self()) {
+    /* Cleanup if we were waiting for something */
+    if (process->mutex)
+      xbt_swag_remove(process, process->mutex->sleeping);
+
+    if (process->cond)
+      xbt_swag_remove(process, process->cond->sleeping);
+    if (process->waiting_action) {
+      SIMIX_unregister_action_to_condition(process->waiting_action, process->cond);
+      SIMIX_action_destroy(process->waiting_action);
+    }
     SIMIX_context_stop(process->context);
-  else
+  } else {
+    DEBUG2("%p here! killing %p", simix_global->current_process, process);
     SIMIX_process_schedule(process);
-  
+    /* Cleanup if we were waiting for something */
+    if (process->mutex)
+      xbt_swag_remove(process, process->mutex->sleeping);
+
+    if (process->cond) {
+      xbt_swag_remove(process, process->cond->sleeping);
+
+      if (process->waiting_action) {
+        SIMIX_unregister_action_to_condition(process->waiting_action, process->cond);
+        SIMIX_action_destroy(process->waiting_action);
+      }
+    }
+
+    if (process->sem) {
+       xbt_swag_remove(process, process->sem->sleeping);
+
+      if (process->waiting_action) {
+       SIMIX_unregister_action_to_semaphore(process->waiting_action, process->sem);
+       SIMIX_action_destroy(process->waiting_action);
+      }
+    }
+  }
 }
 
 /**
@@ -173,7 +199,7 @@ void SIMIX_process_kill(smx_process_t process)
  * \param process SIMIX process
  * \return A void pointer to the user data
  */
-void *SIMIX_process_get_data(smx_process_t process)
+XBT_INLINE void *SIMIX_process_get_data(smx_process_t process)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
   return (process->data);
@@ -186,7 +212,7 @@ void *SIMIX_process_get_data(smx_process_t process)
  * \param process SIMIX process
  * \param data User data
  */
-void SIMIX_process_set_data(smx_process_t process, void *data)
+XBT_INLINE void SIMIX_process_set_data(smx_process_t process, void *data)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
 
@@ -201,7 +227,7 @@ void SIMIX_process_set_data(smx_process_t process, void *data)
  * \param process SIMIX process
  * \return SIMIX host
  */
-smx_host_t SIMIX_process_get_host(smx_process_t process)
+XBT_INLINE smx_host_t SIMIX_process_get_host(smx_process_t process)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
   return (process->smx_host);
@@ -214,7 +240,7 @@ smx_host_t SIMIX_process_get_host(smx_process_t process)
  * \param process SIMIX process
  * \return The process name
  */
-const char *SIMIX_process_get_name(smx_process_t process)
+XBT_INLINE const char *SIMIX_process_get_name(smx_process_t process)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
   return (process->name);
@@ -227,7 +253,7 @@ const char *SIMIX_process_get_name(smx_process_t process)
  * \param process SIMIX process
  * \param name The new process name
  */
-void SIMIX_process_set_name(smx_process_t process, char *name)
+XBT_INLINE void SIMIX_process_set_name(smx_process_t process, char *name)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
   process->name = name;
@@ -238,7 +264,7 @@ void SIMIX_process_set_name(smx_process_t process, char *name)
  *
  * This functions returns the properties associated with this process
  */
-xbt_dict_t SIMIX_process_get_properties(smx_process_t process)
+XBT_INLINE xbt_dict_t SIMIX_process_get_properties(smx_process_t process)
 {
   return process->properties;
 }
@@ -249,7 +275,7 @@ xbt_dict_t SIMIX_process_get_properties(smx_process_t process)
  * This functions returns the currently running #smx_process_t.
  * \return The SIMIX process
  */
-smx_process_t SIMIX_process_self(void)
+XBT_INLINE smx_process_t SIMIX_process_self(void)
 {
   return simix_global ? simix_global->current_process : NULL;
 }
@@ -282,7 +308,7 @@ void SIMIX_process_suspend(smx_process_t process)
       process->suspended = 1;
       c = process->cond;
       xbt_fifo_foreach(c->actions, i, act, smx_action_t) {
-        surf_workstation_model->suspend(act->surf_action);
+        surf_workstation_model->suspend(act->surf_action);
       }
     } else {
       process->suspended = 1;
@@ -296,9 +322,11 @@ void SIMIX_process_suspend(smx_process_t process)
 
     cond = SIMIX_cond_init();
     dummy = SIMIX_action_execute(SIMIX_process_get_host(process), name, 0);
+    SIMIX_process_self()->waiting_action = dummy;
     surf_workstation_model->suspend(dummy->surf_action);
     SIMIX_register_action_to_condition(dummy, cond);
     __SIMIX_cond_wait(cond);
+    SIMIX_process_self()->waiting_action = NULL;
     SIMIX_unregister_action_to_condition(dummy, cond);
     SIMIX_action_destroy(dummy);
     SIMIX_cond_destroy(cond);
@@ -348,7 +376,8 @@ void SIMIX_process_resume(smx_process_t process)
  *
  * This function changes the value of the host on which \a process is running.
  */
-void SIMIX_process_change_host(smx_process_t process, char *source, char *dest)
+void SIMIX_process_change_host(smx_process_t process, char *source,
+                               char *dest)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
   smx_host_t h1 = SIMIX_host_get_by_name(source);
@@ -365,7 +394,7 @@ void SIMIX_process_change_host(smx_process_t process, char *source, char *dest)
  * \param process SIMIX process
  * \return 1, if the process is suspended, else 0.
  */
-int SIMIX_process_is_suspended(smx_process_t process)
+XBT_INLINE int SIMIX_process_is_suspended(smx_process_t process)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
 
@@ -377,7 +406,7 @@ int SIMIX_process_is_suspended(smx_process_t process)
  *
  * Maestro internal process is not counted, only user code processes are
  */
-int SIMIX_process_count()
+XBT_INLINE int SIMIX_process_count()
 {
   return xbt_swag_size(simix_global->process_list);
 }
@@ -393,8 +422,9 @@ int SIMIX_process_count()
 void SIMIX_process_yield(void)
 {
   DEBUG1("Yield process '%s'", simix_global->current_process->name);
-  xbt_assert0((simix_global->current_process != simix_global->maestro_process),
-              "You are not supposed to run this function here!");
+  xbt_assert0((simix_global->current_process !=
+               simix_global->maestro_process),
+              "You are not supposed to run this function in maestro context!");
 
   SIMIX_context_suspend(simix_global->current_process->context);
 
@@ -414,6 +444,7 @@ void SIMIX_process_schedule(smx_process_t new_process)
 
   /* schedule the context */
   SIMIX_context_resume(old_process->context, new_process->context);
+  DEBUG1("Resumed from scheduling context: '%s'", new_process->name);
 
   /* restore the current process to the previously saved process */
   simix_global->current_process = old_process;
@@ -431,5 +462,3 @@ void SIMIX_process_exception_terminate(xbt_ex_t * e)
   xbt_ex_display(e);
   abort();
 }
-
-