Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use msg_process_t instead of m_process_t
[simgrid.git] / src / msg / msg_gos.c
index c0cce18..a5839c3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2011. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2004-2012. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -23,194 +23,96 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg,
  */
 MSG_error_t MSG_task_execute(m_task_t task)
 {
-  simdata_task_t simdata = NULL;
-  simdata_process_t p_simdata;
-  e_smx_state_t comp_state;
-
-  simdata = task->simdata;
+  return MSG_parallel_task_execute(task);
+}
 
-  xbt_assert(simdata->host_nb == 0,
-              "This is a parallel task. Go to hell.");
+/** \ingroup msg_task_usage
+ * \brief Executes a parallel task and waits for its termination.
+ *
+ * \param task a #m_task_t to execute on the location on which the process is running.
+ *
+ * \return #MSG_OK if the task was successfully completed, #MSG_TASK_CANCELED
+ * or #MSG_HOST_FAILURE otherwise
+ */
+MSG_error_t MSG_parallel_task_execute(m_task_t task)
+{
+  xbt_ex_t e;
+  simdata_task_t simdata = task->simdata;
+  msg_process_t self = SIMIX_process_self();
+  simdata_process_t p_simdata = SIMIX_process_self_get_data(self);
+  e_smx_state_t comp_state;
+  MSG_error_t status = MSG_OK;
 
 #ifdef HAVE_TRACING
   TRACE_msg_task_execute_start(task);
 #endif
 
   xbt_assert((!simdata->compute) && (task->simdata->isused == 0),
-              "This task is executed somewhere else. Go fix your code! %d",
-              task->simdata->isused);
+             "This task is executed somewhere else. Go fix your code! %d",
+             task->simdata->isused);
 
   XBT_DEBUG("Computing on %s", MSG_process_get_name(MSG_process_self()));
 
-  if (simdata->computation_amount == 0) {
+  if (simdata->computation_amount == 0 && !simdata->host_nb) {
 #ifdef HAVE_TRACING
     TRACE_msg_task_execute_end(task);
 #endif
     return MSG_OK;
   }
 
-  m_process_t self = SIMIX_process_self();
-  p_simdata = SIMIX_process_self_get_data(self);
-  simdata->isused=1;
-  simdata->compute =
-      simcall_host_execute(task->name, p_simdata->m_host->smx_host,
-                           simdata->computation_amount,
-                           simdata->priority);
-#ifdef HAVE_TRACING
-  simcall_set_category(simdata->compute, task->category);
-#endif
 
-  p_simdata->waiting_action = simdata->compute;
-  comp_state = simcall_host_execution_wait(simdata->compute);
-  p_simdata->waiting_action = NULL;
+  TRY {
 
-  simdata->isused=0;
+    simdata->isused=1;
+
+    if (simdata->host_nb > 0) {
+      simdata->compute = simcall_host_parallel_execute(task->name,
+                                                       simdata->host_nb,
+                                                       simdata->host_list,
+                                                       simdata->comp_amount,
+                                                       simdata->comm_amount,
+                                                       1.0, -1.0);
+      XBT_DEBUG("Parallel execution action created: %p", simdata->compute);
+    } else {
+      simdata->compute = simcall_host_execute(task->name,
+                                              p_simdata->m_host->smx_host,
+                                              simdata->computation_amount,
+                                              simdata->priority);
 
-  XBT_DEBUG("Execution task '%s' finished in state %d", task->name, (int)comp_state);
-  if (comp_state == SIMIX_DONE) {
-    /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
-    simdata->computation_amount = 0.0;
-    simdata->comm = NULL;
-    simdata->compute = NULL;
-#ifdef HAVE_TRACING
-    TRACE_msg_task_execute_end(task);
-#endif
-    MSG_RETURN(MSG_OK);
-  } else if (simcall_host_get_state(SIMIX_host_self()) == 0) {
-    /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
-    simdata->comm = NULL;
-    simdata->compute = NULL;
-#ifdef HAVE_TRACING
-    TRACE_msg_task_execute_end(task);
-#endif
-    MSG_RETURN(MSG_HOST_FAILURE);
-  } else {
-    /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
-    simdata->comm = NULL;
-    simdata->compute = NULL;
+    }
 #ifdef HAVE_TRACING
-    TRACE_msg_task_execute_end(task);
+    simcall_set_category(simdata->compute, task->category);
 #endif
-    MSG_RETURN(MSG_TASK_CANCELED);
-  }
-}
+    p_simdata->waiting_action = simdata->compute;
+    comp_state = simcall_host_execution_wait(simdata->compute);
 
-/** \ingroup m_task_management
- * \brief Creates a new #m_task_t (a parallel one....).
- *
- * A constructor for #m_task_t taking six arguments and returning the
- corresponding object.
- * \param name a name for the object. It is for user-level information
- and can be NULL.
- * \param host_nb the number of hosts implied in the parallel task.
- * \param host_list an array of \p host_nb m_host_t.
- * \param computation_amount an array of \p host_nb
- doubles. computation_amount[i] is the total number of operations
- that have to be performed on host_list[i].
- * \param communication_amount an array of \p host_nb* \p host_nb doubles.
- * \param data a pointer to any data may want to attach to the new
- object.  It is for user-level information and can be NULL. It can
- be retrieved with the function \ref MSG_task_get_data.
- * \see m_task_t
- * \return The new corresponding object.
- */
-m_task_t
-MSG_parallel_task_create(const char *name, int host_nb,
-                         const m_host_t * host_list,
-                         double *computation_amount,
-                         double *communication_amount, void *data)
-{
-  int i;
-  simdata_task_t simdata = xbt_new0(s_simdata_task_t, 1);
-  m_task_t task = xbt_new0(s_m_task_t, 1);
-  task->simdata = simdata;
-
-  /* Task structure */
-  task->name = xbt_strdup(name);
-  task->data = data;
-
-  /* Simulator Data */
-  simdata->computation_amount = 0;
-  simdata->message_size = 0;
-  simdata->compute = NULL;
-  simdata->comm = NULL;
-  simdata->rate = -1.0;
-  simdata->isused = 0;
-  simdata->sender = NULL;
-  simdata->receiver = NULL;
-  simdata->source = NULL;
-
-  simdata->host_nb = host_nb;
-  simdata->host_list = xbt_new0(smx_host_t, host_nb);
-  simdata->comp_amount = computation_amount;
-  simdata->comm_amount = communication_amount;
+    p_simdata->waiting_action = NULL;
 
-  for (i = 0; i < host_nb; i++)
-    simdata->host_list[i] = host_list[i]->smx_host;
-
-  return task;
-}
+    simdata->isused=0;
 
-/** \ingroup msg_task_usage
- * \brief Executes a parallel task and waits for its termination.
- *
- * \param task a #m_task_t to execute on the location on which the process is running.
- *
- * \return #MSG_OK if the task was successfully completed, #MSG_TASK_CANCELED
- * or #MSG_HOST_FAILURE otherwise
- */
-MSG_error_t MSG_parallel_task_execute(m_task_t task)
-{
-  simdata_task_t simdata = NULL;
-  e_smx_state_t comp_state;
-  simdata_process_t p_simdata;
-
-  simdata = task->simdata;
-  p_simdata = SIMIX_process_self_get_data(SIMIX_process_self());
-
-  xbt_assert((!simdata->compute)
-              && (task->simdata->isused == 0),
-              "This task is executed somewhere else. Go fix your code!");
-
-  xbt_assert(simdata->host_nb,
-              "This is not a parallel task. Go to hell.");
-
-  XBT_DEBUG("Parallel computing on %s", SIMIX_host_get_name(p_simdata->m_host->smx_host));
-
-  simdata->isused=1;
-
-  simdata->compute =
-      simcall_host_parallel_execute(task->name, simdata->host_nb,
-                                  simdata->host_list,
-                                  simdata->comp_amount,
-                                  simdata->comm_amount, 1.0, -1.0);
-  XBT_DEBUG("Parallel execution action created: %p", simdata->compute);
-
-  p_simdata->waiting_action = simdata->compute;
-  comp_state = simcall_host_execution_wait(simdata->compute);
-  p_simdata->waiting_action = NULL;
-
-  XBT_DEBUG("Finished waiting for execution of action %p, state = %d", simdata->compute, (int)comp_state);
-
-  simdata->isused=0;
-
-  if (comp_state == SIMIX_DONE) {
-    /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
-    simdata->computation_amount = 0.0;
-    simdata->comm = NULL;
-    simdata->compute = NULL;
-    MSG_RETURN(MSG_OK);
-  } else if (simcall_host_get_state(SIMIX_host_self()) == 0) {
-    /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
-    simdata->comm = NULL;
-    simdata->compute = NULL;
-    MSG_RETURN(MSG_HOST_FAILURE);
-  } else {
-    /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
-    simdata->comm = NULL;
-    simdata->compute = NULL;
-    MSG_RETURN(MSG_TASK_CANCELED);
+    XBT_DEBUG("Execution task '%s' finished in state %d",
+              task->name, (int)comp_state);
   }
+  CATCH(e) {
+    switch (e.category) {
+    case cancel_error:
+      status = MSG_TASK_CANCELED;
+      break;
+    default:
+      RETHROW;
+    }
+    xbt_ex_free(e);
+  }
+  /* action ended, set comm and compute = NULL, the actions is already destroyed
+   * in the main function */
+  simdata->computation_amount = 0.0;
+  simdata->comm = NULL;
+  simdata->compute = NULL;
+#ifdef HAVE_TRACING
+  TRACE_msg_task_execute_end(task);
+#endif
+
+  MSG_RETURN(status);
 }
 
 
@@ -223,33 +125,27 @@ MSG_error_t MSG_parallel_task_execute(m_task_t task)
  */
 MSG_error_t MSG_process_sleep(double nb_sec)
 {
-  e_smx_state_t state;
-  /*m_process_t proc = MSG_process_self();*/
+  MSG_error_t status = MSG_OK;
+  /*msg_process_t proc = MSG_process_self();*/
 
 #ifdef HAVE_TRACING
   TRACE_msg_process_sleep_in(MSG_process_self());
 #endif
 
   /* create action to sleep */
-  state = simcall_process_sleep(nb_sec);
 
   /*proc->simdata->waiting_action = act_sleep;
 
   FIXME: check if not setting the waiting_action breaks something on msg
   
   proc->simdata->waiting_action = NULL;*/
-  
-  if (state == SIMIX_DONE) {
-#ifdef HAVE_TRACING
-  TRACE_msg_process_sleep_out(MSG_process_self());
-#endif
-    MSG_RETURN(MSG_OK);
-  } else {
-#ifdef HAVE_TRACING
+
+  simcall_process_sleep(nb_sec);
+
+  #ifdef HAVE_TRACING
     TRACE_msg_process_sleep_out(MSG_process_self());
-#endif
-    MSG_RETURN(MSG_HOST_FAILURE);
-  }
+  #endif
+  MSG_RETURN(status);
 }
 
 /** \ingroup msg_task_usage
@@ -395,7 +291,7 @@ XBT_INLINE msg_comm_t MSG_task_isend_with_matching(m_task_t task, const char *al
     void *match_data)
 {
   simdata_task_t t_simdata = NULL;
-  m_process_t process = MSG_process_self();
+  msg_process_t process = MSG_process_self();
   msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
 
   /* FIXME: these functions are not traceable */
@@ -445,7 +341,7 @@ XBT_INLINE msg_comm_t MSG_task_isend_with_matching(m_task_t task, const char *al
 void MSG_task_dsend(m_task_t task, const char *alias, void_f_pvoid_t cleanup)
 {
   simdata_task_t t_simdata = NULL;
-  m_process_t process = MSG_process_self();
+  msg_process_t process = MSG_process_self();
   msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
 
   /* FIXME: these functions are not traceable */
@@ -523,12 +419,6 @@ int MSG_comm_test(msg_comm_t comm)
   }
   CATCH(e) {
     switch (e.category) {
-
-      case host_error:
-        comm->status = MSG_HOST_FAILURE;
-        finished = 1;
-        break;
-
       case network_error:
         comm->status = MSG_TRANSFER_FAILURE;
         finished = 1;
@@ -574,12 +464,6 @@ int MSG_comm_testany(xbt_dynar_t comms)
   }
   CATCH(e) {
     switch (e.category) {
-
-      case host_error:
-        finished_index = e.value;
-        status = MSG_HOST_FAILURE;
-        break;
-
       case network_error:
         finished_index = e.value;
         status = MSG_TRANSFER_FAILURE;
@@ -625,7 +509,8 @@ void MSG_comm_destroy(msg_comm_t comm)
  *
  * It takes two parameters.
  * \param comm the communication to wait.
- * \param timeout Wait until the communication terminates or the timeout occurs
+ * \param timeout Wait until the communication terminates or the timeout 
+ * occurs. You can provide a -1 timeout to obtain an infinite timeout.
  * \return MSG_error_t
  */
 MSG_error_t MSG_comm_wait(msg_comm_t comm, double timeout)
@@ -643,9 +528,6 @@ MSG_error_t MSG_comm_wait(msg_comm_t comm, double timeout)
   }
   CATCH(e) {
     switch (e.category) {
-    case host_error:
-      comm->status = MSG_HOST_FAILURE;
-      break;
     case network_error:
       comm->status = MSG_TRANSFER_FAILURE;
       break;
@@ -701,12 +583,6 @@ int MSG_comm_waitany(xbt_dynar_t comms)
   }
   CATCH(e) {
     switch (e.category) {
-
-      case host_error:
-        finished_index = e.value;
-        status = MSG_HOST_FAILURE;
-        break;
-
       case network_error:
         finished_index = e.value;
         status = MSG_TRANSFER_FAILURE;