//===-- 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; } } }