Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
On a timeout we do not wait anymore on a task.
authorArnaud Legrand <arnaud.legrand@imag.fr>
Mon, 2 Apr 2012 23:16:32 +0000 (01:16 +0200)
committerArnaud Legrand <arnaud.legrand@imag.fr>
Wed, 25 Apr 2012 23:13:39 +0000 (01:13 +0200)
-> Avoid keeping a pointer to an invalid object.

src/simix/smx_user.c

index 1f5f4b4..c0198ab 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "smx_private.h"
 #include "mc/mc.h"
 
 #include "smx_private.h"
 #include "mc/mc.h"
+#include "xbt/ex.h"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);
 
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);
 
@@ -1078,6 +1079,8 @@ void simcall_cond_wait_timeout(smx_cond_t cond,
                                  smx_mutex_t mutex,
                                  double timeout)
 {
                                  smx_mutex_t mutex,
                                  double timeout)
 {
+  xbt_ex_t e;
+
   xbt_assert(isfinite(timeout), "timeout is not finite!");
   
   smx_simcall_t simcall = SIMIX_simcall_mine();
   xbt_assert(isfinite(timeout), "timeout is not finite!");
   
   smx_simcall_t simcall = SIMIX_simcall_mine();
@@ -1087,7 +1090,20 @@ void simcall_cond_wait_timeout(smx_cond_t cond,
   simcall->cond_wait_timeout.mutex = mutex;
   simcall->cond_wait_timeout.timeout = timeout;
 
   simcall->cond_wait_timeout.mutex = mutex;
   simcall->cond_wait_timeout.timeout = timeout;
 
-  SIMIX_simcall_push(simcall->issuer);
+  TRY {
+    SIMIX_simcall_push(simcall->issuer);
+  }
+  CATCH(e) {
+    switch (e.category) {
+      case timeout_error:
+        simcall->issuer->waiting_action = NULL; // FIXME: should clean ?
+        break;
+      default:
+        break;
+    }
+    RETHROW;
+    xbt_ex_free(e);
+  }
 }
 
 void simcall_cond_broadcast(smx_cond_t cond)
 }
 
 void simcall_cond_broadcast(smx_cond_t cond)