X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1700d14f138878ab211937ff61e8a9c7ca7dd0b5..4914b22f76675e6a7f4d4ca2b27fb2edbfde9995:/src/mc/mc_request.c diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index cb13045859..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, @@ -228,7 +230,8 @@ static char *buff_size_to_string(size_t buff_size) char *MC_request_to_string(smx_simcall_t req, int value) { char *type = NULL, *args = NULL, *str = NULL, *p = NULL, *bs = NULL; - smx_action_t act = NULL; + smx_synchro_t act = NULL; + smx_mutex_t mutex = NULL; size_t size = 0; switch (req->call) { @@ -305,7 +308,7 @@ char *MC_request_to_string(smx_simcall_t req, int value) if (!xbt_dynar_is_empty(simcall_comm_waitany__get__comms(req))) { p = pointer_to_string(xbt_dynar_get_as (simcall_comm_waitany__get__comms(req), value, - smx_action_t)); + smx_synchro_t)); args = bprintf("comm=%s (%d of %lu)", p, value + 1, xbt_dynar_length(simcall_comm_waitany__get__comms(req))); @@ -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; @@ -367,7 +382,7 @@ char *MC_request_to_string(smx_simcall_t req, int value) unsigned int MC_request_testany_fail(smx_simcall_t req) { unsigned int cursor; - smx_action_t action; + smx_synchro_t action; xbt_dynar_foreach(simcall_comm_testany__get__comms(req), cursor, action) { if (action->comm.src_proc && action->comm.dst_proc) @@ -377,67 +392,9 @@ 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_action_t act; - - switch (req->call) { - - case SIMCALL_COMM_WAIT: - /* FIXME: check also that src and dst processes are not suspended */ - - /* 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. - * On the other hand if it hasn't a timeout, check if the comm is ready.*/ - if (simcall_comm_wait__get__timeout(req) >= 0) { - if (_sg_mc_timeout == 1) { - return TRUE; - } else { - act = simcall_comm_wait__get__comm(req); - return (act->comm.src_proc && act->comm.dst_proc); - } - } else { - act = simcall_comm_wait__get__comm(req); - 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); - } - break; - - 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; - break; - - default: - /* The rest of the request are always enabled */ - return TRUE; - } -} - int MC_request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx) { - smx_action_t act; + smx_synchro_t act; switch (req->call) { @@ -450,14 +407,14 @@ int MC_request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx) case SIMCALL_COMM_WAITANY: act = xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), idx, - smx_action_t); + smx_synchro_t); return (act->comm.src_proc && act->comm.dst_proc); break; case SIMCALL_COMM_TESTANY: act = xbt_dynar_get_as(simcall_comm_testany__get__comms(req), idx, - smx_action_t); + smx_synchro_t); return (act->comm.src_proc && act->comm.dst_proc); break; @@ -468,19 +425,15 @@ int MC_request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx) int MC_process_is_enabled(smx_process_t process) { - if (process->simcall.call != SIMCALL_NONE - && MC_request_is_enabled(&process->simcall)) - return TRUE; - - return FALSE; + return MC_request_is_enabled(&process->simcall); } char *MC_request_get_dot_output(smx_simcall_t req, int value) { char *str = NULL, *label = NULL; - smx_action_t act = NULL; - + smx_synchro_t act = NULL; + switch (req->call) { case SIMCALL_COMM_ISEND: if (req->issuer->smx_host) @@ -577,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 =