From: donassbr Date: Tue, 29 Sep 2009 12:42:05 +0000 (+0000) Subject: Change variable waiting_task to waiting_action on msg process control. X-Git-Tag: SVN~1027 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/e487ef4538248f261ddb6e814357593df7646e33?hp=ae9cb1a80506c00479fa84f8a56cdce227704628;ds=sidebyside Change variable waiting_task to waiting_action on msg process control. So, we can use the same variable to see when the process is sleeping (MSG_process_sleep) and it's killed by another process. Now, waiting_action saves the simix action on which the process is waiting. It can be a communicate, an execute or a sleep action. Remove from action_set when cancelling an action on cpu_im model. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6684 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/msg/gos.c b/src/msg/gos.c index b61e4990dc..fc58b2bbea 100644 --- a/src/msg/gos.c +++ b/src/msg/gos.c @@ -57,14 +57,15 @@ MSG_error_t MSG_task_execute(m_task_t task) simdata->computation_amount); SIMIX_action_set_priority(simdata->compute, simdata->priority); - self->simdata->waiting_task = task; + /* changed to waiting action since we are always waiting one action (execute, communicate or sleep) */ + self->simdata->waiting_action = simdata->compute; SIMIX_register_action_to_condition(simdata->compute, simdata->cond); do { SIMIX_cond_wait(simdata->cond, simdata->mutex); state = SIMIX_action_get_state(simdata->compute); } while (state == SURF_ACTION_READY || state == SURF_ACTION_RUNNING); SIMIX_unregister_action_to_condition(simdata->compute, simdata->cond); - self->simdata->waiting_task = NULL; + self->simdata->waiting_action = NULL; SIMIX_mutex_unlock(simdata->mutex); simdata->refcount--; @@ -174,7 +175,7 @@ MSG_error_t MSG_parallel_task_execute(m_task_t task) simdata->host_list, simdata->comp_amount, simdata->comm_amount, 1.0, -1.0); - self->simdata->waiting_task = task; + self->simdata->waiting_action = simdata->compute; SIMIX_register_action_to_condition(simdata->compute, simdata->cond); do { SIMIX_cond_wait(simdata->cond, simdata->mutex); @@ -182,7 +183,7 @@ MSG_error_t MSG_parallel_task_execute(m_task_t task) } while (state == SURF_ACTION_READY || state == SURF_ACTION_RUNNING); SIMIX_unregister_action_to_condition(simdata->compute, simdata->cond); - self->simdata->waiting_task = NULL; + self->simdata->waiting_action = NULL; SIMIX_mutex_unlock(simdata->mutex); @@ -238,11 +239,13 @@ MSG_error_t MSG_process_sleep(double nb_sec) /* create conditional and register action to it */ cond = SIMIX_cond_init(); + proc->simdata->waiting_action = act_sleep; SIMIX_register_action_to_condition(act_sleep, cond); do { SIMIX_cond_wait(cond, mutex); state = SIMIX_action_get_state(act_sleep); } while (state == SURF_ACTION_READY || state == SURF_ACTION_RUNNING); + proc->simdata->waiting_action = NULL; SIMIX_unregister_action_to_condition(act_sleep, cond); SIMIX_mutex_unlock(mutex); diff --git a/src/msg/m_process.c b/src/msg/m_process.c index 5dea7eadb3..68779a4e2f 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -153,7 +153,7 @@ m_process_t MSG_process_create_with_environment(const char *name, /* Simulator Data */ simdata->PID = msg_global->PID++; - simdata->waiting_task = NULL; + simdata->waiting_action = NULL; simdata->m_host = host; simdata->argc = argc; simdata->argv = argv; @@ -195,13 +195,10 @@ void MSG_process_kill(m_process_t process) DEBUG3("Killing %s(%d) on %s", process->name, p_simdata->PID, p_simdata->m_host->name); - if (p_simdata->waiting_task) { - DEBUG1("Canceling waiting task %s", p_simdata->waiting_task->name); - if (p_simdata->waiting_task->simdata->compute) { - SIMIX_action_cancel(p_simdata->waiting_task->simdata->compute); - } else if (p_simdata->waiting_task->simdata->comm) { - SIMIX_action_cancel(p_simdata->waiting_task->simdata->comm); - } + if (p_simdata->waiting_action) { + DEBUG1("Canceling waiting task %s", + SIMIX_action_get_name(p_simdata->waiting_action)); + SIMIX_action_cancel(p_simdata->waiting_action); } xbt_fifo_remove(msg_global->process_list, process); diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index b6aa08e34c..c285b60005 100644 --- a/src/msg/msg_mailbox.c +++ b/src/msg/msg_mailbox.c @@ -217,7 +217,8 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, } if (timeout > 0) - SIMIX_cond_wait_timeout(cond, h_simdata->mutex, timeout - start_time + SIMIX_get_clock()); + SIMIX_cond_wait_timeout(cond, h_simdata->mutex, + timeout - start_time + SIMIX_get_clock()); else SIMIX_cond_wait(cond, h_simdata->mutex); @@ -263,7 +264,7 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, } SIMIX_register_action_to_condition(t_simdata->comm, t_simdata->cond); // breaking point if asynchrounous - process->simdata->waiting_task = t; + process->simdata->waiting_action = t_simdata->comm; while (1) { SIMIX_cond_wait(t_simdata->cond, t_simdata->mutex); @@ -277,7 +278,7 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, } SIMIX_unregister_action_to_condition(t_simdata->comm, t_simdata->cond); - process->simdata->waiting_task = NULL; + process->simdata->waiting_action = NULL; /* for this process, don't need to change in get function */ SIMIX_mutex_unlock(t_simdata->mutex); @@ -350,7 +351,7 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, SIMIX_mutex_lock(t_simdata->mutex); - process->simdata->waiting_task = task; // for debugging and status displaying purpose + process->simdata->waiting_action = t_simdata->comm; // for debugging and status displaying purpose if (timeout > 0) { xbt_ex_t e; @@ -382,7 +383,7 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, /* verify if the timeout happened and the communication didn't started yet */ if (t_simdata->comm == NULL) { DEBUG1("Action terminated %s (there was a timeout)", task->name); - process->simdata->waiting_task = NULL; + process->simdata->waiting_action = NULL; /* remove the task from the mailbox */ MSG_mailbox_remove(mailbox, task); @@ -415,7 +416,7 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, } DEBUG1("Action terminated %s", task->name); - process->simdata->waiting_task = NULL; + process->simdata->waiting_action = NULL; /* if (t_simdata->receiver && t_simdata->receiver->simdata) { /\* receiver still around *\/ */ /* t_simdata->receiver->simdata->waiting_task = NULL; */ /* } */ diff --git a/src/msg/private.h b/src/msg/private.h index eca2729c6d..63d2703011 100644 --- a/src/msg/private.h +++ b/src/msg/private.h @@ -68,7 +68,7 @@ SG_BEGIN_DECL() int PPID; /* The parent PID */ m_host_t put_host; /* used for debugging purposes */ m_channel_t put_channel; /* used for debugging purposes */ - m_task_t waiting_task; + smx_action_t waiting_action; int argc; /* arguments number if any */ char **argv; /* arguments table if any */ MSG_error_t last_errno; /* the last value returned by a MSG_function */ diff --git a/src/surf/cpu_im.c b/src/surf/cpu_im.c index 2b3b5be83f..e572147806 100644 --- a/src/surf/cpu_im.c +++ b/src/surf/cpu_im.c @@ -180,6 +180,8 @@ static void action_cancel(surf_action_t action) surf_action_state_set(action, SURF_ACTION_FAILED); xbt_heap_remove(action_heap, ((surf_action_cpu_Cas01_im_t) action)->index_heap); + xbt_swag_remove(action, + ((cpu_Cas01_im_t) ACTION_GET_CPU(action))->action_set); return; }