#include "xbt/dict.h"
#include "workstation_KCCFLN05_private.h"
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(workstation_KCCFLN05, surf,
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf,
"Logging specific to the SURF workstation module (KCCFLN05)");
static int nb_workstation = 0;
#define ROUTE(i,j) routing_table[(i)+(j)*nb_workstation]
static network_link_KCCFLN05_t loopback = NULL;
-static xbt_dict_t network_link_set = NULL;
+/*xbt_dict_t network_link_set = NULL;*/
/* convenient function */
static void __update_cpu_usage(cpu_KCCFLN05_t cpu)
lmm_variable_free(maxmin_system,
((surf_action_workstation_KCCFLN05_t) action)->
variable);
-
- if(src) {
+ if(src)
xbt_dynar_foreach(src->outgoing_communications, cpt, act)
if (act == action) {
xbt_dynar_remove_at(src->outgoing_communications, cpt, &act);
-
break;
}
- if(!xbt_dynar_length(src->outgoing_communications))
- __update_cpu_usage(src);
- }
- if(dst) {
+
+ if(dst)
xbt_dynar_foreach(dst->incomming_communications, cpt, act)
if (act == action) {
xbt_dynar_remove_at(dst->incomming_communications, cpt, &act);
break;
}
- if(!xbt_dynar_length(dst->incomming_communications))
- __update_cpu_usage(dst);
- }
+
+ if(src && (!xbt_dynar_length(src->outgoing_communications)))
+ __update_cpu_usage(src);
+ if(dst && (!xbt_dynar_length(dst->incomming_communications)))
+ __update_cpu_usage(dst);
+
free(action);
return 1;
}
static void action_suspend(surf_action_t action)
{
XBT_IN1("(%p))",action);
+ ((surf_action_workstation_KCCFLN05_t) action)->suspended = 1;
lmm_update_variable_weight(maxmin_system,
((surf_action_workstation_KCCFLN05_t)
action)->variable, 0.0);
static void action_resume(surf_action_t action)
{
XBT_IN1("(%p)",action);
- lmm_update_variable_weight(maxmin_system,
- ((surf_action_workstation_KCCFLN05_t)
- action)->variable, 1.0);
+ if(((surf_action_workstation_KCCFLN05_t)action)->lat_current==0.0)
+ lmm_update_variable_weight(maxmin_system,
+ ((surf_action_workstation_KCCFLN05_t)
+ action)->variable, 1.0);
+ else
+ lmm_update_variable_weight(maxmin_system,
+ ((surf_action_workstation_KCCFLN05_t) action)->variable,
+ ((surf_action_workstation_KCCFLN05_t) action)->lat_current);
+
+ ((surf_action_workstation_KCCFLN05_t) action)->suspended = 0;
XBT_OUT;
}
static int action_is_suspended(surf_action_t action)
{
- return (lmm_get_variable_weight
- (((surf_action_workstation_KCCFLN05_t) action)->variable) ==
- 0.0);
+ return (((surf_action_workstation_KCCFLN05_t) action)->suspended);
}
static void action_set_max_duration(surf_action_t action, double duration)
return (lmm_constraint_used(maxmin_system,
((cpu_KCCFLN05_t) resource_id)->
constraint) ||
- lmm_constraint_used(maxmin_system,
+ ((((cpu_KCCFLN05_t) resource_id)->bus)?
+ lmm_constraint_used(maxmin_system,
((cpu_KCCFLN05_t) resource_id)->
- bus));
+ bus):0));
else
return lmm_constraint_used(maxmin_system,
((network_link_KCCFLN05_t) resource_id)->
surf_double_update(&(deltap), action->latency);
action->latency = 0.0;
}
- if ((action->latency == 0.0) && !(action->suspended))
- lmm_update_variable_weight(maxmin_system, action->variable, 1.0);
+ if ((action->latency == 0.0) && !(action->suspended)) {
+ if((action)->lat_current==0.0)
+ lmm_update_variable_weight(maxmin_system,action->variable, 1.0);
+ else
+ lmm_update_variable_weight(maxmin_system, action->variable,
+ action->lat_current);
+ }
}
surf_double_update(&(action->generic_action.remains),
lmm_variable_getvalue(action->variable) * deltap);
else
lmm_update_variable_bound(maxmin_system, action->variable,
min(action->rate,SG_TCP_CTE_GAMMA / (2.0 * action->lat_current)));
+ if(!(action->suspended))
+ lmm_update_variable_weight(maxmin_system, action->variable,
+ action->lat_current);
}
} else if (event_type == nw_link->state_event) {
if (value > 0)
action->generic_action.finish = -1.0;
action->generic_action.resource_type =
(surf_resource_t) surf_workstation_resource;
+ action->suspended = 0;
if (CPU->state_current == SURF_CPU_ON)
action->generic_action.state_set =
return load*(((cpu_KCCFLN05_t) cpu)->power_scale);
}
+static double get_available_speed(void *cpu)
+{
+ return ((cpu_KCCFLN05_t) cpu)->power_current;
+}
+
static surf_action_t communicate(void *src, void *dst, double size, double rate)
{
surf_action_workstation_KCCFLN05_t action = NULL;
return NULL;
}
+/* returns an array of network_link_KCCFLN05_t */
+static const void** get_route(void *src, void *dst) {
+ cpu_KCCFLN05_t card_src = src;
+ cpu_KCCFLN05_t card_dst = dst;
+ route_KCCFLN05_t route = &(ROUTE(card_src->id, card_dst->id));
+
+ return (const void**) route->links;
+}
+
+static int get_route_size(void *src, void *dst) {
+ cpu_KCCFLN05_t card_src = src;
+ cpu_KCCFLN05_t card_dst = dst;
+ route_KCCFLN05_t route = &(ROUTE(card_src->id, card_dst->id));
+ return route->size;
+}
+
+static const char *get_link_name(const void *link) {
+ return ((network_link_KCCFLN05_t) link)->name;
+}
+
+static double get_link_bandwidth(const void *link) {
+ return ((network_link_KCCFLN05_t) link)->bw_current;
+}
+
+static double get_link_latency(const void *link) {
+ return ((network_link_KCCFLN05_t) link)->lat_current;
+}
/**************************************/
/*** Resource Creation & Destruction **/
surf_workstation_resource->extension_public->execute = execute;
surf_workstation_resource->extension_public->sleep = action_sleep;
surf_workstation_resource->extension_public->get_state = resource_get_state;
+ surf_workstation_resource->extension_public->get_speed = get_speed;
+ surf_workstation_resource->extension_public->get_available_speed = get_available_speed;
surf_workstation_resource->extension_public->communicate = communicate;
surf_workstation_resource->extension_public->execute_parallel_task = execute_parallel_task;
+ surf_workstation_resource->extension_public->get_route = get_route;
+ surf_workstation_resource->extension_public->get_route_size = get_route_size;
+ surf_workstation_resource->extension_public->get_link_name = get_link_name;
+ surf_workstation_resource->extension_public->get_link_bandwidth = get_link_bandwidth;
+ surf_workstation_resource->extension_public->get_link_latency = get_link_latency;
workstation_set = xbt_dict_new();
network_link_set = xbt_dict_new();