X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/539916de848562683cf2e5425d5160c2a43f135a..4914b22f76675e6a7f4d4ca2b27fb2edbfde9995:/src/mc/mc_request.c diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index 4d8154e557..5b309a3855 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -4,6 +4,8 @@ /* 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 "mc_request.h" +#include "mc_safety.h" #include "mc_private.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_request, mc, @@ -229,6 +231,7 @@ char *MC_request_to_string(smx_simcall_t req, int value) { char *type = NULL, *args = NULL, *str = NULL, *p = NULL, *bs = NULL; smx_synchro_t act = NULL; + smx_mutex_t mutex = NULL; size_t size = 0; switch (req->call) { @@ -326,6 +329,18 @@ char *MC_request_to_string(smx_simcall_t req, int value) } break; + case SIMCALL_MUTEX_LOCK: + mutex = simcall_mutex_lock__get__mutex(req); + type = xbt_strdup("Mutex LOCK"); + args = bprintf("locked = %d, owner = %d, sleeping = %d", mutex->locked, mutex->owner != NULL ? (int)mutex->owner->pid : -1, xbt_swag_size(mutex->sleeping)); + break; + + case SIMCALL_MUTEX_UNLOCK: + type = xbt_strdup("Mutex UNLOCK"); + mutex = simcall_mutex_unlock__get__mutex(req); + args = bprintf("locked = %d, owner = %lu, sleeping = %d", mutex->locked, mutex->owner->pid, xbt_swag_size(mutex->sleeping)); + break; + case SIMCALL_MC_SNAPSHOT: type = xbt_strdup("MC_SNAPSHOT"); args = NULL; @@ -377,57 +392,6 @@ unsigned int MC_request_testany_fail(smx_simcall_t req) return TRUE; } -int MC_request_is_visible(smx_simcall_t req) -{ - return req->call == SIMCALL_COMM_ISEND - || req->call == SIMCALL_COMM_IRECV - || req->call == SIMCALL_COMM_WAIT - || req->call == SIMCALL_COMM_WAITANY - || req->call == SIMCALL_COMM_TEST - || req->call == SIMCALL_COMM_TESTANY - || req->call == SIMCALL_MC_RANDOM - || req->call == SIMCALL_MC_SNAPSHOT - || req->call == SIMCALL_MC_COMPARE_SNAPSHOTS; -} - -int MC_request_is_enabled(smx_simcall_t req) -{ - unsigned int index = 0; - smx_synchro_t act = 0; - - switch (req->call) { - case SIMCALL_NONE: - return FALSE; - - case SIMCALL_COMM_WAIT: - /* FIXME: check also that src and dst processes are not suspended */ - act = simcall_comm_wait__get__comm(req); - if (simcall_comm_wait__get__timeout(req) >= 0) { - /* If it has a timeout it will be always be enabled, because even if the - * communication is not ready, it can timeout and won't block. */ - if (_sg_mc_timeout == 1) - return TRUE; - } else { - /* On the other hand if it hasn't a timeout, check if the comm is ready.*/ - if (act->comm.detached && act->comm.src_proc == NULL - && act->comm.type == SIMIX_COMM_READY) - return (act->comm.dst_proc != NULL); - } - return (act->comm.src_proc && act->comm.dst_proc); - - case SIMCALL_COMM_WAITANY: - /* Check if it has at least one communication ready */ - xbt_dynar_foreach(simcall_comm_waitany__get__comms(req), index, act) - if (act->comm.src_proc && act->comm.dst_proc) - return TRUE; - return FALSE; - - default: - /* The rest of the requests are always enabled */ - return TRUE; - } -} - int MC_request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx) { smx_synchro_t act; @@ -469,7 +433,7 @@ char *MC_request_get_dot_output(smx_simcall_t req, int value) char *str = NULL, *label = NULL; smx_synchro_t act = NULL; - + switch (req->call) { case SIMCALL_COMM_ISEND: if (req->issuer->smx_host) @@ -566,6 +530,14 @@ char *MC_request_get_dot_output(smx_simcall_t req, int value) } break; + case SIMCALL_MUTEX_LOCK: + label = bprintf("[(%lu)] Mutex LOCK", req->issuer->pid); + break; + + case SIMCALL_MUTEX_UNLOCK: + label = bprintf("[(%lu)] Mutex UNLOCK", req->issuer->pid); + break; + case SIMCALL_MC_RANDOM: if (req->issuer->smx_host) label =