89 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// Created by Greg Clayton on 03/13/201010//11//===----------------------------------------------------------------------===//12 13#include "DNBThreadResumeActions.h"14 15DNBThreadResumeActions::DNBThreadResumeActions()16 : m_actions(), m_signal_handled() {}17 18DNBThreadResumeActions::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 27DNBThreadResumeActions::DNBThreadResumeActions(nub_state_t default_action,28 int signal)29 : m_actions(), m_signal_handled() {30 SetDefaultThreadActionIfNeeded(default_action, signal);31}32 33void DNBThreadResumeActions::Append(const DNBThreadResumeAction &action) {34 m_actions.push_back(action);35 m_signal_handled.push_back(false);36}37 38void 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 44const DNBThreadResumeAction *45DNBThreadResumeActions::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 57size_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 67bool 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 action76 }77 return false;78}79 80void 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