XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_timer,gras,
- "Delayed and repetitive actions");
+ "Delayed and repetitive actions");
/** @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_by_id(gras_msg_libdata_id);
-
- gras_timer_t timer = xbt_dynar_push_ptr(pd->timers);
-
- VERB1("Register delayed action %p", action);
- timer->period = delay;
- timer->expiry = delay+gras_os_time();
- timer->action = action;
- timer->repeat = FALSE;
+ 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);
+
+ VERB1("Register delayed action %p", action);
+ timer->period = delay;
+ timer->expiry = delay+gras_os_time();
+ timer->action = action;
+ timer->repeat = FALSE;
}
/** @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_by_id(gras_msg_libdata_id);
-
- gras_timer_t timer = xbt_dynar_push_ptr(pd->timers);
-
- VERB1("Register repetitive action %p", action);
- timer->period = interval;
- timer->expiry = interval+gras_os_time();
- timer->action = action;
- timer->repeat = TRUE;
+ 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);
+
+ VERB1("Register repetitive action %p", action);
+ timer->period = interval;
+ timer->expiry = interval+gras_os_time();
+ timer->action = action;
+ timer->repeat = TRUE;
}
/** @brief Cancel a delayed task */
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);
- unsigned int cursor;
- int found;
- s_gras_timer_t timer;
-
- found = FALSE;
- xbt_dynar_foreach(pd->timers,cursor,timer){
- if (timer.repeat == FALSE &&
- timer.period == interval &&
- timer.action == action) {
-
- found = TRUE;
- xbt_dynar_cursor_rm(pd->timers, &cursor);
- }
- }
-
- if (!found)
- THROW2(mismatch_error,0,"Cannot remove the action %p delayed of %f second: not found",
- action,interval);
-
+ gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
+ unsigned int cursor;
+ int found;
+ s_gras_timer_t timer;
+
+ found = FALSE;
+ xbt_dynar_foreach(pd->timers,cursor,timer){
+ if (timer.repeat == FALSE &&
+ timer.period == interval &&
+ timer.action == action) {
+
+ found = TRUE;
+ xbt_dynar_cursor_rm(pd->timers, &cursor);
+ }
+ }
+
+ if (!found)
+ THROW2(mismatch_error,0,"Cannot remove the action %p delayed of %f second: not found",
+ action,interval);
+
}
/** @brief Cancel a repetitive task */
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);
- unsigned int cursor;
- int found;
- s_gras_timer_t timer;
-
- found = FALSE;
- xbt_dynar_foreach(pd->timers,cursor,timer){
- if (timer.repeat == TRUE &&
- timer.period == interval &&
- timer.action == action) {
-
- found = TRUE;
- xbt_dynar_cursor_rm(pd->timers, &cursor);
- }
- }
-
- if (!found)
- THROW2(mismatch_error,0,"Cannot remove the action %p delayed of %f second: not found",
- action,interval);
+ gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
+ unsigned int cursor;
+ int found;
+ s_gras_timer_t timer;
+
+ found = FALSE;
+ xbt_dynar_foreach(pd->timers,cursor,timer){
+ if (timer.repeat == TRUE &&
+ timer.period == interval &&
+ timer.action == action) {
+
+ found = TRUE;
+ xbt_dynar_cursor_rm(pd->timers, &cursor);
+ }
+ }
+
+ if (!found)
+ THROW2(mismatch_error,0,"Cannot remove the action %p delayed of %f second: not found",
+ action,interval);
}
/** @brief Cancel all delayed tasks */
void gras_timer_cancel_delay_all(void) {
- gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
- unsigned int cursor;
- int 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 (!found)
- THROW0(mismatch_error,0,"No delayed action to remove");
-
+ gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
+ unsigned int cursor;
+ int 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 (!found)
+ THROW0(mismatch_error,0,"No delayed action to remove");
+
}
/** @brief Cancel all repetitive tasks */
void gras_timer_cancel_repeat_all(void){
- gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
- unsigned int cursor;
- int 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 (!found)
- THROW0(mismatch_error,0,"No repetitive action to remove");
+ gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
+ unsigned int cursor;
+ int 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 (!found)
+ 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_by_id(gras_msg_libdata_id);
- xbt_dynar_reset( pd->timers );
+ 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_by_id(gras_msg_libdata_id);
- unsigned 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++) {
- double untilthis;
-
- timer = xbt_dynar_get_ptr (pd->timers, cursor);
- untilthis = timer->expiry - now;
-
- 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(),
- timer->repeat ? "repetitive" : "delayed", timer->action,
- timer->expiry, now);
-
- 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;
- }
- }
- return untilnext;
+ gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_by_id(gras_msg_libdata_id);
+ unsigned 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++) {
+ double untilthis;
+
+ timer = xbt_dynar_get_ptr (pd->timers, cursor);
+ untilthis = timer->expiry - now;
+
+ 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(),
+ timer->repeat ? "repetitive" : "delayed", timer->action,
+ timer->expiry, now);
+
+ 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;
+ }
+ }
+ return untilnext;
}