Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Clean up actions when a condition is destroyed.
[simgrid.git] / src / simix / smx_process.c
index 74750b0..8577616 100644 (file)
@@ -1,4 +1,4 @@
-/    $Id$     */
+//*    $Id$     */
 
 /* Copyright (c) 2002,2003,2004 Arnaud Legrand. All rights reserved.        */
 
@@ -50,9 +50,8 @@ void SIMIX_process_cleanup(void *arg)
  * \return The new corresponding object.
  */
 smx_process_t SIMIX_process_create(const char *name,
-                                  smx_process_code_t code, void *data,
-                                  const char * hostname, int argc, char **argv, 
-                                  void * clean_process_function)
+                                  xbt_main_func_t code, void *data,
+                                  const char * hostname, int argc, char **argv)
 {
   smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1);
   smx_process_t process = xbt_new0(s_smx_process_t,1);
@@ -67,16 +66,9 @@ smx_process_t SIMIX_process_create(const char *name,
        simdata->cond = NULL;
   simdata->argc = argc;
   simdata->argv = argv;
-       if (clean_process_function) {
-       simdata->context = xbt_context_new(code, NULL, NULL, 
-                                            clean_process_function, process, 
-                                            simdata->argc, simdata->argv);
-       }
-       else {
-       simdata->context = xbt_context_new(code, NULL, NULL, 
-                                            SIMIX_process_cleanup, process, 
-                                            simdata->argc, simdata->argv);
-       }
+  simdata->context = xbt_context_new(code, NULL, NULL, 
+                                    simix_global->cleanup_process_function, process, 
+                                    simdata->argc, simdata->argv);
 
   /* Process structure */
   process->name = xbt_strdup(name);
@@ -85,7 +77,7 @@ smx_process_t SIMIX_process_create(const char *name,
 
   xbt_swag_insert(process, host->simdata->process_list);
 
-  /* *************** FIX du current_process !!! *************** */
+  /* fix current_process, about which xbt_context_start mocks around */
   self = simix_global->current_process;
   xbt_context_start(process->simdata->context);
   simix_global->current_process = self;
@@ -104,14 +96,30 @@ smx_process_t SIMIX_process_create(const char *name,
  * Warning: this should only be used in libsimgrid4java, since it create
  * a context with no code, which leads to segfaults in plain libsimgrid 
  */
-smx_process_t SIMIX_jprocess_create(const char *name, smx_host_t host,
-                                   void *data,
-                                   void *jprocess, void *jenv)
+void SIMIX_jprocess_create(const char *name, smx_host_t host,
+                          void *data,
+                          void *jprocess, void *jenv,
+                          smx_process_t *res)
 {
   smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1);
   smx_process_t process = xbt_new0(s_smx_process_t,1);
   smx_process_t self = NULL;
 
+  /* HACK: We need this trick because when we xbt_context_new() do
+     syncronization stuff, the s_process field in the m_process needs 
+     to have a valid value, and we call xbt_context_new() before 
+     returning, of course, ie, before providing a right value to the 
+     caller (Java_simgrid_msg_Msg_processCreate) have time to store it  
+     in place. This way, we initialize the m_process->simdata->s_process 
+     field ourself ASAP.
+
+     All this would be much simpler if the synchronization stuff would be done
+     in the JAVA world, I think.
+  */
+  *res= process; 
+
+
+
   DEBUG5("jprocess_create(name=%s,host=%p,data=%p,jproc=%p,jenv=%p)",
         name,host,data,jprocess,jenv);
   xbt_assert0(host, "Invalid parameters");
@@ -123,8 +131,9 @@ smx_process_t SIMIX_jprocess_create(const char *name, smx_host_t host,
   simdata->argv = NULL;
   
   simdata->context = xbt_context_new(NULL, NULL, NULL, 
-                                    SIMIX_process_cleanup, process, 
+                                    simix_global->cleanup_process_function, process, 
                                     /* argc/argv*/0,NULL);
+
   /* Process structure */
   process->name = xbt_strdup(name);
   process->simdata = simdata; 
@@ -134,7 +143,7 @@ smx_process_t SIMIX_jprocess_create(const char *name, smx_host_t host,
 
   xbt_swag_insert(process, host->simdata->process_list);
 
-  /* *************** FIX du current_process !!! *************** */
+  /* fix current_process, about which xbt_context_start mocks around */
   self = simix_global->current_process;
   xbt_context_start(process->simdata->context);
   simix_global->current_process = self;
@@ -144,36 +153,44 @@ smx_process_t SIMIX_jprocess_create(const char *name, smx_host_t host,
         host->name);
   xbt_swag_insert(process,simix_global->process_to_run);
 
-  return process;
 }
 
 
 /** \brief Kill a SIMIX process
  *
- * This function simply kills a \a process... scarry isn't it ? :). Removes it from the mutex or condition that it can be blocked.
+ * This function simply kills a \a process... scarry isn't it ? :).
  * \param process poor victim
  *
  */
 void SIMIX_process_kill(smx_process_t process)
 {      
-  smx_simdata_process_t p_simdata = process->simdata;
+   smx_simdata_process_t p_simdata = process->simdata;
 
-  DEBUG2("Killing %s on %s",process->name, p_simdata->s_host->name);
+   DEBUG2("Killing process %s on %s",process->name, p_simdata->s_host->name);
   
-       if (p_simdata->mutex) {
-               xbt_swag_remove(process,p_simdata->mutex->sleeping);
-       }
-       if (p_simdata->cond) {
-               xbt_swag_remove(process,p_simdata->cond->sleeping);
-       }
-  xbt_swag_remove(process,simix_global->process_to_run);
-  xbt_swag_remove(process,simix_global->process_list);
-  xbt_context_kill(process->simdata->context);
-
-  if(process==SIMIX_process_self()) {
-    /* I just killed myself */
-    xbt_context_yield();
-  }
+   /* Cleanup if we were waiting for something */
+   DEBUG0("Here!");
+   if (p_simdata->mutex) 
+      xbt_swag_remove(process,p_simdata->mutex->sleeping);
+   
+   DEBUG0("Here!");
+   if (p_simdata->cond) 
+      xbt_swag_remove(process,p_simdata->cond->sleeping);
+
+   DEBUG0("Here!");
+   xbt_swag_remove(process, simix_global->process_to_run);
+   DEBUG0("Here!");
+   xbt_swag_remove(process, simix_global->process_list);
+   DEBUG2("%p here! killing %p",simix_global->current_process,process);
+   xbt_context_kill(process->simdata->context);
+
+   DEBUG0("Here!");
+   if(process==SIMIX_process_self()) {
+      /* I just killed myself */
+     DEBUG0("Here!");
+      xbt_context_yield();
+   }
+   DEBUG0("Here!");
 }
 
 /**
@@ -200,7 +217,7 @@ void *SIMIX_process_get_data(smx_process_t process)
 void SIMIX_process_set_data(smx_process_t process,void *data)
 {
   xbt_assert0((process != NULL), "Invalid parameters");
-  xbt_assert0((process->data == NULL), "Data already set");
+  //xbt_assert0((process->data == NULL), "Data already set");
   
   process->data = data;
    
@@ -362,6 +379,7 @@ int SIMIX_process_is_suspended(smx_process_t process)
 
 /* Helper functions for jMSG: manipulate the context data without breaking the module separation */
 #include "xbt/context.h" /* to pass java objects from MSG to the context */
+
 void SIMIX_process_set_jprocess(smx_process_t process, void *jp) {
    xbt_context_set_jprocess(process->simdata->context,jp);
 }