X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b556a0d912f836b6a661d7d1e1617f9d949e9f98..abf7c33aff8279f498000149d39448946c3297b3:/src/msg/msg_task.c
diff --git a/src/msg/msg_task.c b/src/msg/msg_task.c
index f995d10d64..2488dac1ef 100644
--- a/src/msg/msg_task.c
+++ b/src/msg/msg_task.c
@@ -1,4 +1,4 @@
-/* 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
@@ -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 computed locally or
* transferred 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.
*
@@ -480,7 +483,7 @@ void MSG_task_set_bound(msg_task_t task, double bound)
*
* Usage:
* 0. Define a host with multiple cores.
- *
+ * \
*
* 1. Pin a given task to the first CPU core of a host.
* MSG_task_set_affinity(task, pm0, 0x01);
@@ -512,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);
@@ -527,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 */
@@ -538,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));