X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0bddb56a8a47a2cfa01bfe51c22dca758e5700d6..dfb935741dbdd2a843f684538ab2403c082f633b:/src/surf/surf_model_timer.c diff --git a/src/surf/surf_model_timer.c b/src/surf/surf_model_timer.c index 707b400d0e..4cf18e1572 100644 --- a/src/surf/surf_model_timer.c +++ b/src/surf/surf_model_timer.c @@ -1,6 +1,5 @@ -/* $Id$ */ - -/* Copyright (c) 2005 Arnaud Legrand. All rights reserved. */ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -12,11 +11,16 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_timer, surf, "Logging specific to SURF (timer)"); +typedef struct surf_action_timer { + s_surf_action_t generic_action; +} s_surf_action_timer_t, *surf_action_timer_t; + typedef struct command { - s_surf_resource_t generic_resource; /* Must remain first, since we add this to a trace */ + s_surf_resource_t generic_resource; /* Must remain first, since we add this to a trace */ void *function; void *args; s_xbt_swag_hookup_t command_set_hookup; + surf_action_timer_t action; } s_command_t, *command_t; @@ -34,6 +38,9 @@ static command_t command_new(void *fun, void *args) command->function = fun; command->args = args; xbt_swag_insert(command, command_pending); + command->action = + surf_action_new(sizeof(s_surf_action_timer_t), 0, surf_timer_model, + 0); return command; } @@ -44,7 +51,10 @@ static void command_free(command_t command) } else if (xbt_swag_belongs(command, command_pending)) { xbt_swag_remove(command, command_pending); } - surf_resource_free((surf_resource_t)command); + xbt_swag_remove(command->action, + surf_timer_model->states.running_action_set); + xbt_free(command->action); + surf_resource_free((surf_resource_t) command); return; } @@ -61,8 +71,8 @@ static int resource_used(void *resource_id) return 1; } -static void action_change_state(surf_action_t action, - e_surf_action_state_t state) +static void timer_action_state_set(surf_action_t action, + e_surf_action_state_t state) { DIE_IMPOSSIBLE; return; @@ -70,19 +80,18 @@ static void action_change_state(surf_action_t action, static double share_resources(double now) { - if (xbt_heap_size(timer_heap)) + if (xbt_heap_size(timer_heap)) { + DEBUG1("Share resoure returning %lf", xbt_heap_maxkey(timer_heap)); return (xbt_heap_maxkey(timer_heap)); - else + } else return -1.0; } static void update_actions_state(double now, double delta) { - if (xbt_heap_size(timer_heap)) { - if (xbt_heap_maxkey(timer_heap) <= now + delta) { - xbt_heap_pop(timer_heap); - } - } + while ((xbt_heap_size(timer_heap)) > 0 + && (xbt_heap_maxkey(timer_heap) <= now + delta)) + xbt_heap_pop(timer_heap); return; } @@ -95,6 +104,9 @@ static void update_resource_state(void *id, /* Move this command to the list of commands to execute */ xbt_swag_remove(command, command_pending); xbt_swag_insert(command, command_to_run); + tmgr_trace_event_free(event_type); + + DEBUG1("Insert command on date %lf", date); return; } @@ -107,6 +119,8 @@ static void set(double date, void *function, void *arg) tmgr_history_add_trace(history, empty_trace, date, 0, command); xbt_heap_push(timer_heap, NULL, date); + + DEBUG1("Putting value %lf on heap", date); } @@ -118,6 +132,7 @@ static int get(void **function, void **arg) if (command) { *function = command->function; *arg = command->args; + command_free(command); return 1; } else { return 0; @@ -140,7 +155,7 @@ static int action_is_suspended(surf_action_t action) return 0; } -static void finalize(void) +static void timer_finalize(void) { xbt_heap_free(timer_heap); timer_heap = NULL; @@ -159,17 +174,16 @@ static void surf_timer_model_init_internal(void) { surf_timer_model = surf_model_init(); - surf_timer_model->action_change_state = action_change_state; - surf_timer_model->action_set_data = surf_action_set_data; surf_timer_model->name = "TIMER"; + surf_timer_model->action_state_set = timer_action_state_set; surf_timer_model->model_private->resource_used = resource_used; surf_timer_model->model_private->share_resources = share_resources; surf_timer_model->model_private->update_actions_state = - update_actions_state; + update_actions_state; surf_timer_model->model_private->update_resource_state = - update_resource_state; - surf_timer_model->model_private->finalize = finalize; + update_resource_state; + surf_timer_model->model_private->finalize = timer_finalize; surf_timer_model->suspend = action_suspend; surf_timer_model->resume = action_resume; @@ -180,8 +194,10 @@ static void surf_timer_model_init_internal(void) { s_command_t var; - command_pending = xbt_swag_new(xbt_swag_offset(var, command_set_hookup)); - command_to_run = xbt_swag_new(xbt_swag_offset(var, command_set_hookup)); + command_pending = + xbt_swag_new(xbt_swag_offset(var, command_set_hookup)); + command_to_run = + xbt_swag_new(xbt_swag_offset(var, command_set_hookup)); } empty_trace = tmgr_empty_trace_new();