Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
rename smx_action_t to smx_synchro_t
[simgrid.git] / src / msg / msg_task.c
index 522e553..2488dac 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -10,8 +10,8 @@
 #include "xbt/log.h"
 
 /** @addtogroup m_task_management
- *    
- * 
+ *
+ *
  *  Since most scheduling algorithms rely on a concept of task
  *  that can be either <em>computed</em> locally or
  *  <em>transferred</em> on another processor, it seems to be the
@@ -266,7 +266,7 @@ void MSG_task_set_name(msg_task_t task, const char *name)
  */
 msg_error_t MSG_task_destroy(msg_task_t task)
 {
-  smx_action_t action = NULL;
+  smx_synchro_t action = NULL;
   xbt_assert((task != NULL), "Invalid parameter");
 
   if (task->simdata->isused) {
@@ -309,8 +309,11 @@ msg_error_t MSG_task_cancel(msg_task_t task)
     simcall_host_execution_cancel(task->simdata->compute);
   }
   else if (task->simdata->comm) {
-    simcall_comm_cancel(task->simdata->comm);
-    task->simdata->isused = 0;
+    simdata_task_t simdata = task->simdata;
+    simcall_comm_cancel(simdata->comm);
+    if (msg_global->debug_multiple_use && simdata->isused!=0)
+      xbt_ex_free(*(xbt_ex_t*)simdata->isused);
+    simdata->isused = 0;
   }
   return MSG_OK;
 }
@@ -351,7 +354,7 @@ void MSG_task_set_compute_duration(msg_task_t task,
  * \brief set the amount data attached with a task #msg_task_t.
  *
  * \warning If the transfer is ongoing (already started and not finished),
- * it is not modified by this call. 
+ * it is not modified by this call.
  */
 
 void MSG_task_set_data_size(msg_task_t task,
@@ -428,7 +431,7 @@ double MSG_task_get_data_size(msg_task_t task)
 
 
 /** \ingroup m_task_management
- * \brief Changes the priority of a computation task. This priority doesn't affect 
+ * \brief Changes the priority of a computation task. This priority doesn't affect
  *        the transfer rate. A priority of 2 will make a task receive two times more
  *        cpu power than the other ones.
  *
@@ -475,7 +478,23 @@ void MSG_task_set_bound(msg_task_t task, double bound)
  *
  * \param task a target task
  * \param host the host having a multi-core CPU
- * \param mask the value specifying the CPU affinity setting of the task
+ * \param mask the bit mask of a new CPU affinity setting for the task
+ *
+ *
+ * Usage:
+ * 0. Define a host with multiple cores.
+ *    \<host id="PM0" power="1E8" core="2"/\>
+ *
+ * 1. Pin a given task to the first CPU core of a host.
+ *   MSG_task_set_affinity(task, pm0, 0x01);
+ *
+ * 2. Pin a given task to the third CPU core of a host. Turn on the third bit of the mask.
+ *   MSG_task_set_affinity(task, pm0, 0x04); // 0x04 == 100B
+ *
+ * 3. Pin a given VM to the first CPU core of a host.
+ *   MSG_vm_set_affinity(vm, pm0, 0x01);
+ *
+ * See examples/msg/cloud/multicore.c for more information.
  *
  *
  * Note:
@@ -496,7 +515,12 @@ void MSG_task_set_affinity(msg_task_t task, msg_host_t host, unsigned long mask)
 
   if (mask == 0) {
     /* 0 means clear */
-    xbt_dict_remove_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host));
+    {
+      /* We need remove_ext() not throwing exception. */
+      void *ret = xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t));
+      if (ret != NULL)
+        xbt_dict_remove_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host));
+    }
   } else
     xbt_dict_set_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host), (void *) mask, NULL);
 
@@ -511,7 +535,7 @@ void MSG_task_set_affinity(msg_task_t task, msg_host_t host, unsigned long mask)
   }
 
   {
-    smx_action_t compute = task->simdata->compute;
+    smx_synchro_t compute = task->simdata->compute;
     msg_host_t host_now = compute->execution.host;  // simix_private.h is necessary
     if (host_now != host) {
       /* task is not yet executed on this host */
@@ -522,8 +546,7 @@ void MSG_task_set_affinity(msg_task_t task, msg_host_t host, unsigned long mask)
     /* task is being executed on this host. so change the affinity now */
     {
       /* check it works. remove me if it works. */
-      unsigned long affinity_mask = (unsigned long) xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t));
-      xbt_assert(affinity_mask == mask);
+      xbt_assert((unsigned long) xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t)) == mask);
     }
 
     XBT_INFO("set affinity(0x%04lx@%s) for %s", mask, MSG_host_get_name(host), MSG_task_get_name(task));