Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Semaphores are more complicated than mutexes since they can be linked with actions...
authordonassbr <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 8 Apr 2010 17:31:19 +0000 (17:31 +0000)
committerdonassbr <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 8 Apr 2010 17:31:19 +0000 (17:31 +0000)
Use SIMIX functions to resume/suspend actions.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7488 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/simix/smx_network.c
src/simix/smx_process.c

index ab4bd7b..0fa2c51 100644 (file)
@@ -220,7 +220,7 @@ static inline void SIMIX_communication_start(smx_comm_t comm)
        it will be restarted when the sender process resume */
     if(SIMIX_process_is_suspended(comm->src_proc) || 
        SIMIX_process_is_suspended(comm->dst_proc)) {
-      SIMIX_action_set_priority(comm->act, 0);
+      SIMIX_action_suspend(comm->act);
     }
     
     /* Add the communication as user data of the action */
index c769cec..a6f5aee 100644 (file)
@@ -315,7 +315,7 @@ void SIMIX_process_suspend(smx_process_t process)
 
   if (process != SIMIX_process_self()) {
 
-    if (process->mutex || process->sem) {
+    if (process->mutex) {
       /* process blocked on a mutex or sem, only set suspend=1 */
       process->suspended = 1;
     } else if (process->cond) {
@@ -329,7 +329,17 @@ 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);
+        SIMIX_action_suspend(act);
+      }
+    } else if (process->sem) {
+      smx_cond_t s;
+      xbt_fifo_item_t i;
+      smx_action_t act;
+
+      process->suspended = 1;
+      s = process->sem;
+      xbt_fifo_foreach(s->actions, i, act, smx_action_t) {
+        SIMIX_action_suspend(act);
       }
     } else {
       process->suspended = 1;
@@ -344,7 +354,7 @@ 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_action_suspend(dummy);
     SIMIX_register_action_to_condition(dummy, cond);
     __SIMIX_cond_wait(cond);
     SIMIX_process_self()->waiting_action = NULL;
@@ -369,7 +379,7 @@ void SIMIX_process_resume(smx_process_t process)
   if (process == SIMIX_process_self())
     return;
 
-  if (process->mutex || process->sem) {
+  if (process->mutex) {
     DEBUG0("Resume process blocked on a mutex or semaphore");
     process->suspended = 0;     /* It'll wake up by itself when mutex releases */
     return;
@@ -382,10 +392,22 @@ void SIMIX_process_resume(smx_process_t process)
     process->suspended = 0;
     c = process->cond;
     xbt_fifo_foreach(c->actions, i, act, smx_action_t) {
-      surf_workstation_model->resume(act->surf_action);
+      SIMIX_action_resume(act);
     }
     SIMIX_cond_signal(c);
     return;
+  } else if (process->sem) {
+    /* temporaries variables */
+    smx_sem_t s;
+    xbt_fifo_item_t i;
+    smx_action_t act;
+    DEBUG0("Resume process blocked on a semaphore");
+    process->suspended = 0;
+    s = process->sem;
+    xbt_fifo_foreach(s->actions, i, act, smx_action_t) {
+      SIMIX_action_resume(act);
+    }
+    return;
   } else {
     process->suspended = 0;
     xbt_swag_insert(process, simix_global->process_to_run);