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