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