1//===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Created by Greg Clayton on 03/13/2010 11// 12//===----------------------------------------------------------------------===// 13 14#include "DNBThreadResumeActions.h" 15 16DNBThreadResumeActions::DNBThreadResumeActions() : 17 m_actions (), 18 m_signal_handled () 19{ 20} 21 22DNBThreadResumeActions::DNBThreadResumeActions (const DNBThreadResumeAction *actions, size_t num_actions) : 23 m_actions (), 24 m_signal_handled () 25{ 26 if (actions && num_actions) 27 { 28 m_actions.assign (actions, actions + num_actions); 29 m_signal_handled.assign (num_actions, false); 30 } 31} 32 33DNBThreadResumeActions::DNBThreadResumeActions (nub_state_t default_action, int signal) : 34 m_actions(), 35 m_signal_handled () 36{ 37 SetDefaultThreadActionIfNeeded (default_action, signal); 38} 39 40void 41DNBThreadResumeActions::Append (const DNBThreadResumeAction &action) 42{ 43 m_actions.push_back (action); 44 m_signal_handled.push_back (false); 45} 46 47void 48DNBThreadResumeActions::AppendAction 49( 50 nub_thread_t tid, 51 nub_state_t state, 52 int signal, 53 nub_addr_t addr 54) 55{ 56 DNBThreadResumeAction action = { tid, state, signal, addr }; 57 Append (action); 58} 59 60 61const DNBThreadResumeAction * 62DNBThreadResumeActions::GetActionForThread (nub_thread_t tid, bool default_ok) const 63{ 64 const size_t num_actions = m_actions.size(); 65 for (size_t i=0; i<num_actions; ++i) 66 { 67 if (m_actions[i].tid == tid) 68 return &m_actions[i]; 69 } 70 if (default_ok && tid != INVALID_NUB_THREAD) 71 return GetActionForThread (INVALID_NUB_THREAD, false); 72 return NULL; 73} 74 75size_t 76DNBThreadResumeActions::NumActionsWithState (nub_state_t state) const 77{ 78 size_t count = 0; 79 const size_t num_actions = m_actions.size(); 80 for (size_t i=0; i<num_actions; ++i) 81 { 82 if (m_actions[i].state == state) 83 ++count; 84 } 85 return count; 86} 87 88 89bool 90DNBThreadResumeActions::SetDefaultThreadActionIfNeeded (nub_state_t action, int signal) 91{ 92 if (GetActionForThread (INVALID_NUB_THREAD, true) == NULL) 93 { 94 // There isn't a default action so we do need to set it. 95 DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal, INVALID_NUB_ADDRESS }; 96 m_actions.push_back (default_action); 97 m_signal_handled.push_back (false); 98 return true; // Return true as we did add the default action 99 } 100 return false; 101} 102 103 104void 105DNBThreadResumeActions::SetSignalHandledForThread (nub_thread_t tid) const 106{ 107 if (tid != INVALID_NUB_THREAD) 108 { 109 const size_t num_actions = m_actions.size(); 110 for (size_t i=0; i<num_actions; ++i) 111 { 112 if (m_actions[i].tid == tid) 113 m_signal_handled[i] = true; 114 } 115 } 116} 117