X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/40334ce6fe520b2fa7d1e240716e4f34a5fdc74e..764d7971b97ce839afe7527559f33d68d3262d88:/src/mc/mc_safety.cpp diff --git a/src/mc/mc_safety.cpp b/src/mc/mc_safety.cpp index 2e89053da4..1642b3add9 100644 --- a/src/mc/mc_safety.cpp +++ b/src/mc/mc_safety.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2014. The SimGrid Team. +/* Copyright (c) 2008-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -6,21 +6,24 @@ #include -#include "mc_state.h" -#include "mc_request.h" -#include "mc_safety.h" -#include "mc_private.h" -#include "mc_record.h" -#include "mc_smx.h" -#include "mc_client.h" +#include "src/mc/mc_state.h" +#include "src/mc/mc_request.h" +#include "src/mc/mc_safety.h" +#include "src/mc/mc_private.h" +#include "src/mc/mc_record.h" +#include "src/mc/mc_smx.h" +#include "src/mc/mc_client.h" +#include "src/mc/mc_exit.h" -#include "xbt/mmalloc/mmprivate.h" +#include "src/xbt/mmalloc/mmprivate.h" extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_safety, mc, "Logging specific to MC safety verification "); +} + static int is_exploration_stack_state(mc_state_t current_state){ xbt_fifo_item_t item; @@ -35,6 +38,8 @@ static int is_exploration_stack_state(mc_state_t current_state){ return 0; } +static void MC_modelcheck_safety_init(void); + /** * \brief Initialize the DPOR exploration algorithm */ @@ -49,7 +54,7 @@ static void MC_pre_modelcheck_safety() XBT_DEBUG("Initial state"); /* Wait for requests (schedules processes) */ - MC_wait_for_requests(); + mc_model_checker->wait_for_requests(); /* Get an enabled process and insert it in the interleave set of the initial state */ smx_process_t process; @@ -68,8 +73,10 @@ static void MC_pre_modelcheck_safety() /** \brief Model-check the application using a DFS exploration * with DPOR (Dynamic Partial Order Reductions) */ -static void MC_modelcheck_safety_main(void) +int MC_modelcheck_safety(void) { + MC_modelcheck_safety_init(); + char *req_str = NULL; int value; smx_simcall_t req = NULL; @@ -112,14 +119,14 @@ static void MC_modelcheck_safety_main(void) /* Answer the request */ MC_simcall_handle(req, value); - MC_wait_for_requests(); + mc_model_checker->wait_for_requests(); /* Create the new expanded state */ next_state = MC_state_new(); if(_sg_mc_termination && is_exploration_stack_state(next_state)){ MC_show_non_termination(); - return; + return SIMGRID_MC_EXIT_NON_TERMINATION; } if ((visited_state = is_visited_state(next_state)) == NULL) { @@ -179,7 +186,7 @@ static void MC_modelcheck_safety_main(void) /* Check for deadlocks */ if (MC_deadlock_check()) { MC_show_deadlock(NULL); - return; + return SIMGRID_MC_EXIT_DEADLOCK; } /* Traverse the stack backwards until a state with a non empty interleave @@ -192,6 +199,9 @@ static void MC_modelcheck_safety_main(void) while ((state = (mc_state_t) xbt_fifo_shift(mc_stack))) { if (mc_reduce_kind == e_mc_reduce_dpor) { req = MC_state_get_internal_request(state); + if (req->call == SIMCALL_MUTEX_LOCK || req->call == SIMCALL_MUTEX_TRYLOCK) + xbt_die("Mutex is currently not supported with DPOR, " + "use --cfg=model-check/reduction:none"); const smx_process_t issuer = MC_smx_simcall_get_issuer(req); xbt_fifo_foreach(mc_stack, item, prev_state, mc_state_t) { if (MC_request_depend(req, MC_state_get_internal_request(prev_state))) { @@ -246,11 +256,13 @@ static void MC_modelcheck_safety_main(void) } } } + + XBT_INFO("No property violation found."); MC_print_statistics(mc_stats); - return; + return SIMGRID_MC_EXIT_SUCCESS; } -void MC_modelcheck_safety(void) +static void MC_modelcheck_safety_init(void) { if(_sg_mc_termination) mc_reduce_kind = e_mc_reduce_none; @@ -261,7 +273,7 @@ void MC_modelcheck_safety(void) XBT_INFO("Check non progressive cycles"); else XBT_INFO("Check a safety property"); - MC_wait_for_requests(); + mc_model_checker->wait_for_requests(); XBT_DEBUG("Starting the safety algorithm"); @@ -275,11 +287,4 @@ void MC_modelcheck_safety(void) /* Save the initial state */ initial_global_state = xbt_new0(s_mc_global_t, 1); initial_global_state->snapshot = MC_take_snapshot(0); - - MC_modelcheck_safety_main(); - - xbt_abort(); - //MC_exit(); -} - }