Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change variable waiting_task to waiting_action on msg process control.
authordonassbr <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 29 Sep 2009 12:42:05 +0000 (12:42 +0000)
committerdonassbr <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 29 Sep 2009 12:42:05 +0000 (12:42 +0000)
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

src/msg/gos.c
src/msg/m_process.c
src/msg/msg_mailbox.c
src/msg/private.h
src/surf/cpu_im.c

index b61e499..fc58b2b 100644 (file)
@@ -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);
 
                          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);
   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--;
 
   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);
 
                                   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);
   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);
   } 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);
 
 
   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();
 
   /* 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);
   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);
 
   SIMIX_unregister_action_to_condition(act_sleep, cond);
   SIMIX_mutex_unlock(mutex);
 
index 5dea7ea..68779a4 100644 (file)
@@ -153,7 +153,7 @@ m_process_t MSG_process_create_with_environment(const char *name,
 
   /* Simulator Data */
   simdata->PID = msg_global->PID++;
 
   /* 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;
   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);
 
   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);
   }
 
   xbt_fifo_remove(msg_global->process_list, process);
index b6aa08e..c285b60 100644 (file)
@@ -217,7 +217,8 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task,
     }
 
     if (timeout > 0)
     }
 
     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);
 
     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
   }
   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);
 
   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);
   }
 
   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);
 
   /* 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);
 
 
   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;
 
   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);
         /* 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);
 
           /* 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);
   }
 
   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; */
 /*   } */
 /*   if (t_simdata->receiver && t_simdata->receiver->simdata) {    /\* receiver still around *\/ */
 /*     t_simdata->receiver->simdata->waiting_task = NULL; */
 /*   } */
index eca2729..63d2703 100644 (file)
@@ -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 */
        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 */
        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 */
index 2b3b5be..e572147 100644 (file)
@@ -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);
   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;
 }
 
   return;
 }