1e65b2cf2SEugene Zelenko //===-- ThreadSpec.cpp ------------------------------------------*- C++ -*-===// 21b54c88cSJim Ingham // 31b54c88cSJim Ingham // The LLVM Compiler Infrastructure 41b54c88cSJim Ingham // 51b54c88cSJim Ingham // This file is distributed under the University of Illinois Open Source 61b54c88cSJim Ingham // License. See LICENSE.TXT for details. 71b54c88cSJim Ingham // 81b54c88cSJim Ingham //===----------------------------------------------------------------------===// 91b54c88cSJim Ingham 10e65b2cf2SEugene Zelenko // C Includes 11e65b2cf2SEugene Zelenko // C++ Includes 12e65b2cf2SEugene Zelenko // Other libraries and framework includes 13e65b2cf2SEugene Zelenko // Project includes 141b54c88cSJim Ingham #include "lldb/Target/Thread.h" 151b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h" 161b54c88cSJim Ingham 171b54c88cSJim Ingham using namespace lldb; 181b54c88cSJim Ingham using namespace lldb_private; 191b54c88cSJim Ingham 20*b9c1b51eSKate Stone ThreadSpec::ThreadSpec() 21*b9c1b51eSKate Stone : m_index(UINT32_MAX), m_tid(LLDB_INVALID_THREAD_ID), m_name(), 22*b9c1b51eSKate Stone m_queue_name() {} 231b54c88cSJim Ingham 24*b9c1b51eSKate Stone ThreadSpec::ThreadSpec(const ThreadSpec &rhs) 25*b9c1b51eSKate Stone : m_index(rhs.m_index), m_tid(rhs.m_tid), m_name(rhs.m_name), 26*b9c1b51eSKate Stone m_queue_name(rhs.m_queue_name) {} 271b54c88cSJim Ingham 28*b9c1b51eSKate Stone const ThreadSpec &ThreadSpec::operator=(const ThreadSpec &rhs) { 291b54c88cSJim Ingham m_index = rhs.m_index; 301b54c88cSJim Ingham m_tid = rhs.m_tid; 311b54c88cSJim Ingham m_name = rhs.m_name; 321b54c88cSJim Ingham m_queue_name = rhs.m_queue_name; 331b54c88cSJim Ingham return *this; 341b54c88cSJim Ingham } 351b54c88cSJim Ingham 36*b9c1b51eSKate Stone const char *ThreadSpec::GetName() const { 37e65b2cf2SEugene Zelenko return m_name.empty() ? nullptr : m_name.c_str(); 381b54c88cSJim Ingham } 391b54c88cSJim Ingham 40*b9c1b51eSKate Stone const char *ThreadSpec::GetQueueName() const { 41e65b2cf2SEugene Zelenko return m_queue_name.empty() ? nullptr : m_queue_name.c_str(); 421b54c88cSJim Ingham } 430136309fSJim Ingham 44*b9c1b51eSKate Stone bool ThreadSpec::TIDMatches(Thread &thread) const { 453d902922SJim Ingham if (m_tid == LLDB_INVALID_THREAD_ID) 463d902922SJim Ingham return true; 473d902922SJim Ingham 483d902922SJim Ingham lldb::tid_t thread_id = thread.GetID(); 493d902922SJim Ingham return TIDMatches(thread_id); 503d902922SJim Ingham } 51e65b2cf2SEugene Zelenko 52*b9c1b51eSKate Stone bool ThreadSpec::IndexMatches(Thread &thread) const { 533d902922SJim Ingham if (m_index == UINT32_MAX) 543d902922SJim Ingham return true; 553d902922SJim Ingham uint32_t index = thread.GetIndexID(); 563d902922SJim Ingham return IndexMatches(index); 573d902922SJim Ingham } 58e65b2cf2SEugene Zelenko 59*b9c1b51eSKate Stone bool ThreadSpec::NameMatches(Thread &thread) const { 603d902922SJim Ingham if (m_name.empty()) 613d902922SJim Ingham return true; 623d902922SJim Ingham 633d902922SJim Ingham const char *name = thread.GetName(); 643d902922SJim Ingham return NameMatches(name); 653d902922SJim Ingham } 66e65b2cf2SEugene Zelenko 67*b9c1b51eSKate Stone bool ThreadSpec::QueueNameMatches(Thread &thread) const { 683d902922SJim Ingham if (m_queue_name.empty()) 693d902922SJim Ingham return true; 703d902922SJim Ingham 713d902922SJim Ingham const char *queue_name = thread.GetQueueName(); 723d902922SJim Ingham return QueueNameMatches(queue_name); 733d902922SJim Ingham } 743d902922SJim Ingham 75*b9c1b51eSKate Stone bool ThreadSpec::ThreadPassesBasicTests(Thread &thread) const { 760136309fSJim Ingham if (!HasSpecification()) 770136309fSJim Ingham return true; 780136309fSJim Ingham 793d902922SJim Ingham if (!TIDMatches(thread)) 800136309fSJim Ingham return false; 810136309fSJim Ingham 823d902922SJim Ingham if (!IndexMatches(thread)) 830136309fSJim Ingham return false; 840136309fSJim Ingham 853d902922SJim Ingham if (!NameMatches(thread)) 860136309fSJim Ingham return false; 870136309fSJim Ingham 883d902922SJim Ingham if (!QueueNameMatches(thread)) 890136309fSJim Ingham return false; 900136309fSJim Ingham 910136309fSJim Ingham return true; 920136309fSJim Ingham } 930136309fSJim Ingham 94*b9c1b51eSKate Stone bool ThreadSpec::HasSpecification() const { 95*b9c1b51eSKate Stone return (m_index != UINT32_MAX || m_tid != LLDB_INVALID_THREAD_ID || 96*b9c1b51eSKate Stone !m_name.empty() || !m_queue_name.empty()); 970136309fSJim Ingham } 98e65b2cf2SEugene Zelenko 99*b9c1b51eSKate Stone void ThreadSpec::GetDescription(Stream *s, lldb::DescriptionLevel level) const { 100*b9c1b51eSKate Stone if (!HasSpecification()) { 101*b9c1b51eSKate Stone if (level == eDescriptionLevelBrief) { 1020136309fSJim Ingham s->PutCString("thread spec: no "); 1030136309fSJim Ingham } 104*b9c1b51eSKate Stone } else { 105*b9c1b51eSKate Stone if (level == eDescriptionLevelBrief) { 1060136309fSJim Ingham s->PutCString("thread spec: yes "); 107*b9c1b51eSKate Stone } else { 1080136309fSJim Ingham if (GetTID() != LLDB_INVALID_THREAD_ID) 109d01b2953SDaniel Malea s->Printf("tid: 0x%" PRIx64 " ", GetTID()); 1100136309fSJim Ingham 111bdf4c6acSGreg Clayton if (GetIndex() != UINT32_MAX) 1120136309fSJim Ingham s->Printf("index: %d ", GetIndex()); 1130136309fSJim Ingham 1140136309fSJim Ingham const char *name = GetName(); 1150136309fSJim Ingham if (name) 1160136309fSJim Ingham s->Printf("thread name: \"%s\" ", name); 1170136309fSJim Ingham 1180136309fSJim Ingham const char *queue_name = GetQueueName(); 1190136309fSJim Ingham if (queue_name) 1200136309fSJim Ingham s->Printf("queue name: \"%s\" ", queue_name); 1210136309fSJim Ingham } 1220136309fSJim Ingham } 1230136309fSJim Ingham } 124