aboutsummaryrefslogtreecommitdiff
path: root/tools/debugserver/source/DNBThreadResumeActions.cpp
blob: b50dd06178430bfb7b3ac5a399d15b167f88037c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//===-- DNBThreadResumeActions.cpp ------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Created by Greg Clayton on 03/13/2010
//
//===----------------------------------------------------------------------===//

#include "DNBThreadResumeActions.h"

DNBThreadResumeActions::DNBThreadResumeActions() :
    m_actions (),
    m_signal_handled ()
{
}

DNBThreadResumeActions::DNBThreadResumeActions (const DNBThreadResumeAction *actions, size_t num_actions) :
    m_actions (),
    m_signal_handled ()
{
    if (actions && num_actions)
    {
        m_actions.assign (actions, actions + num_actions);
        m_signal_handled.assign (num_actions, false);
    }
}

DNBThreadResumeActions::DNBThreadResumeActions (nub_state_t default_action, int signal) :
    m_actions(),
    m_signal_handled ()
{
    SetDefaultThreadActionIfNeeded (default_action, signal);
}

void
DNBThreadResumeActions::Append (const DNBThreadResumeAction &action)
{
    m_actions.push_back (action);
    m_signal_handled.push_back (false);
}

void
DNBThreadResumeActions::AppendAction
(
    nub_thread_t tid,
    nub_state_t state,
    int signal,
    nub_addr_t addr
)
{
    DNBThreadResumeAction action = { tid, state, signal, addr };
    Append (action);
}


const DNBThreadResumeAction *
DNBThreadResumeActions::GetActionForThread (nub_thread_t tid, bool default_ok) const
{
    const size_t num_actions = m_actions.size();
    for (size_t i=0; i<num_actions; ++i)
    {
        if (m_actions[i].tid == tid)
            return &m_actions[i];
    }
    if (default_ok && tid != INVALID_NUB_THREAD)
        return GetActionForThread (INVALID_NUB_THREAD, false);
    return NULL;
}

size_t
DNBThreadResumeActions::NumActionsWithState (nub_state_t state) const
{
    size_t count = 0;
    const size_t num_actions = m_actions.size();
    for (size_t i=0; i<num_actions; ++i)
    {
        if (m_actions[i].state == state)
            ++count;
    }
    return count;
}


bool
DNBThreadResumeActions::SetDefaultThreadActionIfNeeded (nub_state_t action, int signal)
{
    if (GetActionForThread (INVALID_NUB_THREAD, true) == NULL)
    {
        // There isn't a default action so we do need to set it.
        DNBThreadResumeAction default_action = {INVALID_NUB_THREAD, action, signal, INVALID_NUB_ADDRESS };
        m_actions.push_back (default_action);
        m_signal_handled.push_back (false);
        return true; // Return true as we did add the default action
    }
    return false;
}


void
DNBThreadResumeActions::SetSignalHandledForThread (nub_thread_t tid) const
{
    if (tid != INVALID_NUB_THREAD)
    {
        const size_t num_actions = m_actions.size();
        for (size_t i=0; i<num_actions; ++i)
        {
            if (m_actions[i].tid == tid)
                m_signal_handled[i] = true;
        }
    }
}