1*e65b2cf2SEugene 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 10*e65b2cf2SEugene Zelenko // C Includes 11*e65b2cf2SEugene Zelenko // C++ Includes 12*e65b2cf2SEugene Zelenko // Other libraries and framework includes 13*e65b2cf2SEugene 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 201b54c88cSJim Ingham ThreadSpec::ThreadSpec() : 21bdf4c6acSGreg Clayton m_index (UINT32_MAX), 221b54c88cSJim Ingham m_tid (LLDB_INVALID_THREAD_ID), 231b54c88cSJim Ingham m_name(), 241b54c88cSJim Ingham m_queue_name () 251b54c88cSJim Ingham { 261b54c88cSJim Ingham } 271b54c88cSJim Ingham 281b54c88cSJim Ingham ThreadSpec::ThreadSpec(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 { 341b54c88cSJim Ingham } 351b54c88cSJim Ingham 361b54c88cSJim Ingham const ThreadSpec & 371b54c88cSJim Ingham ThreadSpec::operator=(const ThreadSpec &rhs) 381b54c88cSJim Ingham { 391b54c88cSJim Ingham m_index = rhs.m_index; 401b54c88cSJim Ingham m_tid = rhs.m_tid; 411b54c88cSJim Ingham m_name = rhs.m_name; 421b54c88cSJim Ingham m_queue_name = rhs.m_queue_name; 431b54c88cSJim Ingham return *this; 441b54c88cSJim Ingham } 451b54c88cSJim Ingham 461b54c88cSJim Ingham const char * 471b54c88cSJim Ingham ThreadSpec::GetName () const 481b54c88cSJim Ingham { 49*e65b2cf2SEugene Zelenko return m_name.empty() ? nullptr : m_name.c_str(); 501b54c88cSJim Ingham } 511b54c88cSJim Ingham 521b54c88cSJim Ingham const char * 531b54c88cSJim Ingham ThreadSpec::GetQueueName () const 541b54c88cSJim Ingham { 55*e65b2cf2SEugene Zelenko return m_queue_name.empty() ? nullptr : m_queue_name.c_str(); 561b54c88cSJim Ingham } 570136309fSJim Ingham 580136309fSJim Ingham bool 593d902922SJim Ingham ThreadSpec::TIDMatches (Thread &thread) const 603d902922SJim Ingham { 613d902922SJim Ingham if (m_tid == LLDB_INVALID_THREAD_ID) 623d902922SJim Ingham return true; 633d902922SJim Ingham 643d902922SJim Ingham lldb::tid_t thread_id = thread.GetID(); 653d902922SJim Ingham return TIDMatches (thread_id); 663d902922SJim Ingham } 67*e65b2cf2SEugene Zelenko 683d902922SJim Ingham bool 693d902922SJim Ingham ThreadSpec::IndexMatches (Thread &thread) const 703d902922SJim Ingham { 713d902922SJim Ingham if (m_index == UINT32_MAX) 723d902922SJim Ingham return true; 733d902922SJim Ingham uint32_t index = thread.GetIndexID(); 743d902922SJim Ingham return IndexMatches (index); 753d902922SJim Ingham } 76*e65b2cf2SEugene Zelenko 773d902922SJim Ingham bool 783d902922SJim Ingham ThreadSpec::NameMatches (Thread &thread) const 793d902922SJim Ingham { 803d902922SJim Ingham if (m_name.empty()) 813d902922SJim Ingham return true; 823d902922SJim Ingham 833d902922SJim Ingham const char *name = thread.GetName(); 843d902922SJim Ingham return NameMatches (name); 853d902922SJim Ingham } 86*e65b2cf2SEugene Zelenko 873d902922SJim Ingham bool 883d902922SJim Ingham ThreadSpec::QueueNameMatches (Thread &thread) const 893d902922SJim Ingham { 903d902922SJim Ingham if (m_queue_name.empty()) 913d902922SJim Ingham return true; 923d902922SJim Ingham 933d902922SJim Ingham const char *queue_name = thread.GetQueueName(); 943d902922SJim Ingham return QueueNameMatches (queue_name); 953d902922SJim Ingham } 963d902922SJim Ingham 973d902922SJim Ingham bool 983d902922SJim Ingham ThreadSpec::ThreadPassesBasicTests (Thread &thread) const 990136309fSJim Ingham { 1000136309fSJim Ingham if (!HasSpecification()) 1010136309fSJim Ingham return true; 1020136309fSJim Ingham 1033d902922SJim Ingham if (!TIDMatches(thread)) 1040136309fSJim Ingham return false; 1050136309fSJim Ingham 1063d902922SJim Ingham if (!IndexMatches(thread)) 1070136309fSJim Ingham return false; 1080136309fSJim Ingham 1093d902922SJim Ingham if (!NameMatches (thread)) 1100136309fSJim Ingham return false; 1110136309fSJim Ingham 1123d902922SJim Ingham if (!QueueNameMatches (thread)) 1130136309fSJim Ingham return false; 1140136309fSJim Ingham 1150136309fSJim Ingham return true; 1160136309fSJim Ingham } 1170136309fSJim Ingham 1180136309fSJim Ingham bool 1190136309fSJim Ingham ThreadSpec::HasSpecification() const 1200136309fSJim Ingham { 121bdf4c6acSGreg Clayton return (m_index != UINT32_MAX || m_tid != LLDB_INVALID_THREAD_ID || !m_name.empty() || !m_queue_name.empty()); 1220136309fSJim Ingham } 123*e65b2cf2SEugene Zelenko 1240136309fSJim Ingham void 1250136309fSJim Ingham ThreadSpec::GetDescription (Stream *s, lldb::DescriptionLevel level) const 1260136309fSJim Ingham { 1270136309fSJim Ingham if (!HasSpecification()) 1280136309fSJim Ingham { 1290136309fSJim Ingham if (level == eDescriptionLevelBrief) 1300136309fSJim Ingham { 1310136309fSJim Ingham s->PutCString("thread spec: no "); 1320136309fSJim Ingham } 1330136309fSJim Ingham } 1340136309fSJim Ingham else 1350136309fSJim Ingham { 1360136309fSJim Ingham if (level == eDescriptionLevelBrief) 1370136309fSJim Ingham { 1380136309fSJim Ingham s->PutCString("thread spec: yes "); 1390136309fSJim Ingham } 1400136309fSJim Ingham else 1410136309fSJim Ingham { 1420136309fSJim Ingham if (GetTID() != LLDB_INVALID_THREAD_ID) 143d01b2953SDaniel Malea s->Printf("tid: 0x%" PRIx64 " ", GetTID()); 1440136309fSJim Ingham 145bdf4c6acSGreg Clayton if (GetIndex() != UINT32_MAX) 1460136309fSJim Ingham s->Printf("index: %d ", GetIndex()); 1470136309fSJim Ingham 1480136309fSJim Ingham const char *name = GetName(); 1490136309fSJim Ingham if (name) 1500136309fSJim Ingham s->Printf ("thread name: \"%s\" ", name); 1510136309fSJim Ingham 1520136309fSJim Ingham const char *queue_name = GetQueueName(); 1530136309fSJim Ingham if (queue_name) 1540136309fSJim Ingham s->Printf ("queue name: \"%s\" ", queue_name); 1550136309fSJim Ingham } 1560136309fSJim Ingham 1570136309fSJim Ingham } 1580136309fSJim Ingham } 159