X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/de29f3985505e3db5a0aba8d0ef844f21e971f11..2aadff70152b2c1953b5776045da0ad05b5ac44d:/src/msg/msg_task.cpp diff --git a/src/msg/msg_task.cpp b/src/msg/msg_task.cpp index 7463547b7c..fe32c4b8bb 100644 --- a/src/msg/msg_task.cpp +++ b/src/msg/msg_task.cpp @@ -7,12 +7,28 @@ #include "src/simix/smx_private.hpp" #include #include -#include #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_task, msg, "Logging specific to MSG (task)"); -void s_simdata_task_t::reportMultipleUse() const +namespace simgrid { +namespace msg { +Task::~Task() +{ + /* parallel tasks only */ + delete[] host_list; + delete[] flops_parallel_amount; + delete[] bytes_parallel_amount; +} + +void Task::set_used() +{ + if (this->is_used) + this->report_multiple_use(); + this->is_used = true; +} + +void Task::report_multiple_use() const { if (msg_global->debug_multiple_use){ XBT_ERROR("This task is already used in there:"); @@ -25,6 +41,8 @@ void s_simdata_task_t::reportMultipleUse() const "(use --cfg=msg/debug-multiple-use:on to get the backtrace of the other process)"); } } +} // namespace msg +} // namespace simgrid /********************************* Task **************************************/ /** @brief Creates a new task @@ -42,27 +60,7 @@ void s_simdata_task_t::reportMultipleUse() const */ msg_task_t MSG_task_create(const char *name, double flop_amount, double message_size, void *data) { - static std::atomic_ullong counter{0}; - - msg_task_t task = new s_msg_task_t; - simdata_task_t simdata = new s_simdata_task_t(); - task->simdata = simdata; - - /* Task structure */ - task->name = xbt_strdup(name); - task->data = data; - - /* Simulator Data */ - simdata->bytes_amount = message_size; - simdata->flops_amount = flop_amount; - - task->counter = counter++; - task->category = nullptr; - - if (MC_is_active()) - MC_ignore_heap(&(task->counter), sizeof(task->counter)); - - return task; + return new simgrid::msg::Task(name ? name : "", flop_amount, message_size, data); } /** @brief Creates a new parallel task @@ -90,34 +88,33 @@ msg_task_t MSG_parallel_task_create(const char *name, int host_nb, const msg_hos // Task's flops amount is set to an arbitrary value > 0.0 to be able to distinguish, in // MSG_task_get_remaining_work_ratio(), a finished task and a task that has not started yet. msg_task_t task = MSG_task_create(name, 1.0, 0, data); - simdata_task_t simdata = task->simdata; /* Simulator Data specific to parallel tasks */ - simdata->host_nb = host_nb; - simdata->host_list = new sg_host_t[host_nb]; - std::copy_n(host_list, host_nb, simdata->host_list); + task->host_nb = host_nb; + task->host_list = new sg_host_t[host_nb]; + std::copy_n(host_list, host_nb, task->host_list); if (flops_amount != nullptr) { - simdata->flops_parallel_amount = new double[host_nb]; - std::copy_n(flops_amount, host_nb, simdata->flops_parallel_amount); + task->flops_parallel_amount = new double[host_nb]; + std::copy_n(flops_amount, host_nb, task->flops_parallel_amount); } if (bytes_amount != nullptr) { - simdata->bytes_parallel_amount = new double[host_nb * host_nb]; - std::copy_n(bytes_amount, host_nb * host_nb, simdata->bytes_parallel_amount); + task->bytes_parallel_amount = new double[host_nb * host_nb]; + std::copy_n(bytes_amount, host_nb * host_nb, task->bytes_parallel_amount); } return task; } /** @brief Return the user data of the given task */ -void *MSG_task_get_data(msg_task_t task) +void* MSG_task_get_data(msg_task_t task) { - return (task->data); + return task->get_user_data(); } /** @brief Sets the user data of a given task */ void MSG_task_set_data(msg_task_t task, void *data) { - task->data = data; + task->set_user_data(data); } /** @brief Sets a function to be called when a task has just been copied. @@ -137,25 +134,25 @@ void MSG_task_set_copy_callback(void (*callback) (msg_task_t task, msg_process_t /** @brief Returns the sender of the given task */ msg_process_t MSG_task_get_sender(msg_task_t task) { - return task->simdata->sender; + return task->sender; } /** @brief Returns the source (the sender's host) of the given task */ msg_host_t MSG_task_get_source(msg_task_t task) { - return task->simdata->source; + return task->sender->get_host(); } /** @brief Returns the name of the given task. */ const char *MSG_task_get_name(msg_task_t task) { - return task->name; + return task->get_cname(); } /** @brief Sets the name of the given task. */ void MSG_task_set_name(msg_task_t task, const char *name) { - task->name = xbt_strdup(name); + task->set_name(name); } /** @brief Destroys the given task. @@ -170,16 +167,12 @@ void MSG_task_set_name(msg_task_t task, const char *name) */ msg_error_t MSG_task_destroy(msg_task_t task) { - if (task->simdata->isused) { + if (task->is_used) { /* the task is being sent or executed: cancel it first */ MSG_task_cancel(task); } - xbt_free(task->category); - xbt_free(task->name); - /* free main structures */ - delete task->simdata; delete task; return MSG_OK; @@ -193,13 +186,12 @@ msg_error_t MSG_task_cancel(msg_task_t task) { xbt_assert((task != nullptr), "Cannot cancel a nullptr task"); - simdata_task_t simdata = task->simdata; - if (simdata->compute) { - simgrid::simix::simcall([simdata] { simdata->compute->cancel(); }); - } else if (simdata->comm) { - simdata->comm->cancel(); + if (task->compute) { + simgrid::simix::simcall([task] { task->compute->cancel(); }); + } else if (task->comm) { + task->comm->cancel(); } - simdata->setNotUsed(); + task->set_not_used(); return MSG_OK; } @@ -211,12 +203,12 @@ msg_error_t MSG_task_cancel(msg_task_t task) double MSG_task_get_remaining_work_ratio(msg_task_t task) { xbt_assert((task != nullptr), "Cannot get information from a nullptr task"); - if (task->simdata->compute) { + if (task->compute) { // Task in progress - return task->simdata->compute->get_remaining_ratio(); + return task->compute->get_remaining_ratio(); } else { // Task not started (flops_amount is > 0.0) or finished (flops_amount is set to 0.0) - return task->simdata->flops_amount > 0.0 ? 1.0 : 0.0; + return task->flops_amount > 0.0 ? 1.0 : 0.0; } } @@ -228,13 +220,13 @@ double MSG_task_get_remaining_work_ratio(msg_task_t task) { * So you will get an exception if you call this function on parallel tasks. Just don't do it. */ double MSG_task_get_flops_amount(msg_task_t task) { - if (task->simdata->compute != nullptr) { - return task->simdata->compute->get_remaining(); + if (task->compute != nullptr) { + return task->compute->get_remaining(); } else { // Not started or already done. // - Before starting, flops_amount is initially the task cost // - After execution, flops_amount is set to 0 (until someone uses MSG_task_set_flops_amount, if any) - return task->simdata->flops_amount; + return task->flops_amount; } } @@ -246,7 +238,7 @@ double MSG_task_get_flops_amount(msg_task_t task) { */ void MSG_task_set_flops_amount(msg_task_t task, double flops_amount) { - task->simdata->flops_amount = flops_amount; + task->flops_amount = flops_amount; } /** @brief set the amount data attached with the given task. @@ -255,7 +247,7 @@ void MSG_task_set_flops_amount(msg_task_t task, double flops_amount) */ void MSG_task_set_bytes_amount(msg_task_t task, double data_size) { - task->simdata->bytes_amount = data_size; + task->bytes_amount = data_size; } /** @brief Returns the total amount received by the given task @@ -265,15 +257,15 @@ void MSG_task_set_bytes_amount(msg_task_t task, double data_size) */ double MSG_task_get_remaining_communication(msg_task_t task) { - XBT_DEBUG("calling simcall_communication_get_remains(%p)", task->simdata->comm.get()); - return task->simdata->comm->get_remaining(); + XBT_DEBUG("calling simcall_communication_get_remains(%p)", task->comm.get()); + return task->comm->get_remaining(); } /** @brief Returns the size of the data attached to the given task. */ double MSG_task_get_bytes_amount(msg_task_t task) { - xbt_assert((task != nullptr) && (task->simdata != nullptr), "Invalid parameter"); - return task->simdata->bytes_amount; + xbt_assert(task != nullptr, "Invalid parameter"); + return task->bytes_amount; } /** @brief Changes the priority of a computation task. @@ -283,10 +275,8 @@ double MSG_task_get_bytes_amount(msg_task_t task) */ void MSG_task_set_priority(msg_task_t task, double priority) { - task->simdata->priority = 1 / priority; - xbt_assert(std::isfinite(task->simdata->priority), "priority is not finite!"); - if (task->simdata->compute) - simgrid::simix::simcall([task] { task->simdata->compute->set_priority(task->simdata->priority); }); + task->priority = 1 / priority; + xbt_assert(std::isfinite(task->priority), "priority is not finite!"); } /** @brief Changes the maximum CPU utilization of a computation task (in flops/s). @@ -297,8 +287,5 @@ void MSG_task_set_bound(msg_task_t task, double bound) { if (bound < 1e-12) /* close enough to 0 without any floating precision surprise */ XBT_INFO("bound == 0 means no capping (i.e., unlimited)."); - - task->simdata->bound = bound; - if (task->simdata->compute) - simgrid::simix::simcall([task, bound] { task->simdata->compute->set_bound(bound); }); + task->bound = bound; }