xref: /llvm-project/lldb/tools/debugserver/source/DNBThreadResumeActions.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
130fdc8d8SChris Lattner //===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner //
930fdc8d8SChris Lattner //  Created by Greg Clayton on 03/13/2010
1030fdc8d8SChris Lattner //
1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner #include "DNBThreadResumeActions.h"
1430fdc8d8SChris Lattner 
DNBThreadResumeActions()15b9c1b51eSKate Stone DNBThreadResumeActions::DNBThreadResumeActions()
16b9c1b51eSKate Stone     : m_actions(), m_signal_handled() {}
1730fdc8d8SChris Lattner 
DNBThreadResumeActions(const DNBThreadResumeAction * actions,size_t num_actions)18b9c1b51eSKate Stone DNBThreadResumeActions::DNBThreadResumeActions(
19b9c1b51eSKate Stone     const DNBThreadResumeAction *actions, size_t num_actions)
20b9c1b51eSKate Stone     : m_actions(), m_signal_handled() {
21b9c1b51eSKate Stone   if (actions && num_actions) {
2230fdc8d8SChris Lattner     m_actions.assign(actions, actions + num_actions);
2330fdc8d8SChris Lattner     m_signal_handled.assign(num_actions, false);
2430fdc8d8SChris Lattner   }
2530fdc8d8SChris Lattner }
2630fdc8d8SChris Lattner 
DNBThreadResumeActions(nub_state_t default_action,int signal)27b9c1b51eSKate Stone DNBThreadResumeActions::DNBThreadResumeActions(nub_state_t default_action,
28b9c1b51eSKate Stone                                                int signal)
29b9c1b51eSKate Stone     : m_actions(), m_signal_handled() {
3030fdc8d8SChris Lattner   SetDefaultThreadActionIfNeeded(default_action, signal);
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
Append(const DNBThreadResumeAction & action)33b9c1b51eSKate Stone void DNBThreadResumeActions::Append(const DNBThreadResumeAction &action) {
3430fdc8d8SChris Lattner   m_actions.push_back(action);
3530fdc8d8SChris Lattner   m_signal_handled.push_back(false);
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
AppendAction(nub_thread_t tid,nub_state_t state,int signal,nub_addr_t addr)38b9c1b51eSKate Stone void DNBThreadResumeActions::AppendAction(nub_thread_t tid, nub_state_t state,
39b9c1b51eSKate Stone                                           int signal, nub_addr_t addr) {
4030fdc8d8SChris Lattner   DNBThreadResumeAction action = {tid, state, signal, addr};
4130fdc8d8SChris Lattner   Append(action);
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner const DNBThreadResumeAction *
GetActionForThread(nub_thread_t tid,bool default_ok) const45b9c1b51eSKate Stone DNBThreadResumeActions::GetActionForThread(nub_thread_t tid,
46b9c1b51eSKate Stone                                            bool default_ok) const {
4730fdc8d8SChris Lattner   const size_t num_actions = m_actions.size();
48b9c1b51eSKate Stone   for (size_t i = 0; i < num_actions; ++i) {
4930fdc8d8SChris Lattner     if (m_actions[i].tid == tid)
5030fdc8d8SChris Lattner       return &m_actions[i];
5130fdc8d8SChris Lattner   }
5230fdc8d8SChris Lattner   if (default_ok && tid != INVALID_NUB_THREAD)
5330fdc8d8SChris Lattner     return GetActionForThread(INVALID_NUB_THREAD, false);
5430fdc8d8SChris Lattner   return NULL;
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
NumActionsWithState(nub_state_t state) const57b9c1b51eSKate Stone size_t DNBThreadResumeActions::NumActionsWithState(nub_state_t state) const {
5830fdc8d8SChris Lattner   size_t count = 0;
5930fdc8d8SChris Lattner   const size_t num_actions = m_actions.size();
60b9c1b51eSKate Stone   for (size_t i = 0; i < num_actions; ++i) {
6130fdc8d8SChris Lattner     if (m_actions[i].state == state)
6230fdc8d8SChris Lattner       ++count;
6330fdc8d8SChris Lattner   }
6430fdc8d8SChris Lattner   return count;
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
SetDefaultThreadActionIfNeeded(nub_state_t action,int signal)67b9c1b51eSKate Stone bool DNBThreadResumeActions::SetDefaultThreadActionIfNeeded(nub_state_t action,
68b9c1b51eSKate Stone                                                             int signal) {
69b9c1b51eSKate Stone   if (GetActionForThread(INVALID_NUB_THREAD, true) == NULL) {
7030fdc8d8SChris Lattner     // There isn't a default action so we do need to set it.
71b9c1b51eSKate Stone     DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal,
72b9c1b51eSKate Stone                                             INVALID_NUB_ADDRESS};
7330fdc8d8SChris Lattner     m_actions.push_back(default_action);
7430fdc8d8SChris Lattner     m_signal_handled.push_back(false);
7530fdc8d8SChris Lattner     return true; // Return true as we did add the default action
7630fdc8d8SChris Lattner   }
7730fdc8d8SChris Lattner   return false;
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
SetSignalHandledForThread(nub_thread_t tid) const80b9c1b51eSKate Stone void DNBThreadResumeActions::SetSignalHandledForThread(nub_thread_t tid) const {
81b9c1b51eSKate Stone   if (tid != INVALID_NUB_THREAD) {
8230fdc8d8SChris Lattner     const size_t num_actions = m_actions.size();
83b9c1b51eSKate Stone     for (size_t i = 0; i < num_actions; ++i) {
8430fdc8d8SChris Lattner       if (m_actions[i].tid == tid)
8530fdc8d8SChris Lattner         m_signal_handled[i] = true;
8630fdc8d8SChris Lattner     }
8730fdc8d8SChris Lattner   }
8830fdc8d8SChris Lattner }
89