1//===-- ThreadSpec.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#include "lldb/Target/Thread.h" 11#include "lldb/Target/ThreadSpec.h" 12 13using namespace lldb; 14using namespace lldb_private; 15 16ThreadSpec::ThreadSpec() : 17 m_index (UINT32_MAX), 18 m_tid (LLDB_INVALID_THREAD_ID), 19 m_name(), 20 m_queue_name () 21{ 22} 23 24ThreadSpec::ThreadSpec (const ThreadSpec &rhs) : 25 m_index(rhs.m_index), 26 m_tid(rhs.m_tid), 27 m_name(rhs.m_name), 28 m_queue_name(rhs.m_queue_name) 29{ 30} 31 32const ThreadSpec & 33ThreadSpec::operator=(const ThreadSpec &rhs) 34{ 35 m_index = rhs.m_index; 36 m_tid = rhs.m_tid; 37 m_name = rhs.m_name; 38 m_queue_name = rhs.m_queue_name; 39 return *this; 40} 41 42const char * 43ThreadSpec::GetName () const 44{ 45 if (m_name.empty()) 46 return NULL; 47 else 48 return m_name.c_str(); 49} 50 51const char * 52ThreadSpec::GetQueueName () const 53{ 54 if (m_queue_name.empty()) 55 return NULL; 56 else 57 return m_queue_name.c_str(); 58} 59 60bool 61ThreadSpec::TIDMatches (Thread &thread) const 62{ 63 if (m_tid == LLDB_INVALID_THREAD_ID) 64 return true; 65 66 lldb::tid_t thread_id = thread.GetID(); 67 return TIDMatches (thread_id); 68} 69bool 70ThreadSpec::IndexMatches (Thread &thread) const 71{ 72 if (m_index == UINT32_MAX) 73 return true; 74 uint32_t index = thread.GetIndexID(); 75 return IndexMatches (index); 76} 77bool 78ThreadSpec::NameMatches (Thread &thread) const 79{ 80 if (m_name.empty()) 81 return true; 82 83 const char *name = thread.GetName(); 84 return NameMatches (name); 85} 86bool 87ThreadSpec::QueueNameMatches (Thread &thread) const 88{ 89 if (m_queue_name.empty()) 90 return true; 91 92 const char *queue_name = thread.GetQueueName(); 93 return QueueNameMatches (queue_name); 94} 95 96bool 97ThreadSpec::ThreadPassesBasicTests (Thread &thread) const 98{ 99 100 if (!HasSpecification()) 101 return true; 102 103 if (!TIDMatches(thread)) 104 return false; 105 106 if (!IndexMatches(thread)) 107 return false; 108 109 if (!NameMatches (thread)) 110 return false; 111 112 if (!QueueNameMatches (thread)) 113 return false; 114 115 return true; 116 117} 118 119bool 120ThreadSpec::HasSpecification() const 121{ 122 return (m_index != UINT32_MAX || m_tid != LLDB_INVALID_THREAD_ID || !m_name.empty() || !m_queue_name.empty()); 123} 124void 125ThreadSpec::GetDescription (Stream *s, lldb::DescriptionLevel level) const 126{ 127 if (!HasSpecification()) 128 { 129 if (level == eDescriptionLevelBrief) 130 { 131 s->PutCString("thread spec: no "); 132 } 133 } 134 else 135 { 136 if (level == eDescriptionLevelBrief) 137 { 138 s->PutCString("thread spec: yes "); 139 } 140 else 141 { 142 if (GetTID() != LLDB_INVALID_THREAD_ID) 143 s->Printf("tid: 0x%" PRIx64 " ", GetTID()); 144 145 if (GetIndex() != UINT32_MAX) 146 s->Printf("index: %d ", GetIndex()); 147 148 const char *name = GetName(); 149 if (name) 150 s->Printf ("thread name: \"%s\" ", name); 151 152 const char *queue_name = GetQueueName(); 153 if (queue_name) 154 s->Printf ("queue name: \"%s\" ", queue_name); 155 } 156 157 } 158} 159