#define _SURF_SURF_H
#include "xbt/swag.h"
-#include "xbt/heap.h" /* for xbt_heap_float_t only */
-#include "surf/maxmin.h" /* for xbt_maxmin_float_t only */
/* Actions and resources are higly connected structures... */
typedef struct surf_action *surf_action_t;
s_xbt_swag_hookup_t state_hookup;
xbt_swag_t state_set;
xbt_maxmin_float_t cost; /* cost */
+ xbt_maxmin_float_t max_duration;/* max_duration (may fluctuate until
+ the task is completed) */
xbt_maxmin_float_t remains; /* How much of that cost remains to
* be done in the currently running task */
xbt_heap_float_t start; /* start time */
*surf_cpu_resource_extension_private_t;
typedef struct surf_cpu_resource_extension_public {
surf_action_t(*execute) (void *cpu, xbt_maxmin_float_t size);
- surf_action_t(*wait) (void *cpu, xbt_maxmin_float_t size);
+ surf_action_t(*sleep) (void *cpu, xbt_maxmin_float_t duration);
+ void (*suspend) (surf_action_t action);
+ void (*resume) (surf_action_t action);
e_surf_cpu_state_t(*get_state) (void *cpu);
} s_surf_cpu_resource_extension_public_t,
*surf_cpu_resource_extension_public_t;
*surf_workstation_resource_extension_private_t;
typedef struct surf_workstation_resource_extension_public {
surf_action_t(*execute) (void *workstation, xbt_maxmin_float_t size);
- surf_action_t(*wait) (void *workstation, xbt_maxmin_float_t size);
+ surf_action_t(*sleep) (void *workstation, xbt_maxmin_float_t duration);
e_surf_cpu_state_t(*get_state) (void *workstation);
surf_action_t(*communicate) (void *workstation_src,
void *workstation_dst,
static xbt_heap_float_t share_resources(xbt_heap_float_t now)
{
- surf_action_cpu_t action = NULL;
- xbt_swag_t running_actions =
- surf_cpu_resource->common_public->states.running_action_set;
- xbt_maxmin_float_t min = -1;
- xbt_maxmin_float_t value = -1;
- lmm_solve(maxmin_system);
-
- action = xbt_swag_getFirst(running_actions);
- if (!action)
- return -1.0;
- value = lmm_variable_getvalue(action->variable);
- min = action->generic_action.remains / value;
-
- xbt_swag_foreach(action, running_actions) {
- value = action->generic_action.remains /
- lmm_variable_getvalue(action->variable);
- if (value < min)
- min = value;
- }
-
- return min;
+ s_surf_action_cpu_t action;
+ return generic_maxmin_share_resources(surf_cpu_resource->common_public->states.running_action_set,
+ xbt_swag_offset(action,variable));
}
static void update_actions_state(xbt_heap_float_t now,
xbt_swag_foreach_safe(action, next_action, running_actions) {
action->generic_action.remains -=
lmm_variable_getvalue(action->variable) * delta;
+ if(action->generic_action.max_duration!=NO_MAX_DURATION)
+ action->generic_action.max_duration -= delta;
/* if(action->generic_action.remains<.00001) action->generic_action.remains=0; */
if (action->generic_action.remains <= 0) {
+ action->generic_action.finish = surf_get_clock();
action_change_state((surf_action_t) action, SURF_ACTION_DONE);
+ } else if((action->generic_action.max_duration!=NO_MAX_DURATION) &&
+ (action->generic_action.max_duration<=0)) {
+ action->generic_action.finish = surf_get_clock();
+ action_change_state((surf_action_t) action, SURF_ACTION_DONE);
} else { /* Need to check that none of the resource has failed */
lmm_constraint_t cnst = NULL;
int i = 0;
i++))) {
cpu = lmm_constraint_id(cnst);
if (cpu->state_current == SURF_CPU_OFF) {
+ action->generic_action.finish = surf_get_clock();
action_change_state((surf_action_t) action, SURF_ACTION_FAILED);
break;
}
action->generic_action.cost = size;
action->generic_action.remains = size;
- action->generic_action.start = -1.0;
+ action->generic_action.max_duration = NO_MAX_DURATION;
+ action->generic_action.start = surf_get_clock();
action->generic_action.finish = -1.0;
/* action->generic_action.callback = cpu; */
action->generic_action.callback = NULL;
return (surf_action_t) action;
}
+static surf_action_t action_sleep(void *cpu, xbt_maxmin_float_t duration)
+{
+ surf_action_cpu_t action = NULL;
+
+ action = (surf_action_cpu_t) execute(cpu, 1.0);
+ action->generic_action.max_duration = duration;
+ lmm_update_variable_weight(maxmin_system, action->variable, 0.0);
+
+ return (surf_action_t) action;
+}
+
+static void action_suspend(surf_action_t action)
+{
+ lmm_update_variable_weight(maxmin_system, ((surf_action_cpu_t) action)->variable, 0.0);
+}
+
+static void action_resume(surf_action_t action)
+{
+ lmm_update_variable_weight(maxmin_system, ((surf_action_cpu_t) action)->variable, 1.0);
+}
+
static e_surf_cpu_state_t get_state(void *cpu)
{
return ((cpu_t) cpu)->state_current;
surf_cpu_resource->common_private =
xbt_new0(s_surf_resource_private_t, 1);
surf_cpu_resource->common_public = xbt_new0(s_surf_resource_public_t, 1);
-/* surf_cpu_resource->extension_private = xbt_new0(s_surf_cpu_resource_extension_private_t,1); */
+
surf_cpu_resource->extension_public =
xbt_new0(s_surf_cpu_resource_extension_public_t, 1);
surf_cpu_resource->common_private->finalize = finalize;
surf_cpu_resource->extension_public->execute = execute;
+ surf_cpu_resource->extension_public->sleep = action_sleep;
+ surf_cpu_resource->extension_public->suspend = action_suspend;
+ surf_cpu_resource->extension_public->resume = action_resume;
+
surf_cpu_resource->extension_public->get_state = get_state;
cpu_set = xbt_dict_new();
static xbt_heap_float_t share_resources(xbt_heap_float_t now)
{
- surf_action_network_t action = NULL;
- xbt_swag_t running_actions =
- surf_network_resource->common_public->states.running_action_set;
- xbt_maxmin_float_t min = -1;
- xbt_maxmin_float_t value = -1;
- lmm_solve(maxmin_system);
-
- action = xbt_swag_getFirst(running_actions);
- if (!action)
- return -1.0;
- value = lmm_variable_getvalue(action->variable);
- min = action->generic_action.remains / value;
-
- xbt_swag_foreach(action, running_actions) {
- value = action->latency + (action->generic_action.remains /
- lmm_variable_getvalue(action->variable));
- if (value < min)
- min = value;
- }
-
- return min;
+ s_surf_action_network_t action;
+ return generic_maxmin_share_resources(surf_network_resource->common_public->states.running_action_set,
+ xbt_swag_offset(action,variable));
}
}
action->generic_action.remains -=
lmm_variable_getvalue(action->variable) * deltap;
+ if(action->generic_action.max_duration!=NO_MAX_DURATION)
+ action->generic_action.max_duration -= delta;
/* if(action->generic_action.remains<.00001) action->generic_action.remains=0; */
if (action->generic_action.remains <= 0) {
+ action->generic_action.finish = surf_get_clock();
action_change_state((surf_action_t) action, SURF_ACTION_DONE);
+ } else if((action->generic_action.max_duration!=NO_MAX_DURATION) &&
+ (action->generic_action.max_duration<=0)) {
+ action->generic_action.finish = surf_get_clock();
+ action_change_state((surf_action_t) action, SURF_ACTION_DONE);
} else { /* Need to check that none of the resource has failed */
lmm_constraint_t cnst = NULL;
int i = 0;
i++))) {
nw_link = lmm_constraint_id(cnst);
if (nw_link->state_current == SURF_NETWORK_LINK_OFF) {
+ action->generic_action.finish = surf_get_clock();
action_change_state((surf_action_t) action, SURF_ACTION_FAILED);
break;
}
action->generic_action.cost = size;
action->generic_action.remains = size;
+ action->generic_action.max_duration = NO_MAX_DURATION;
action->generic_action.start = -1.0;
action->generic_action.finish = -1.0;
action->generic_action.callback = NULL;
tmgr_history_t history = NULL;
lmm_system_t maxmin_system = NULL;
+xbt_heap_float_t generic_maxmin_share_resources(xbt_swag_t running_actions,
+ size_t offset)
+{
+ surf_action_t action = NULL;
+ xbt_maxmin_float_t min = -1;
+ xbt_maxmin_float_t value = -1;
+#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
+
+ lmm_solve(maxmin_system);
+
+ xbt_swag_foreach(action, running_actions) {
+ value = lmm_variable_getvalue(VARIABLE(action));
+ if((value>0) || (action->max_duration>=0)) break;
+ }
+
+ if (!action)
+ return -1.0;
+
+ if(value>0) {
+ min = value = action->remains / value;
+ if((action->max_duration>=0) &&
+ (action->max_duration<min))
+ min = action->max_duration;
+ } else min = action->max_duration;
+
+
+ for(action=xbt_swag_getNext(action,running_actions->offset);
+ action;
+ action=xbt_swag_getNext(action,running_actions->offset)) {
+ value = lmm_variable_getvalue(VARIABLE(action));
+ if(value>0) {
+ value = action->remains / value;
+ if (value < min) min = value;
+ }
+ if((action->max_duration>=0) &&
+ (action->max_duration<min))
+ min = action->max_duration;
+ }
+#undef VARIABLE
+ return min;
+}
+
e_surf_action_state_t surf_action_get_state(surf_action_t action)
{
surf_action_state_t action_state = &(action->resource_type->common_public->states);
#include "xbt/log.h"
#include "surf/surf_parse.h"
+#define NO_MAX_DURATION -1.0
+
typedef struct surf_resource_private {
int (*resource_used)(void *resource_id);
/* Share the resources to the actions and return in hom much time
/* #define pub2priv(r) ((surf_resource_private_t) ((char *)(r) -(sizeof(struct surf_resource_private_part)))) */
/* #define priv2pub(r) ((void *) ((char *)(r) +(sizeof(struct surf_resource_private_part)))) */
+xbt_heap_float_t generic_maxmin_share_resources(xbt_swag_t running_actions,
+ size_t offset);
/* Generic functions common to all ressources */
e_surf_action_state_t surf_action_get_state(surf_action_t action);
void surf_action_free(surf_action_t * action);
void *cardB = NULL;
surf_action_t actionA = NULL;
surf_action_t actionB = NULL;
+ surf_action_t actionC = NULL;
surf_action_t commAB = NULL;
e_surf_action_state_t stateActionA;
e_surf_action_state_t stateActionB;
+ e_surf_action_state_t stateActionC;
xbt_maxmin_float_t now = -1.0;
surf_cpu_resource_init("platform.txt"); /* Now it is possible to use CPUs */
/* Let's do something on it */
actionA = surf_cpu_resource->extension_public->execute(cpuA, 1000.0);
actionB = surf_cpu_resource->extension_public->execute(cpuB, 1000.0);
+ actionC = surf_cpu_resource->extension_public->sleep(cpuB, 7.32);
/* Use whatever calling style you want... */
stateActionA = surf_cpu_resource->common_public->action_get_state(actionA); /* When you know actionA resource type */
stateActionB = actionB->resource_type->common_public->action_get_state(actionB); /* If you're unsure about it's resource type */
+ stateActionC = surf_cpu_resource->common_public->action_get_state(actionC); /* When you know actionA resource type */
- /* And just look at the stat of these tasks */
+ /* And just look at the state of these tasks */
printf("actionA : %p (%s)\n", actionA, string_action(stateActionA));
printf("actionB : %p (%s)\n", actionB, string_action(stateActionB));
+ printf("actionC : %p (%s)\n", actionB, string_action(stateActionC));
/*********************** Network *******************************/
printf("%p \n", surf_network_resource);