-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. 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
#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
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;
}
* \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,
/** \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.
*
*
* \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:
+ * 1. The current code does not allow an affinity of a task to multiple cores.
+ * The mask value 0x03 (i.e., a given task will be executed on the first core
+ * or the second core) is not allowed. The mask value 0x01 or 0x02 works. See
+ * cpu_cas01.c for details.
+ *
+ * 2. It is recommended to first compare simulation results in both the Lazy
+ * and Full calculation modes (using --cfg=cpu/optim:Full or not). Fix
+ * cpu_cas01.c if you find wrong results in the Lazy mode.
*
*/
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);