From 47fd440ad6382d295645c81ca4c5c09bd5d51cc6 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Mon, 8 Jun 2015 17:47:30 +0200 Subject: [PATCH] [mc] Make s_mc_snapshot_stack::stack_frames a std::vector --- src/mc/mc_checkpoint.cpp | 45 ++++++++++++++++++---------------------- src/mc/mc_hash.cpp | 16 +++++++------- src/mc/mc_snapshot.h | 6 ++---- 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index ebc9475ce5..3fd0584568 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -48,7 +48,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkpoint, mc, s_mc_snapshot_stack::~s_mc_snapshot_stack() { - xbt_dynar_free(&(this->stack_frames)); if (this->context) mc_unw_destroy_context(this->context); xbt_free(this->context); @@ -342,16 +341,12 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, } } -static std::vector MC_get_local_variables_values(xbt_dynar_t stack_frames, int process_index) +static std::vector MC_get_local_variables_values( + std::vector& stack_frames, int process_index) { - - unsigned cursor1 = 0; - mc_stack_frame_t stack_frame; - std::vector variables; - xbt_dynar_foreach(stack_frames, cursor1, stack_frame) { - mc_fill_local_variables_values(stack_frame, stack_frame->frame, process_index, variables); - } + for (s_mc_stack_frame_t& stack_frame : stack_frames) + mc_fill_local_variables_values(&stack_frame, stack_frame.frame, process_index, variables); return std::move(variables); } @@ -361,11 +356,10 @@ static void MC_stack_frame_free_voipd(void *s) delete(stack_frame); } -static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context) +static std::vector MC_unwind_stack_frames(mc_unw_context_t stack_context) { mc_process_t process = &mc_model_checker->process(); - xbt_dynar_t result = - xbt_dynar_new(sizeof(mc_stack_frame_t), MC_stack_frame_free_voipd); + std::vector result; unw_cursor_t c; @@ -377,33 +371,34 @@ static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context) } else while (1) { - mc_stack_frame_t stack_frame = new s_mc_stack_frame_t(); - xbt_dynar_push(result, &stack_frame); + s_mc_stack_frame_t stack_frame; - stack_frame->unw_cursor = c; + stack_frame.unw_cursor = c; unw_word_t ip, sp; unw_get_reg(&c, UNW_REG_IP, &ip); unw_get_reg(&c, UNW_REG_SP, &sp); - stack_frame->ip = ip; - stack_frame->sp = sp; + stack_frame.ip = ip; + stack_frame.sp = sp; // TODO, use real addresses in frame_t instead of fixing it here dw_frame_t frame = process->find_function(remote(ip)); - stack_frame->frame = frame; + stack_frame.frame = frame; if (frame) { - stack_frame->frame_name = frame->name; - stack_frame->frame_base = + stack_frame.frame_name = frame->name; + stack_frame.frame_base = (unw_word_t) mc_find_frame_base(frame, frame->object_info, &c); } else { - stack_frame->frame_base = 0; - stack_frame->frame_name = std::string(); + stack_frame.frame_base = 0; + stack_frame.frame_name = std::string(); } + result.push_back(std::move(stack_frame)); + /* Stop before context switch with maestro */ if (frame != NULL && frame->name != NULL && !strcmp(frame->name, "smx_ctx_sysv_wrapper")) @@ -417,12 +412,12 @@ static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context) } } - if (xbt_dynar_length(result) == 0) { + if (result.empty()) { XBT_INFO("unw_init_local failed"); xbt_abort(); } - return result; + return std::move(result); }; static std::vector MC_take_snapshot_stacks(mc_snapshot_t * snapshot) @@ -450,7 +445,7 @@ static std::vector MC_take_snapshot_stacks(mc_snapshot_t st.local_variables = MC_get_local_variables_values(st.stack_frames, current_stack->process_index); st.process_index = current_stack->process_index; - unw_word_t sp = xbt_dynar_get_as(st.stack_frames, 0, mc_stack_frame_t)->sp; + unw_word_t sp = st.stack_frames[0].sp; res.push_back(std::move(st)); diff --git a/src/mc/mc_hash.cpp b/src/mc/mc_hash.cpp index c8302537c7..7709cc7ac0 100644 --- a/src/mc/mc_hash.cpp +++ b/src/mc/mc_hash.cpp @@ -283,22 +283,22 @@ static void mc_hash_stack(mc_hash_t * hash, mc_snapshot_stack_t stack, unsigned cursor = 0; mc_stack_frame_t stack_frame; - xbt_dynar_foreach(stack->stack_frames, cursor, stack_frame) { + for(s_mc_stack_frame_t const& stack_frame : stack->stack_frames) { - MC_HASH(*hash, stack_frame->ip); + MC_HASH(*hash, stack_frame.ip); mc_object_info_t info; - if (stack_frame->ip >= (unw_word_t) libsimgrid_info->start_exec - && stack_frame->ip < (unw_word_t) libsimgrid_info->end_exec) + if (stack_frame.ip >= (unw_word_t) libsimgrid_info->start_exec + && stack_frame.ip < (unw_word_t) libsimgrid_info->end_exec) info = libsimgrid_info; - else if (stack_frame->ip >= (unw_word_t) binary_info->start_exec - && stack_frame->ip < (unw_word_t) binary_info->end_exec) + else if (stack_frame.ip >= (unw_word_t) binary_info->start_exec + && stack_frame.ip < (unw_word_t) binary_info->end_exec) info = binary_info; else continue; - mc_hash_stack_frame(hash, info, &(stack_frame->unw_cursor), - stack_frame->frame, (void *) stack_frame->frame_base, + mc_hash_stack_frame(hash, info, &(stack_frame.unw_cursor), + stack_frame.frame, (void *) stack_frame.frame_base, state); } diff --git a/src/mc/mc_snapshot.h b/src/mc/mc_snapshot.h index 85683f7120..e725c1d246 100644 --- a/src/mc/mc_snapshot.h +++ b/src/mc/mc_snapshot.h @@ -121,11 +121,11 @@ typedef struct s_local_variable{ typedef struct s_mc_snapshot_stack{ std::vector local_variables; mc_unw_context_t context; - xbt_dynar_t stack_frames; // mc_stack_frame_t + std::vector stack_frames; int process_index; s_mc_snapshot_stack() - : context(nullptr), stack_frames(nullptr), process_index(0) + : context(nullptr), process_index(0) {} ~s_mc_snapshot_stack(); s_mc_snapshot_stack(s_mc_snapshot_stack& p) = delete; @@ -140,8 +140,6 @@ typedef struct s_mc_snapshot_stack{ this->local_variables = std::move(that.local_variables); this->context = std::move(that.context); that.context = nullptr; - this->stack_frames = std::move(that.stack_frames); - that.stack_frames = nullptr; this->process_index = that.process_index; that.process_index = 0; return *this; -- 2.20.1