Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Code cleanups around timers to improve maintainability and reduce buggyness
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 23 Feb 2005 14:02:05 +0000 (14:02 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 23 Feb 2005 14:02:05 +0000 (14:02 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1054 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/gras/Msg/msg.c

index 8dfcf01..33cee8c 100644 (file)
@@ -351,7 +351,7 @@ gras_msg_wait(double           timeout,
 
 /** @brief Handle an incomming message or timer (or wait up to \a timeOut seconds)
  *
- * @param timeOut: How long to wait for incoming messages
+ * @param timeOut: How long to wait for incoming messages (in seconds)
  * @return the error code (or no_error).
  *
  * Messages are passed to the callbacks.
@@ -371,43 +371,61 @@ gras_msg_handle(double timeOut) {
   gras_msgtype_t  msgtype;
 
   gras_msg_procdata_t pd=(gras_msg_procdata_t)gras_libdata_get("gras_msg");
-  gras_cblist_t  *list;
+  gras_cblist_t  *list=NULL;
   gras_msg_cb_t       cb;
+   
+  int timerexpected;
 
   VERB1("Handling message within the next %.2fs",timeOut);
   
   untiltimer = gras_msg_timer_handle();
   DEBUG2("[%.0f] Next timer in %f sec", gras_os_time(), untiltimer);
   if (untiltimer == 0.0) {
-     /* A timer was already elapsed */
+     /* A timer was already elapsed and handled */
      return no_error;
   }
+  if (untiltimer != -1.0) {
+     timerexpected = 1;
+     timeOut = MIN(timeOut, untiltimer);
+  } else {
+     timerexpected = 0;
+  }
    
   /* get a message (from the queue or from the net) */
   if (xbt_dynar_length(pd->msg_queue)) {
+    DEBUG0("Get a message from the queue");
     xbt_dynar_shift(pd->msg_queue,&msg);
     expeditor = msg.expeditor;
     msgtype   = msg.type;
     payload   = msg.payload;
     errcode   = no_error;
   } else {
-    errcode = gras_trp_select(MIN(timeOut,untiltimer), &expeditor);
+    errcode = gras_trp_select(timeOut, &expeditor);
     if (errcode != no_error && errcode != timeout_error)
        return errcode;
     if (errcode != timeout_error)
        TRY(gras_msg_recv(expeditor, &msgtype, &payload, &payload_size));
   }
 
-  if (errcode == timeout_error && untiltimer < timeOut) {
-     /* A timer elapsed before the arrival of any message even if we select()ed a bit */
-     untiltimer = gras_msg_timer_handle();
-     if (untiltimer == 0.0) {
-       return no_error;
+  if (errcode == timeout_error ) {
+     if (timerexpected) {
+         
+       /* A timer elapsed before the arrival of any message even if we select()ed a bit */
+       untiltimer = gras_msg_timer_handle();
+       if (untiltimer == 0.0) {
+          return no_error;
+       } else {
+          xbt_assert1(untiltimer>0, "Negative timer (%f). I'm puzzeled", untiltimer);
+          ERROR1("No timer elapsed, in contrary to expectations (next in %f sec)",
+                 untiltimer);
+          return timeout_error;
+       }
+       
      } else {
-       WARN1("Weird. I computed that a timer should elapse shortly, but none did (I still should wait %f sec)",
-             untiltimer);
+       /* select timeouted, and no timer elapsed. Nothing to do */
        return timeout_error;
      }
+     
   }
    
   /* A message was already there or arrived in the meanwhile. handle it */