124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 03/13/2010 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBThreadResumeActions.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::DNBThreadResumeActions() : 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_actions (), 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled () 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::DNBThreadResumeActions (const DNBThreadResumeAction *actions, size_t num_actions) : 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_actions (), 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled () 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (actions && num_actions) 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_actions.assign (actions, actions + num_actions); 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled.assign (num_actions, false); 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::DNBThreadResumeActions (nub_state_t default_action, int signal) : 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_actions(), 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled () 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetDefaultThreadActionIfNeeded (default_action, signal); 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::Append (const DNBThreadResumeAction &action) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_actions.push_back (action); 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled.push_back (false); 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::AppendAction 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_thread_t tid, 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_state_t state, 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int signal, 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_addr_t addr 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBThreadResumeAction action = { tid, state, signal, addr }; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Append (action); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DNBThreadResumeAction * 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::GetActionForThread (nub_thread_t tid, bool default_ok) const 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_actions = m_actions.size(); 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<num_actions; ++i) 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_actions[i].tid == tid) 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_actions[i]; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (default_ok && tid != INVALID_NUB_THREAD) 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetActionForThread (INVALID_NUB_THREAD, false); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::NumActionsWithState (nub_state_t state) const 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t count = 0; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_actions = m_actions.size(); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<num_actions; ++i) 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_actions[i].state == state) 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++count; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return count; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::SetDefaultThreadActionIfNeeded (nub_state_t action, int signal) 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetActionForThread (INVALID_NUB_THREAD, true) == NULL) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There isn't a default action so we do need to set it. 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal, INVALID_NUB_ADDRESS }; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_actions.push_back (default_action); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled.push_back (false); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; // Return true as we did add the default action 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBThreadResumeActions::SetSignalHandledForThread (nub_thread_t tid) const 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tid != INVALID_NUB_THREAD) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_actions = m_actions.size(); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<num_actions; ++i) 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_actions[i].tid == tid) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_signal_handled[i] = true; 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117