X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0d379536a99d65399ab2a1b212ecd5a2718945dc..7d0c4c0adbba2982f29444f00d1e70ad6b6aacdf:/src/gras/Msg/timer.c diff --git a/src/gras/Msg/timer.c b/src/gras/Msg/timer.c index 8af69cced2..124984053e 100644 --- a/src/gras/Msg/timer.c +++ b/src/gras/Msg/timer.c @@ -7,7 +7,7 @@ /* 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. */ - +#include "xbt/ex.h" #include "gras/Msg/msg_private.h" #include "gras/timer.h" #include "gras/Virtu/virtu_interface.h" @@ -18,7 +18,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_timer,gras, /** @brief Request \a action to be called once in \a delay seconds */ void gras_timer_delay(double delay, void_f_void_t action) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); gras_timer_t timer = xbt_dynar_push_ptr(pd->timers); @@ -31,7 +31,7 @@ void gras_timer_delay(double delay, void_f_void_t action) { /** @brief Request \a action to be called every \a interval seconds */ void gras_timer_repeat(double interval, void_f_void_t action) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); gras_timer_t timer = xbt_dynar_push_ptr(pd->timers); @@ -43,8 +43,8 @@ void gras_timer_repeat(double interval, void_f_void_t action) { } /** @brief Cancel a delayed task */ -xbt_error_t gras_timer_cancel_delay(double interval, void_f_void_t action) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); +void gras_timer_cancel_delay(double interval, void_f_void_t action) { + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); int cursor,found; s_gras_timer_t timer; @@ -60,15 +60,14 @@ xbt_error_t gras_timer_cancel_delay(double interval, void_f_void_t action) { } if (!found) - RAISE2(mismatch_error,"Cannot remove the action %p delayed of %f second: not found", + THROW2(mismatch_error,0,"Cannot remove the action %p delayed of %f second: not found", action,interval); - return no_error; } /** @brief Cancel a repetitive task */ -xbt_error_t gras_timer_cancel_repeat(double interval, void_f_void_t action) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); +void gras_timer_cancel_repeat(double interval, void_f_void_t action) { + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); int cursor,found; s_gras_timer_t timer; @@ -84,15 +83,13 @@ xbt_error_t gras_timer_cancel_repeat(double interval, void_f_void_t action) { } if (!found) - RAISE2(mismatch_error,"Cannot remove the action %p delayed of %f second: not found", + THROW2(mismatch_error,0,"Cannot remove the action %p delayed of %f second: not found", action,interval); - - return no_error; } /** @brief Cancel all delayed tasks */ -xbt_error_t gras_timer_cancel_delay_all(void) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); +void gras_timer_cancel_delay_all(void) { + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); int cursor, found; s_gras_timer_t timer; @@ -106,48 +103,45 @@ xbt_error_t gras_timer_cancel_delay_all(void) { } if (!found) - RAISE0(mismatch_error,"No delayed action to remove"); + THROW0(mismatch_error,0,"No delayed action to remove"); - return no_error; } /** @brief Cancel all repetitive tasks */ -xbt_error_t gras_timer_cancel_repeat_all(void){ - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); +void gras_timer_cancel_repeat_all(void){ + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); int cursor, found; s_gras_timer_t timer; found = FALSE; xbt_dynar_foreach(pd->timers,cursor,timer){ - if (timer.repeat == FALSE) { - - found = TRUE; - xbt_dynar_cursor_rm(pd->timers, &cursor); - } + if (timer.repeat == FALSE) { + + found = TRUE; + xbt_dynar_cursor_rm(pd->timers, &cursor); + } } if (!found) - RAISE0(mismatch_error,"No repetitive action to remove"); - - return no_error; + THROW0(mismatch_error,0,"No repetitive action to remove"); } /** @brief Cancel all delayed and repetitive tasks */ void gras_timer_cancel_all(void) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); xbt_dynar_reset( pd->timers ); } /* returns 0 if it handled a timer, or the delay until next timer, or -1 if no armed timer */ double gras_msg_timer_handle(void) { - gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg"); + gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id); int cursor; gras_timer_t timer; double now=gras_os_time(); double untilnext = -1.0; - for (cursor=0; cursor < xbt_dynar_length(pd->timers); cursor++) { + for (cursor=0; cursor < (int)xbt_dynar_length(pd->timers); cursor++) { double untilthis; timer = xbt_dynar_get_ptr (pd->timers, cursor); @@ -156,22 +150,23 @@ double gras_msg_timer_handle(void) { DEBUG2("Action %p expires in %f", timer->action, untilthis); if (untilthis <= 0.0) { + void_f_void_t action = timer->action; - DEBUG5("[%.0f] Serve %s action %p (%f<%f)",gras_os_time(), + DEBUG5("[%.0f] Serve %s action %p (%f<%f)",gras_os_time(), timer->repeat ? "repetitive" : "delayed", timer->action, timer->expiry, now); - timer->action(); - if (timer->repeat) { - timer->expiry = now + timer->period; - DEBUG4("[%.0f] Re-arm repetitive action %p for %f (period=%f)", - gras_os_time(), - timer->action, timer->expiry, timer->period); - } else { - DEBUG2("[%.0f] Remove %p now that it's done", gras_os_time(), timer->action); - xbt_dynar_cursor_rm(pd->timers, &cursor); - } - return 0.0; + if (timer->repeat) { + timer->expiry = now + timer->period; + DEBUG4("[%.0f] Re-arm repetitive action %p for %f (period=%f)", + gras_os_time(), + timer->action, timer->expiry, timer->period); + } else { + DEBUG2("[%.0f] Remove %p now that it's done", gras_os_time(), timer->action); + xbt_dynar_cursor_rm(pd->timers, &cursor); + } + (*action)(); + return 0.0; } else if (untilthis < untilnext || untilnext == -1) { untilnext = untilthis; }