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