Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Sanitize channel naming.
[simgrid.git] / src / msg / gos.c
index dcc8e0c..fd74bc8 100644 (file)
@@ -8,7 +8,7 @@
 #include "private.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gos, msg,
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg,
                                "Logging specific to MSG (gos)");
 
 /** \defgroup msg_gos_functions MSG Operating System Functions
@@ -65,10 +65,11 @@ static MSG_error_t __MSG_task_get_with_time_out_from_host(m_task_t * task,
        MSG_RETURN(MSG_OK);
       }
     }
-    xbt_assert2(!(h_simdata->sleeping[channel]),
-               "A process (%s(%d)) is already blocked on this channel",
+    xbt_assert3(!(h_simdata->sleeping[channel]),
+               "A process (%s(%d)) is already blocked on channel %d",
                h_simdata->sleeping[channel]->name,
-               h_simdata->sleeping[channel]->simdata->PID);
+               h_simdata->sleeping[channel]->simdata->PID,
+               channel);
     h_simdata->sleeping[channel] = process; /* I'm waiting. Wake me up when you're ready */
     if(max_duration>0) {
       __MSG_process_block(max_duration);
@@ -447,6 +448,13 @@ MSG_error_t MSG_task_put(m_task_t task,
   while(!(task_simdata->comm)) {
     DEBUG0("Communication not initiated yet. Let's block!");
     __MSG_process_block(-1);
+    if(surf_workstation_resource->extension_public->
+       get_state(local_host->simdata->host) == SURF_CPU_OFF) {
+      xbt_fifo_remove(((simdata_host_t) remote_host->simdata)->mbox[channel],
+                     task);
+      MSG_task_destroy(task);
+      MSG_RETURN(MSG_HOST_FAILURE);
+    }
   }
   DEBUG0("Registering to this communication");
   surf_workstation_resource->common_public->action_use(task_simdata->comm);
@@ -534,8 +542,9 @@ void __MSG_task_execute(m_process_t process, m_task_t task)
   CHECK_HOST();
 
   simdata = task->simdata;
-  xbt_assert0(!simdata->compute,"This taks is executed somewhere else. Go fix your code!");
-
+  xbt_assert0((!simdata->compute)&&(task->simdata->using==1),
+             "This taks is executed somewhere else. Go fix your code!");
+  task->simdata->using++;
   simdata->compute = surf_workstation_resource->extension_public->
     execute(MSG_process_get_host(process)->simdata->host,
            simdata->computation_amount);
@@ -543,6 +552,7 @@ void __MSG_task_execute(m_process_t process, m_task_t task)
     set_priority(simdata->compute, simdata->priority);
 
   surf_workstation_resource->common_public->action_set_data(simdata->compute,task);
+  task->simdata->using--;
 }
 
 MSG_error_t __MSG_wait_for_computation(m_process_t process, m_task_t task)