summaryrefslogtreecommitdiff
path: root/tools/debugserver/source/DNBThreadResumeActions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/debugserver/source/DNBThreadResumeActions.cpp')
-rw-r--r--tools/debugserver/source/DNBThreadResumeActions.cpp116
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;
+ }
+ }
+}