Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
reimplement SIMIX_process_kill() without SIMIX_process_schedule() so that the latter...
[simgrid.git] / src / simix / smx_process.c
index 46058f0..677a375 100644 (file)
@@ -41,6 +41,8 @@ void SIMIX_process_empty_trash(void)
     /* 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;
@@ -127,7 +129,6 @@ smx_process_t SIMIX_process_create(const char *name,
   xbt_swag_insert(process, host->process_list);
 
   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);
@@ -162,13 +163,28 @@ void SIMIX_process_kill(smx_process_t process)
       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);
+      }
+    }
+
     SIMIX_context_stop(process->context);
+
   } 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)
+    DEBUG4("%s(%p) here! killing %s(%p) %s",
+        simix_global->current_process->name,simix_global->current_process,
+        process->name,process);
+
+    /* Cleanup if it were waiting for something */
+    if (process->mutex) {
       xbt_swag_remove(process, process->mutex->sleeping);
+      process->mutex = NULL;
+    }
 
     if (process->cond) {
       xbt_swag_remove(process, process->cond->sleeping);
@@ -177,6 +193,7 @@ void SIMIX_process_kill(smx_process_t process)
         SIMIX_unregister_action_to_condition(process->waiting_action, process->cond);
         SIMIX_action_destroy(process->waiting_action);
       }
+      process->cond = NULL;
     }
 
     if (process->sem) {
@@ -186,7 +203,13 @@ void SIMIX_process_kill(smx_process_t process)
        SIMIX_unregister_action_to_semaphore(process->waiting_action, process->sem);
        SIMIX_action_destroy(process->waiting_action);
       }
+      process->sem = NULL;
     }
+
+    /* make sure that the process gets awake soon enough, now that we've set its iwannadie to 1 */
+    process->blocked = 0;
+    process->suspended = 0;
+    xbt_swag_insert(process, simix_global->process_to_run);
   }
 }
 
@@ -197,7 +220,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);
@@ -210,7 +233,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");
 
@@ -225,7 +248,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);
@@ -238,7 +261,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);
@@ -251,7 +274,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;
@@ -262,7 +285,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;
 }
@@ -273,7 +296,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;
 }
@@ -392,7 +415,7 @@ void SIMIX_process_change_host(smx_process_t process, char *source,
  * \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");
 
@@ -404,7 +427,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);
 }
@@ -424,7 +447,10 @@ void SIMIX_process_yield(void)
                simix_global->maestro_process),
               "You are not supposed to run this function in maestro context!");
 
+
+  /* Go into sleep and return control to maestro */
   SIMIX_context_suspend(simix_global->current_process->context);
+  /* Ok, maestro returned control to us */
 
   if (simix_global->current_process->iwannadie)
     SIMIX_context_stop(simix_global->current_process->context);
@@ -432,19 +458,19 @@ void SIMIX_process_yield(void)
 
 void SIMIX_process_schedule(smx_process_t new_process)
 {
+  xbt_assert0(simix_global->current_process == simix_global->maestro_process,
+      "This function can only be called from maestro context");
   DEBUG1("Scheduling context: '%s'", new_process->name);
 
-  /* save the current process */
-  smx_process_t old_process = simix_global->current_process;
-
   /* update the current process */
   simix_global->current_process = new_process;
 
   /* schedule the context */
-  SIMIX_context_resume(old_process->context, new_process->context);
+  SIMIX_context_resume(simix_global->maestro_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;
+  simix_global->current_process = simix_global->maestro_process;
 }
 
 /* callback: context fetching */