//===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Created by Greg Clayton on 03/13/2010 // //===----------------------------------------------------------------------===// #include "DNBThreadResumeActions.h" DNBThreadResumeActions::DNBThreadResumeActions() : m_actions (), m_signal_handled () { } DNBThreadResumeActions::DNBThreadResumeActions (const DNBThreadResumeAction *actions, size_t num_actions) : m_actions (), m_signal_handled () { if (actions && num_actions) { m_actions.assign (actions, actions + num_actions); m_signal_handled.assign (num_actions, false); } } DNBThreadResumeActions::DNBThreadResumeActions (nub_state_t default_action, int signal) : m_actions(), m_signal_handled () { SetDefaultThreadActionIfNeeded (default_action, signal); } void DNBThreadResumeActions::Append (const DNBThreadResumeAction &action) { m_actions.push_back (action); m_signal_handled.push_back (false); } void DNBThreadResumeActions::AppendAction ( nub_thread_t tid, nub_state_t state, int signal, nub_addr_t addr ) { DNBThreadResumeAction action = { tid, state, signal, addr }; Append (action); } const DNBThreadResumeAction * DNBThreadResumeActions::GetActionForThread (nub_thread_t tid, bool default_ok) const { const size_t num_actions = m_actions.size(); for (size_t i=0; i<num_actions; ++i) { if (m_actions[i].tid == tid) return &m_actions[i]; } if (default_ok && tid != INVALID_NUB_THREAD) return GetActionForThread (INVALID_NUB_THREAD, false); return NULL; } size_t DNBThreadResumeActions::NumActionsWithState (nub_state_t state) const { size_t count = 0; const size_t num_actions = m_actions.size(); for (size_t i=0; i<num_actions; ++i) { if (m_actions[i].state == state) ++count; } return count; } bool DNBThreadResumeActions::SetDefaultThreadActionIfNeeded (nub_state_t action, int signal) { if (GetActionForThread (INVALID_NUB_THREAD, true) == NULL) { // There isn't a default action so we do need to set it. DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal, INVALID_NUB_ADDRESS }; m_actions.push_back (default_action); m_signal_handled.push_back (false); return true; // Return true as we did add the default action } return false; } void DNBThreadResumeActions::SetSignalHandledForThread (nub_thread_t tid) const { if (tid != INVALID_NUB_THREAD) { const size_t num_actions = m_actions.size(); for (size_t i=0; i<num_actions; ++i) { if (m_actions[i].tid == tid) m_signal_handled[i] = true; } } }