*/
void MC_replay(xbt_fifo_t stack)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
int value, count = 1;
char *req_str;
smx_simcall_t req = NULL, saved_req = NULL;
MC_restore_snapshot(state->system_state);
if(_sg_mc_comms_determinism || _sg_mc_send_determinism)
MC_restore_communications_pattern(state);
- mmalloc_set_current_heap(std_heap);
return;
}
}
MC_restore_snapshot(initial_global_state->snapshot);
/* At the moment of taking the snapshot the raw heap was set, so restoring
* it will set it back again, we have to unset it to continue */
- mmalloc_set_current_heap(std_heap);
start_item = xbt_fifo_get_last_item(stack);
-
- mmalloc_set_current_heap(mc_heap);
if (_sg_mc_comms_determinism || _sg_mc_send_determinism) {
// int n = xbt_dynar_length(incomplete_communications_pattern);
}
}
- mmalloc_set_current_heap(std_heap);
-
/* Traverse the stack from the state at position start and re-execute the transitions */
for (item = start_item;
item != xbt_fifo_get_first_item(stack);
MC_simcall_handle(req, value);
- mmalloc_set_current_heap(mc_heap);
if (_sg_mc_comms_determinism || _sg_mc_send_determinism)
MC_handle_comm_pattern(call, req, value, NULL, 1);
- mmalloc_set_current_heap(std_heap);
MC_wait_for_requests();
}
XBT_DEBUG("**** End Replay ****");
- mmalloc_set_current_heap(heap);
}
void MC_replay_liveness(xbt_fifo_t stack)
{
-
- initial_global_state->raw_mem_set = (mmalloc_get_current_heap() == mc_heap);
-
xbt_fifo_item_t item;
mc_pair_t pair = NULL;
mc_state_t state = NULL;
pair = (mc_pair_t) xbt_fifo_get_item_content(item);
if(pair->graph_state->system_state){
MC_restore_snapshot(pair->graph_state->system_state);
- mmalloc_set_current_heap(std_heap);
return;
}
}
/* Restore the initial state */
MC_restore_snapshot(initial_global_state->snapshot);
- /* At the moment of taking the snapshot the raw heap was set, so restoring
- * it will set it back again, we have to unset it to continue */
- if (!initial_global_state->raw_mem_set)
- mmalloc_set_current_heap(std_heap);
-
/* Traverse the stack from the initial state and re-execute the transitions */
for (item = xbt_fifo_get_last_item(stack);
item != xbt_fifo_get_first_item(stack);
}
XBT_DEBUG("**** End Replay ****");
-
- if (initial_global_state->raw_mem_set)
- mmalloc_set_current_heap(mc_heap);
- else
- mmalloc_set_current_heap(std_heap);
-
}
/**
*/
void MC_dump_stack_safety(xbt_fifo_t stack)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
MC_show_stack_safety(stack);
mc_state_t state;
-
- mmalloc_set_current_heap(mc_heap);
+
while ((state = (mc_state_t) xbt_fifo_pop(stack)) != NULL)
MC_state_delete(state, !state->in_visited_states ? 1 : 0);
- mmalloc_set_current_heap(heap);
}
void MC_show_stack_safety(xbt_fifo_t stack)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
int value;
mc_state_t state;
xbt_fifo_item_t item;
xbt_free(req_str);
}
}
-
- mmalloc_set_current_heap(heap);
}
void MC_show_deadlock(smx_simcall_t req)
void MC_dump_stack_liveness(xbt_fifo_t stack)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
mc_pair_t pair;
while ((pair = (mc_pair_t) xbt_fifo_pop(stack)) != NULL)
MC_pair_delete(pair);
- mmalloc_set_current_heap(heap);
}
void MC_print_statistics(mc_stats_t stats)
XBT_INFO("Visited pairs = %lu", stats->visited_pairs);
}
XBT_INFO("Executed transitions = %lu", stats->executed_transitions);
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
if ((_sg_mc_dot_output_file != NULL) && (_sg_mc_dot_output_file[0] != '\0')) {
fprintf(dot_output, "}\n");
fclose(dot_output);
if (_sg_mc_comms_determinism)
XBT_INFO("Recv-deterministic : %s", !initial_global_state->recv_deterministic ? "No" : "Yes");
}
- mmalloc_set_current_heap(heap);
}
void MC_automaton_load(const char *file)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
if (_mc_property_automaton == NULL)
_mc_property_automaton = xbt_automaton_new();
xbt_automaton_load(_mc_property_automaton, file);
- mmalloc_set_current_heap(heap);
}
static void register_symbol(xbt_automaton_propositional_symbol_t symbol)
void MC_automaton_new_propositional_symbol(const char *id, int(*fct)(void))
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
if (_mc_property_automaton == NULL)
_mc_property_automaton = xbt_automaton_new();
xbt_automaton_propositional_symbol_t symbol = xbt_automaton_propositional_symbol_new(_mc_property_automaton, id, fct);
register_symbol(symbol);
- mmalloc_set_current_heap(heap);
}
void MC_automaton_new_propositional_symbol_pointer(const char *id, int* value)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
if (_mc_property_automaton == NULL)
_mc_property_automaton = xbt_automaton_new();
xbt_automaton_propositional_symbol_t symbol = xbt_automaton_propositional_symbol_new_pointer(_mc_property_automaton, id, value);
register_symbol(symbol);
- mmalloc_set_current_heap(heap);
}
void MC_automaton_new_propositional_symbol_callback(const char* id,
xbt_automaton_propositional_symbol_callback_type callback,
void* data, xbt_automaton_propositional_symbol_free_function_type free_function)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
if (_mc_property_automaton == NULL)
_mc_property_automaton = xbt_automaton_new();
xbt_automaton_propositional_symbol_t symbol = xbt_automaton_propositional_symbol_new_callback(
_mc_property_automaton, id, callback, data, free_function);
register_symbol(symbol);
- mmalloc_set_current_heap(heap);
}
// TODO, fix cross-process access (this function is not used)
void MC_dump_stacks(FILE* file)
{
- xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
int nstack = 0;
stack_region_t current_stack;
unsigned cursor;
++nstack;
}
- mmalloc_set_current_heap(heap);
}
#endif
if (mc_mode != MC_MODE_CLIENT)
return;
+ xbt_mheap_t heap = mmalloc_get_current_heap();
+
s_mc_heap_ignore_region_t region;
memset(®ion, 0, sizeof(region));
region.address = address;
region.size = size;
region.block =
((char *) address -
- (char *) std_heap->heapbase) / BLOCKSIZE + 1;
- if (std_heap->heapinfo[region.block].type == 0) {
+ (char *) heap->heapbase) / BLOCKSIZE + 1;
+ if (heap->heapinfo[region.block].type == 0) {
region.fragment = -1;
- std_heap->heapinfo[region.block].busy_block.ignore++;
+ heap->heapinfo[region.block].busy_block.ignore++;
} else {
region.fragment =
- ((uintptr_t) (ADDR2UINT(address) % (BLOCKSIZE))) >> std_heap->
- heapinfo[region.block].type;
- std_heap->heapinfo[region.block].busy_frag.ignore[region.fragment]++;
+ ((uintptr_t) (ADDR2UINT(address) % (BLOCKSIZE))) >>
+ heap->heapinfo[region.block].type;
+ heap->heapinfo[region.block].busy_frag.ignore[region.fragment]++;
}
s_mc_ignore_heap_message_t message;
if (mc_mode != MC_MODE_CLIENT)
return;
+ xbt_mheap_t heap = mmalloc_get_current_heap();
+
s_stack_region_t region;
memset(®ion, 0, sizeof(region));
region.address = stack;
region.size = size;
region.block =
((char *) stack -
- (char *) std_heap->heapbase) / BLOCKSIZE + 1;
+ (char *) heap->heapbase) / BLOCKSIZE + 1;
#ifdef HAVE_SMPI
if (smpi_privatize_global_variables && process) {
region.process_index = smpi_process_index_of_smx_process(process);
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_memory, mc,
"Logging specific to MC (memory)");
-/* Pointers to each of the heap regions to use */
-xbt_mheap_t std_heap = NULL; /* memory erased each time the MC stuff rollbacks to the beginning. Almost everything goes here */
-xbt_mheap_t mc_heap = NULL; /* memory persistent over the MC rollbacks. Only MC stuff should go there */
-
/* Initialize the model-checker memory subsystem */
/* It creates the two heap regions: std_heap and mc_heap */
void MC_memory_init()
if (!malloc_use_mmalloc()) {
xbt_die("Model-checking support is not enabled: run with simgrid-mc.");
}
-
- /* Create the first region HEAP_OFFSET bytes after the heap break address */
- std_heap = mmalloc_get_default_md();
- xbt_assert(std_heap != NULL);
-
- /* Create the second region a page after the first one ends + safety gap */
- mc_heap =
- xbt_mheap_new_options(-1,
- (char *) (std_heap) + STD_HEAP_SIZE + xbt_pagesize,
- 0);
- xbt_assert(mc_heap != NULL);
}
/* Finalize the memory subsystem */
#include "xbt_modinter.h"
void MC_memory_exit(void)
{
- if (mc_heap && mc_heap != std_heap)
- xbt_mheap_destroy(mc_heap);
}
}