s_xbt_swag_hookup_t state_hookup;
xbt_swag_t state_set;
double cost; /* cost */
+ double priority; /* priority (1.0 by default) */
double max_duration; /* max_duration (may fluctuate until
the task is completed) */
double remains; /* How much of that cost remains to
void (*resume) (surf_action_t action);
int (*is_suspended) (surf_action_t action);
void (*set_max_duration) (surf_action_t action, double duration);
+ void (*set_priority) (surf_action_t action, double priority);
const char *name;
} s_surf_resource_public_t, *surf_resource_public_t;
* by an agent for handling some task.
*/
-/* \ingroup msg_gos_functions
- * \brief This function is now deprecated and useless. Please stop using it.
- */
-MSG_error_t MSG_process_start(m_process_t process)
-{
- xbt_assert0(0,"This function is now deprecated and useless. Please stop using it.");
-
- return MSG_OK;
-}
-
/** \ingroup msg_gos_functions
* \brief Listen on a channel and wait for receiving a task.
*
simdata->compute = surf_workstation_resource->extension_public->
execute(MSG_process_get_host(process)->simdata->host,
simdata->computation_amount);
+ surf_workstation_resource->common_public->
+ set_priority(simdata->compute, simdata->priority);
+
surf_workstation_resource->common_public->action_set_data(simdata->compute,task);
}
double computation_amount; /* Computation size */
xbt_dynar_t sleeping; /* process to wake-up */
m_process_t sender;
+ double priority;
double rate;
int using;
/******* Parallel Tasks Only !!!! *******/
simdata->computation_amount = compute_duration;
simdata->message_size = message_size;
simdata->rate = -1.0;
+ simdata->priority = 1.0;
simdata->using = 1;
simdata->sender = NULL;
return task->simdata->message_size;
}
-/* static MSG_error_t __MSG_task_check(m_task_t task) */
-/* { */
-/* simdata_task_t simdata = NULL; */
-/* int warning = 0; */
-
-/* if (task == NULL) { /\* Fatal *\/ */
-/* WARNING("Task uninitialized"); */
-/* return MSG_FATAL; */
-/* } */
-/* simdata = task->simdata; */
-
-/* if (simdata == NULL) { /\* Fatal *\/ */
-/* WARNING("Simulator Data uninitialized"); */
-/* return MSG_FATAL; */
-/* } */
-
-/* if (simdata->compute == NULL) { /\* Fatal if execute ... *\/ */
-/* WARNING("No duration set for this task"); */
-/* warning++; */
-/* } */
-
-/* if (simdata->message_size == 0) { /\* Fatal if transfered ... *\/ */
-/* WARNING("No message_size set for this task"); */
-/* warning++; */
-/* } */
-
-/* /\* if (task->data == NULL) { *\/ */
-/* /\* WARNING("User Data uninitialized"); *\/ */
-/* /\* warning++; *\/ */
-/* /\* } *\/ */
-
-/* if (warning) */
-/* return MSG_WARNING; */
-/* return MSG_OK; */
-/* } */
-
-/* static m_task_t __MSG_task_copy(m_task_t src) */
-/* { */
-/* m_task_t copy = NULL; */
-/* simdata_task_t simdata = NULL; */
-
-/* __MSG_task_check(src); */
-
-/* simdata = src->simdata; */
-/* copy = MSG_task_create(src->name, SG_getTaskCost(simdata->compute), */
-/* simdata->message_size, MSG_task_get_data(src)); */
-
-/* return (copy); */
-/* } */
-
MSG_error_t __MSG_task_wait_event(m_process_t process, m_task_t task)
{
int _cursor;
return MSG_OK;
}
+
+
+/** \ingroup m_task_management
+ * \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.
+ *
+ */
+void MSG_task_set_priority(m_task_t task, double priority) {
+ xbt_assert0((task != NULL) && (task->simdata != NULL), "Invalid parameter");
+
+ task->simdata->priority = 1/priority;
+ if(task->simdata->compute)
+ surf_workstation_resource->common_public->
+ set_priority(task->simdata->compute, task->simdata->priority);
+}
action->generic_action.using = 1;
action->generic_action.cost = size;
action->generic_action.remains = size;
+ action->generic_action.priority = 1.0;
action->generic_action.max_duration = NO_MAX_DURATION;
action->generic_action.start = surf_get_clock();
action->generic_action.finish = -1.0;
surf_cpu_resource->common_public->states.failed_action_set;
xbt_swag_insert(action, action->generic_action.state_set);
- action->variable = lmm_variable_new(maxmin_system, action, 1.0, -1.0, 1);
+ action->variable = lmm_variable_new(maxmin_system, action,
+ action->generic_action.priority, -1.0, 1);
lmm_expand(maxmin_system, CPU->constraint, action->variable,
1.0);
static void action_resume(surf_action_t action)
{
lmm_update_variable_weight(maxmin_system,
- ((surf_action_cpu_Cas01_t) action)->variable, 1.0);
+ ((surf_action_cpu_Cas01_t) action)->variable,
+ action->priority);
}
static int action_is_suspended(surf_action_t action)
action->max_duration = duration;
}
+static void action_set_priority(surf_action_t action, double priority)
+{
+ action->priority = priority;
+}
+
static e_surf_cpu_state_t get_state(void *cpu)
{
return ((cpu_Cas01_t) cpu)->state_current;
surf_cpu_resource->common_public->resume = action_resume;
surf_cpu_resource->common_public->is_suspended = action_is_suspended;
surf_cpu_resource->common_public->set_max_duration = action_set_max_duration;
-
+ surf_cpu_resource->common_public->set_priority = action_set_priority;
surf_cpu_resource->extension_public->execute = execute;
surf_cpu_resource->extension_public->sleep = action_sleep;
surf_cpu_resource->common_public->set_max_duration(action,duration);
else DIE_IMPOSSIBLE;
}
+
+static void action_set_priority(surf_action_t action, double priority)
+{
+ if(action->resource_type==(surf_resource_t)surf_network_resource)
+ surf_network_resource->common_public->set_priority(action,priority);
+ else if(action->resource_type==(surf_resource_t)surf_cpu_resource)
+ surf_cpu_resource->common_public->set_priority(action,priority);
+ else DIE_IMPOSSIBLE;
+}
static surf_action_t communicate(void *workstation_src,
void *workstation_dst, double size,
surf_workstation_resource->common_public->resume = action_resume;
surf_workstation_resource->common_public->is_suspended = action_is_suspended;
surf_workstation_resource->common_public->set_max_duration = action_set_max_duration;
+ surf_workstation_resource->common_public->set_priority = action_set_priority;
surf_workstation_resource->extension_public->execute = execute;
surf_workstation_resource->extension_public->sleep = action_sleep;