1254721Semaste//===-- ThreadSpec.cpp ----------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Target/Thread.h"
11254721Semaste#include "lldb/Target/ThreadSpec.h"
12254721Semaste
13254721Semasteusing namespace lldb;
14254721Semasteusing namespace lldb_private;
15254721Semaste
16254721SemasteThreadSpec::ThreadSpec() :
17254721Semaste    m_index (UINT32_MAX),
18254721Semaste    m_tid (LLDB_INVALID_THREAD_ID),
19254721Semaste    m_name(),
20254721Semaste    m_queue_name ()
21254721Semaste{
22254721Semaste}
23254721Semaste
24254721SemasteThreadSpec::ThreadSpec (const ThreadSpec &rhs) :
25254721Semaste    m_index(rhs.m_index),
26254721Semaste    m_tid(rhs.m_tid),
27254721Semaste    m_name(rhs.m_name),
28254721Semaste    m_queue_name(rhs.m_queue_name)
29254721Semaste{
30254721Semaste}
31254721Semaste
32254721Semasteconst ThreadSpec &
33254721SemasteThreadSpec::operator=(const ThreadSpec &rhs)
34254721Semaste{
35254721Semaste    m_index = rhs.m_index;
36254721Semaste    m_tid = rhs.m_tid;
37254721Semaste    m_name = rhs.m_name;
38254721Semaste    m_queue_name = rhs.m_queue_name;
39254721Semaste    return *this;
40254721Semaste}
41254721Semaste
42254721Semasteconst char *
43254721SemasteThreadSpec::GetName () const
44254721Semaste{
45254721Semaste    if (m_name.empty())
46254721Semaste        return NULL;
47254721Semaste    else
48254721Semaste        return m_name.c_str();
49254721Semaste}
50254721Semaste
51254721Semasteconst char *
52254721SemasteThreadSpec::GetQueueName () const
53254721Semaste{
54254721Semaste    if (m_queue_name.empty())
55254721Semaste        return NULL;
56254721Semaste    else
57254721Semaste        return m_queue_name.c_str();
58254721Semaste}
59254721Semaste
60254721Semastebool
61254721SemasteThreadSpec::TIDMatches (Thread &thread) const
62254721Semaste{
63254721Semaste    if (m_tid == LLDB_INVALID_THREAD_ID)
64254721Semaste        return true;
65254721Semaste
66254721Semaste    lldb::tid_t thread_id = thread.GetID();
67254721Semaste    return TIDMatches (thread_id);
68254721Semaste}
69254721Semastebool
70254721SemasteThreadSpec::IndexMatches (Thread &thread) const
71254721Semaste{
72254721Semaste    if (m_index == UINT32_MAX)
73254721Semaste        return true;
74254721Semaste    uint32_t index = thread.GetIndexID();
75254721Semaste    return IndexMatches (index);
76254721Semaste}
77254721Semastebool
78254721SemasteThreadSpec::NameMatches (Thread &thread) const
79254721Semaste{
80254721Semaste    if (m_name.empty())
81254721Semaste        return true;
82254721Semaste
83254721Semaste    const char *name = thread.GetName();
84254721Semaste    return NameMatches (name);
85254721Semaste}
86254721Semastebool
87254721SemasteThreadSpec::QueueNameMatches (Thread &thread) const
88254721Semaste{
89254721Semaste    if (m_queue_name.empty())
90254721Semaste        return true;
91254721Semaste
92254721Semaste    const char *queue_name = thread.GetQueueName();
93254721Semaste    return QueueNameMatches (queue_name);
94254721Semaste}
95254721Semaste
96254721Semastebool
97254721SemasteThreadSpec::ThreadPassesBasicTests (Thread &thread) const
98254721Semaste{
99254721Semaste
100254721Semaste    if (!HasSpecification())
101254721Semaste        return true;
102254721Semaste
103254721Semaste    if (!TIDMatches(thread))
104254721Semaste        return false;
105254721Semaste
106254721Semaste    if (!IndexMatches(thread))
107254721Semaste        return false;
108254721Semaste
109254721Semaste    if (!NameMatches (thread))
110254721Semaste        return false;
111254721Semaste
112254721Semaste    if (!QueueNameMatches (thread))
113254721Semaste        return false;
114254721Semaste
115254721Semaste    return true;
116254721Semaste
117254721Semaste}
118254721Semaste
119254721Semastebool
120254721SemasteThreadSpec::HasSpecification() const
121254721Semaste{
122254721Semaste    return (m_index != UINT32_MAX || m_tid != LLDB_INVALID_THREAD_ID || !m_name.empty() || !m_queue_name.empty());
123254721Semaste}
124254721Semastevoid
125254721SemasteThreadSpec::GetDescription (Stream *s, lldb::DescriptionLevel level) const
126254721Semaste{
127254721Semaste    if (!HasSpecification())
128254721Semaste    {
129254721Semaste        if (level == eDescriptionLevelBrief)
130254721Semaste        {
131254721Semaste            s->PutCString("thread spec: no ");
132254721Semaste        }
133254721Semaste    }
134254721Semaste    else
135254721Semaste    {
136254721Semaste        if (level == eDescriptionLevelBrief)
137254721Semaste        {
138254721Semaste            s->PutCString("thread spec: yes ");
139254721Semaste        }
140254721Semaste        else
141254721Semaste        {
142254721Semaste            if (GetTID() != LLDB_INVALID_THREAD_ID)
143254721Semaste                s->Printf("tid: 0x%" PRIx64 " ", GetTID());
144254721Semaste
145254721Semaste            if (GetIndex() != UINT32_MAX)
146254721Semaste                s->Printf("index: %d ", GetIndex());
147254721Semaste
148254721Semaste            const char *name = GetName();
149254721Semaste            if (name)
150254721Semaste                s->Printf ("thread name: \"%s\" ", name);
151254721Semaste
152254721Semaste            const char *queue_name = GetQueueName();
153254721Semaste            if (queue_name)
154254721Semaste                s->Printf ("queue name: \"%s\" ", queue_name);
155254721Semaste        }
156254721Semaste
157254721Semaste    }
158254721Semaste}
159