diff options
Diffstat (limited to 'tools/debugserver/source/DNBThreadResumeActions.cpp')
-rw-r--r-- | tools/debugserver/source/DNBThreadResumeActions.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/tools/debugserver/source/DNBThreadResumeActions.cpp b/tools/debugserver/source/DNBThreadResumeActions.cpp new file mode 100644 index 0000000000000..b50dd06178430 --- /dev/null +++ b/tools/debugserver/source/DNBThreadResumeActions.cpp @@ -0,0 +1,116 @@ +//===-- 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; + } + } +} |