/** \ingroup m_task_management * \brief Destroy a #msg_task_t. * * Destructor for #msg_task_t. Note that you should free user data, if any, \b * before calling this function. * * Only the process that owns the task can destroy it. * The owner changes after a successful send. * If a task is successfully sent, the receiver becomes the owner and is * supposed to destroy it. The sender should not use it anymore. * If the task failed to be sent, the sender remains the owner of the task. */ msg_error_t MSG_task_destroy(msg_task_t task) { smx_synchro_t action = NULL; xbt_assert((task != NULL), "Invalid parameter"); if (task->simdata->isused) { /* the task is being sent or executed: cancel it first */ MSG_task_cancel(task); } TRACE_msg_task_destroy(task); xbt_free(task->name); action = task->simdata->compute; if (action) simcall_process_execution_destroy(action); /* parallel tasks only */ xbt_free(task->simdata->host_list); xbt_dict_free(&task->simdata->affinity_mask_db); /* free main structures */ xbt_free(task->simdata); xbt_free(task); return MSG_OK; }
/** \ingroup m_task_management * \brief Destroy a #msg_task_t. * * Destructor for #msg_task_t. Note that you should free user data, if any, \b before calling this function. * * Only the process that owns the task can destroy it. * The owner changes after a successful send. * If a task is successfully sent, the receiver becomes the owner and is supposed to destroy it. The sender should not * use it anymore. * If the task failed to be sent, the sender remains the owner of the task. */ msg_error_t MSG_task_destroy(msg_task_t task) { if (task->simdata->isused) { /* the task is being sent or executed: cancel it first */ MSG_task_cancel(task); } TRACE_msg_task_destroy(task); xbt_free(task->name); /* free main structures */ delete task->simdata; xbt_free(task); return MSG_OK; }