#include "smx_private.h"
#include "mc/mc.h"
+#include "xbt/ex.h"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);
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();
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)
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;
}