1 //===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Created by Greg Clayton on 03/13/2010
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "DNBThreadResumeActions.h"
15
DNBThreadResumeActions()16 DNBThreadResumeActions::DNBThreadResumeActions() :
17 m_actions (),
18 m_signal_handled ()
19 {
20 }
21
DNBThreadResumeActions(const DNBThreadResumeAction * actions,size_t num_actions)22 DNBThreadResumeActions::DNBThreadResumeActions (const DNBThreadResumeAction *actions, size_t num_actions) :
23 m_actions (),
24 m_signal_handled ()
25 {
26 if (actions && num_actions)
27 {
28 m_actions.assign (actions, actions + num_actions);
29 m_signal_handled.assign (num_actions, false);
30 }
31 }
32
DNBThreadResumeActions(nub_state_t default_action,int signal)33 DNBThreadResumeActions::DNBThreadResumeActions (nub_state_t default_action, int signal) :
34 m_actions(),
35 m_signal_handled ()
36 {
37 SetDefaultThreadActionIfNeeded (default_action, signal);
38 }
39
40 void
Append(const DNBThreadResumeAction & action)41 DNBThreadResumeActions::Append (const DNBThreadResumeAction &action)
42 {
43 m_actions.push_back (action);
44 m_signal_handled.push_back (false);
45 }
46
47 void
AppendAction(nub_thread_t tid,nub_state_t state,int signal,nub_addr_t addr)48 DNBThreadResumeActions::AppendAction
49 (
50 nub_thread_t tid,
51 nub_state_t state,
52 int signal,
53 nub_addr_t addr
54 )
55 {
56 DNBThreadResumeAction action = { tid, state, signal, addr };
57 Append (action);
58 }
59
60
61 const DNBThreadResumeAction *
GetActionForThread(nub_thread_t tid,bool default_ok) const62 DNBThreadResumeActions::GetActionForThread (nub_thread_t tid, bool default_ok) const
63 {
64 const size_t num_actions = m_actions.size();
65 for (size_t i=0; i<num_actions; ++i)
66 {
67 if (m_actions[i].tid == tid)
68 return &m_actions[i];
69 }
70 if (default_ok && tid != INVALID_NUB_THREAD)
71 return GetActionForThread (INVALID_NUB_THREAD, false);
72 return NULL;
73 }
74
75 size_t
NumActionsWithState(nub_state_t state) const76 DNBThreadResumeActions::NumActionsWithState (nub_state_t state) const
77 {
78 size_t count = 0;
79 const size_t num_actions = m_actions.size();
80 for (size_t i=0; i<num_actions; ++i)
81 {
82 if (m_actions[i].state == state)
83 ++count;
84 }
85 return count;
86 }
87
88
89 bool
SetDefaultThreadActionIfNeeded(nub_state_t action,int signal)90 DNBThreadResumeActions::SetDefaultThreadActionIfNeeded (nub_state_t action, int signal)
91 {
92 if (GetActionForThread (INVALID_NUB_THREAD, true) == NULL)
93 {
94 // There isn't a default action so we do need to set it.
95 DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal, INVALID_NUB_ADDRESS };
96 m_actions.push_back (default_action);
97 m_signal_handled.push_back (false);
98 return true; // Return true as we did add the default action
99 }
100 return false;
101 }
102
103
104 void
SetSignalHandledForThread(nub_thread_t tid) const105 DNBThreadResumeActions::SetSignalHandledForThread (nub_thread_t tid) const
106 {
107 if (tid != INVALID_NUB_THREAD)
108 {
109 const size_t num_actions = m_actions.size();
110 for (size_t i=0; i<num_actions; ++i)
111 {
112 if (m_actions[i].tid == tid)
113 m_signal_handled[i] = true;
114 }
115 }
116 }
117