Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Simplify the code of typed tasks in simdag by allocating the comm_ and comp_amount...
[simgrid.git] / src / simix / smx_synchro.c
index 64d4d69..b664398 100644 (file)
@@ -11,7 +11,7 @@
 
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_synchro, simix,
-                               "Logging specific to SIMIX (synchronization)");
+                                "Logging specific to SIMIX (synchronization)");
 
 
 /****************************** Synchronization *******************************/
@@ -27,9 +27,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_synchro, simix,
 smx_mutex_t SIMIX_mutex_init()
 {
   smx_mutex_t m = xbt_new0(s_smx_mutex_t, 1);
-  s_smx_process_t p;           /* useful to initialize sleeping swag */
+  s_smx_process_t p;            /* useful to initialize sleeping swag */
   /* structures initialization */
-  m->using = 0;
+  m->refcount = 0;
   m->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup));
   return m;
 }
@@ -46,23 +46,23 @@ void SIMIX_mutex_lock(smx_mutex_t mutex)
   xbt_assert0((mutex != NULL), "Invalid parameters");
 
 
-  if (mutex->using) {
+  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->using = 1;
+    mutex->refcount = 1;
   } else {
     /* mutex free */
-    mutex->using = 1;
+    mutex->refcount = 1;
   }
   return;
 }
@@ -78,10 +78,10 @@ int SIMIX_mutex_trylock(smx_mutex_t mutex)
 {
   xbt_assert0((mutex != NULL), "Invalid parameters");
 
-  if (mutex->using)
+  if (mutex->refcount)
     return 0;
   else {
-    mutex->using = 1;
+    mutex->refcount = 1;
     return 1;
   }
 }
@@ -94,17 +94,17 @@ int SIMIX_mutex_trylock(smx_mutex_t mutex)
  */
 void SIMIX_mutex_unlock(smx_mutex_t mutex)
 {
-  smx_process_t p;             /*process to wake up */
+  smx_process_t p;              /*process to wake up */
 
   xbt_assert0((mutex != NULL), "Invalid parameters");
 
   if (xbt_swag_size(mutex->sleeping) > 0) {
     p = xbt_swag_extract(mutex->sleeping);
-    mutex->using = 0;
+    mutex->refcount = 0;
     xbt_swag_insert(p, simix_global->process_to_run);
   } else {
     /* nobody to wake up */
-    mutex->using = 0;
+    mutex->refcount = 0;
   }
   return;
 }
@@ -148,15 +148,15 @@ 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)
 {
-       smx_process_t proc = NULL;
+  smx_process_t proc = NULL;
   DEBUG1("Signal condition %p", cond);
   xbt_assert0((cond != NULL), "Invalid parameters");
+
 
   if (xbt_swag_size(cond->sleeping) >= 1) {
     proc = xbt_swag_extract(cond->sleeping);
@@ -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) { */
-    act_sleep = SIMIX_action_sleep(SIMIX_host_self(), -1);
-    SIMIX_register_action_to_condition(act_sleep, cond);
-    __SIMIX_cond_wait(cond);
-    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);
+  /* 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);
+
+  /* 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;
-
 }
 
 /**
@@ -231,20 +233,24 @@ void __SIMIX_cond_wait(smx_cond_t cond)
  * \param max_duration Timeout time
  */
 void SIMIX_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex,
-                            double max_duration)
+                             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;
 }
@@ -273,7 +280,7 @@ void SIMIX_cond_broadcast(smx_cond_t cond)
   smx_process_t proc = NULL;
   smx_process_t proc_next = NULL;
 
-   xbt_assert0((cond != NULL), "Invalid parameters");
+  xbt_assert0((cond != NULL), "Invalid parameters");
 
   DEBUG1("Broadcast condition %p", cond);
   xbt_swag_foreach_safe(proc, proc_next, cond->sleeping) {
@@ -300,7 +307,7 @@ void SIMIX_cond_destroy(smx_cond_t cond)
     smx_action_t action = NULL;
 
     xbt_assert0(xbt_swag_size(cond->sleeping) == 0,
-               "Cannot destroy conditional since someone is still using it");
+                "Cannot destroy conditional since someone is still using it");
     xbt_swag_free(cond->sleeping);
 
     DEBUG1("%d actions registered", xbt_fifo_size(cond->actions));
@@ -324,8 +331,9 @@ void SIMIX_cond_display_info(smx_cond_t cond)
     smx_process_t process = NULL;
 
     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);
+    xbt_swag_foreach(process, cond->sleeping) {
+      INFO2("\t %s running on host %s", process->name,
+            process->smx_host->name);
     }
   }
 }