From: alegrand Date: Tue, 9 Aug 2005 00:25:38 +0000 (+0000) Subject: adding a priority mechanism X-Git-Tag: v3.3~3715 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/a2102287f9953ee825e0fce70d3aaa7a2e851493 adding a priority mechanism git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1641 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 7d46330238..f397c95cf5 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -41,6 +41,7 @@ typedef struct surf_action { 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 @@ -75,6 +76,7 @@ typedef struct surf_resource_public { 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; diff --git a/src/msg/gos.c b/src/msg/gos.c index c7e34c24a7..8262b62ad5 100644 --- a/src/msg/gos.c +++ b/src/msg/gos.c @@ -16,16 +16,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gos, msg, * 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. * @@ -409,6 +399,9 @@ void __MSG_task_execute(m_process_t process, m_task_t 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); } diff --git a/src/msg/private.h b/src/msg/private.h index 05bc2c2476..7616d247e3 100644 --- a/src/msg/private.h +++ b/src/msg/private.h @@ -36,6 +36,7 @@ typedef struct simdata_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 !!!! *******/ diff --git a/src/msg/task.c b/src/msg/task.c index 75b98041a7..c353d75047 100644 --- a/src/msg/task.c +++ b/src/msg/task.c @@ -59,6 +59,7 @@ m_task_t MSG_task_create(const char *name, double compute_duration, simdata->computation_amount = compute_duration; simdata->message_size = message_size; simdata->rate = -1.0; + simdata->priority = 1.0; simdata->using = 1; simdata->sender = NULL; @@ -192,56 +193,6 @@ double MSG_task_get_data_size(m_task_t task) { 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; @@ -261,3 +212,19 @@ MSG_error_t __MSG_task_wait_event(m_process_t process, m_task_t task) 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); +} diff --git a/src/surf/cpu.c b/src/surf/cpu.c index c8f7b3eaaa..f3d7fe4411 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -228,6 +228,7 @@ static surf_action_t execute(void *cpu, double size) 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; @@ -242,7 +243,8 @@ static surf_action_t execute(void *cpu, double size) 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); @@ -269,7 +271,8 @@ static void action_suspend(surf_action_t action) 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) @@ -282,6 +285,11 @@ static void action_set_max_duration(surf_action_t action, double duration) 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; @@ -356,7 +364,7 @@ static void surf_cpu_resource_init_internal(void) 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; diff --git a/src/surf/workstation.c b/src/surf/workstation.c index b50cddad6e..fc6a97eb73 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -262,6 +262,15 @@ static void action_set_max_duration(surf_action_t action, double duration) 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, @@ -444,6 +453,7 @@ static void surf_workstation_resource_init_internal(void) 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;