Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
On a timeout we do not wait anymore on a task.
[simgrid.git] / src / simix / smx_user.c
index c0957ba..c0198ab 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "smx_private.h"
 #include "mc/mc.h"
+#include "xbt/ex.h"
 
 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)
 {
+  xbt_ex_t e;
+
   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;
 
-  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)
@@ -1177,7 +1193,7 @@ int simcall_sem_get_capacity(smx_sem_t sem)
   return simcall->sem_get_capacity.result;
 }
 
-size_t simcall_file_read(const char* storage, void* ptr, size_t size, size_t nmemb, m_file_t stream)
+size_t simcall_file_read(const char* storage, void* ptr, size_t size, size_t nmemb, smx_file_t stream)
 {
   smx_simcall_t simcall = SIMIX_simcall_mine();
 
@@ -1192,7 +1208,7 @@ size_t simcall_file_read(const char* storage, void* ptr, size_t size, size_t nme
   return simcall->file_read.result;
 }
 
-size_t simcall_file_write(const char* storage, const void* ptr, size_t size, size_t nmemb, m_file_t stream)
+size_t simcall_file_write(const char* storage, const void* ptr, size_t size, size_t nmemb, smx_file_t stream)
 {
   smx_simcall_t simcall = SIMIX_simcall_mine();
 
@@ -1207,7 +1223,7 @@ size_t simcall_file_write(const char* storage, const void* ptr, size_t size, siz
   return simcall->file_write.result;
 }
 
-m_file_t simcall_file_open(const char* storage, const char* path, const char* mode)
+smx_file_t simcall_file_open(const char* storage, const char* path, const char* mode)
 {
   smx_simcall_t simcall = SIMIX_simcall_mine();
 
@@ -1220,7 +1236,7 @@ m_file_t simcall_file_open(const char* storage, const char* path, const char* mo
   return simcall->file_open.result;
 }
 
-int simcall_file_close(const char* storage, m_file_t fp)
+int simcall_file_close(const char* storage, smx_file_t fp)
 {
   smx_simcall_t simcall = SIMIX_simcall_mine();
 
@@ -1232,16 +1248,17 @@ int simcall_file_close(const char* storage, m_file_t fp)
   return simcall->file_close.result;
 }
 
-int simcall_file_stat(const char* storage, int fd, void* buf)
+int simcall_file_stat(const char* storage, smx_file_t fd, s_file_stat_t *buf)
 {
   smx_simcall_t simcall = SIMIX_simcall_mine();
-
   simcall->call = SIMCALL_FILE_STAT;
   simcall->file_stat.storage = storage;
   simcall->file_stat.fd = fd;
-  simcall->file_stat.buf = buf;
+
   SIMIX_simcall_push(simcall->issuer);
 
+  *buf = simcall->file_stat.buf;
+
   return simcall->file_stat.result;
 }