1 //===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  Created by Greg Clayton on 03/13/2010
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "DNBThreadResumeActions.h"
14 
DNBThreadResumeActions()15 DNBThreadResumeActions::DNBThreadResumeActions()
16     : m_actions(), m_signal_handled() {}
17 
DNBThreadResumeActions(const DNBThreadResumeAction * actions,size_t num_actions)18 DNBThreadResumeActions::DNBThreadResumeActions(
19     const DNBThreadResumeAction *actions, size_t num_actions)
20     : m_actions(), m_signal_handled() {
21   if (actions && num_actions) {
22     m_actions.assign(actions, actions + num_actions);
23     m_signal_handled.assign(num_actions, false);
24   }
25 }
26 
DNBThreadResumeActions(nub_state_t default_action,int signal)27 DNBThreadResumeActions::DNBThreadResumeActions(nub_state_t default_action,
28                                                int signal)
29     : m_actions(), m_signal_handled() {
30   SetDefaultThreadActionIfNeeded(default_action, signal);
31 }
32 
Append(const DNBThreadResumeAction & action)33 void DNBThreadResumeActions::Append(const DNBThreadResumeAction &action) {
34   m_actions.push_back(action);
35   m_signal_handled.push_back(false);
36 }
37 
AppendAction(nub_thread_t tid,nub_state_t state,int signal,nub_addr_t addr)38 void DNBThreadResumeActions::AppendAction(nub_thread_t tid, nub_state_t state,
39                                           int signal, nub_addr_t addr) {
40   DNBThreadResumeAction action = {tid, state, signal, addr};
41   Append(action);
42 }
43 
44 const DNBThreadResumeAction *
GetActionForThread(nub_thread_t tid,bool default_ok) const45 DNBThreadResumeActions::GetActionForThread(nub_thread_t tid,
46                                            bool default_ok) const {
47   const size_t num_actions = m_actions.size();
48   for (size_t i = 0; i < num_actions; ++i) {
49     if (m_actions[i].tid == tid)
50       return &m_actions[i];
51   }
52   if (default_ok && tid != INVALID_NUB_THREAD)
53     return GetActionForThread(INVALID_NUB_THREAD, false);
54   return NULL;
55 }
56 
NumActionsWithState(nub_state_t state) const57 size_t DNBThreadResumeActions::NumActionsWithState(nub_state_t state) const {
58   size_t count = 0;
59   const size_t num_actions = m_actions.size();
60   for (size_t i = 0; i < num_actions; ++i) {
61     if (m_actions[i].state == state)
62       ++count;
63   }
64   return count;
65 }
66 
SetDefaultThreadActionIfNeeded(nub_state_t action,int signal)67 bool DNBThreadResumeActions::SetDefaultThreadActionIfNeeded(nub_state_t action,
68                                                             int signal) {
69   if (GetActionForThread(INVALID_NUB_THREAD, true) == NULL) {
70     // There isn't a default action so we do need to set it.
71     DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal,
72                                             INVALID_NUB_ADDRESS};
73     m_actions.push_back(default_action);
74     m_signal_handled.push_back(false);
75     return true; // Return true as we did add the default action
76   }
77   return false;
78 }
79 
SetSignalHandledForThread(nub_thread_t tid) const80 void DNBThreadResumeActions::SetSignalHandledForThread(nub_thread_t tid) const {
81   if (tid != INVALID_NUB_THREAD) {
82     const size_t num_actions = m_actions.size();
83     for (size_t i = 0; i < num_actions; ++i) {
84       if (m_actions[i].tid == tid)
85         m_signal_handled[i] = true;
86     }
87   }
88 }
89