From 9ea82aa2fb1e9d72ee527af3570bec255f030032 Mon Sep 17 00:00:00 2001 From: donassbr Date: Thu, 8 Apr 2010 17:31:19 +0000 Subject: [PATCH] Semaphores are more complicated than mutexes since they can be linked with actions. Use the same idea of conditions to implement the process_resume/process_suspend with semaphores. 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 | 2 +- src/simix/smx_process.c | 32 +++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index ab4bd7b613..0fa2c5121b 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -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 */ diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index c769cecdb4..a6f5aeed02 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -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); -- 2.20.1