]> AND Public Git Repository - simgrid.git/blobdiff - src/simix/smx_synchro.c
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Added debug information to SIMIX network.
[simgrid.git] / src / simix / smx_synchro.c
index 92ac1a027318ba7206f89a8defeb7ff1a9c2b469..b664398515316450142364645847cfff11eb840c 100644 (file)
@@ -49,14 +49,14 @@ void SIMIX_mutex_lock(smx_mutex_t mutex)
   if (mutex->refcount) {
     /* somebody using the mutex, block */
     xbt_swag_insert(self, mutex->sleeping);
-    self->simdata->mutex = mutex;
+    self->mutex = mutex;
     /* wait for some process make the unlock and wake up me from mutex->sleeping */
-    xbt_context_yield();
-    self->simdata->mutex = NULL;
+    SIMIX_process_yield();
+    self->mutex = NULL;
 
     /* verify if the process was suspended */
-    while (self->simdata->suspended) {
-      xbt_context_yield();
+    while (self->suspended) {
+      SIMIX_process_yield();
     }
 
     mutex->refcount = 1;
@@ -148,7 +148,7 @@ smx_cond_t SIMIX_cond_init()
 /**
  * \brief Signalizes a condition.
  *
- * Signalizes a condition and wakes up a sleping process. If there are no process sleeping, no action is done.
+ * Signalizes a condition and wakes up a sleeping process. If there are no process sleeping, no action is done.
  * \param cond A condition
  */
 void SIMIX_cond_signal(smx_cond_t cond)
@@ -176,24 +176,27 @@ void SIMIX_cond_signal(smx_cond_t cond)
 void SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex)
 {
   smx_action_t act_sleep;
-  xbt_assert0((mutex != NULL), "Invalid parameters");
 
   DEBUG1("Wait condition %p", cond);
-  cond->mutex = mutex;
 
-  SIMIX_mutex_unlock(mutex);
-  /* always create an action null in case there is a host failure */
-/*   if (xbt_fifo_size(cond->actions) == 0) { */
+  /* If there is a mutex unlock it */
+  if(mutex != NULL){
+    cond->mutex = mutex;
+    SIMIX_mutex_unlock(mutex);
+  }
+  
+  /* Always create an action null in case there is a host failure */
   act_sleep = SIMIX_action_sleep(SIMIX_host_self(), -1);
+  SIMIX_process_self()->waiting_action = act_sleep;
   SIMIX_register_action_to_condition(act_sleep, cond);
   __SIMIX_cond_wait(cond);
+  SIMIX_process_self()->waiting_action = NULL;
   SIMIX_unregister_action_to_condition(act_sleep, cond);
   SIMIX_action_destroy(act_sleep);
-/*   } else { */
-/*     __SIMIX_cond_wait(cond); */
-/*   } */
-  /* get the mutex again */
-  SIMIX_mutex_lock(cond->mutex);
+
+  /* get the mutex again if necessary */
+  if(mutex != NULL)
+    SIMIX_mutex_lock(cond->mutex);
 
   return;
 }
@@ -211,15 +214,14 @@ void __SIMIX_cond_wait(smx_cond_t cond)
 
   /* process status */
 
-  self->simdata->cond = cond;
+  self->cond = cond;
   xbt_swag_insert(self, cond->sleeping);
-  xbt_context_yield();
-  self->simdata->cond = NULL;
-  while (self->simdata->suspended) {
-    xbt_context_yield();
+  SIMIX_process_yield();
+  self->cond = NULL;
+  while (self->suspended) {
+    SIMIX_process_yield();
   }
   return;
-
 }
 
 /**
@@ -233,18 +235,22 @@ void __SIMIX_cond_wait(smx_cond_t cond)
 void SIMIX_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex,
                              double max_duration)
 {
-
   smx_action_t act_sleep;
-  xbt_assert0((mutex != NULL), "Invalid parameters");
 
   DEBUG1("Timed wait condition %p", cond);
-  cond->mutex = mutex;
 
-  SIMIX_mutex_unlock(mutex);
+  /* If there is a mutex unlock it */
+  if(mutex != NULL){
+    cond->mutex = mutex;
+    SIMIX_mutex_unlock(mutex);
+  }
+
   if (max_duration >= 0) {
     act_sleep = SIMIX_action_sleep(SIMIX_host_self(), max_duration);
     SIMIX_register_action_to_condition(act_sleep, cond);
+    SIMIX_process_self()->waiting_action = act_sleep;
     __SIMIX_cond_wait(cond);
+    SIMIX_process_self()->waiting_action = NULL;
     SIMIX_unregister_action_to_condition(act_sleep, cond);
     if (SIMIX_action_get_state(act_sleep) == SURF_ACTION_DONE) {
       SIMIX_action_destroy(act_sleep);
@@ -256,8 +262,9 @@ void SIMIX_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex,
   } else
     __SIMIX_cond_wait(cond);
 
-  /* get the mutex again */
-  SIMIX_mutex_lock(cond->mutex);
+  /* get the mutex again if necessary */
+  if(mutex != NULL)
+    SIMIX_mutex_lock(cond->mutex);
 
   return;
 }
@@ -326,7 +333,7 @@ void SIMIX_cond_display_info(smx_cond_t cond)
     INFO0("Blocked process on this condition:");
     xbt_swag_foreach(process, cond->sleeping) {
       INFO2("\t %s running on host %s", process->name,
-            process->simdata->smx_host->name);
+            process->smx_host->name);
     }
   }
 }