Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Added round trip time contraint to the SDP program, this parameter
[simgrid.git] / src / gras / Msg / timer.c
index 8af69cc..6162502 100644 (file)
@@ -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,42 +103,39 @@ 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();
@@ -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;
      }