xref: /openbsd-src/gnu/llvm/lldb/tools/debugserver/source/DNBThreadResumeActions.cpp (revision 061da546b983eb767bad15e67af1174fb0bcf31c)
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