Home | History | Annotate | Download | only in Target
      1 //===-- ThreadSpec.h ------------------------------------------------*- 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 #ifndef liblldb_ThreadSpec_h_
     11 #define liblldb_ThreadSpec_h_
     12 
     13 #include <map>
     14 #include <string>
     15 
     16 #include "lldb/lldb-private.h"
     17 
     18 namespace lldb_private {
     19 
     20 // Note: For now the thread spec has only fixed elements -
     21 //   Thread ID
     22 //   Thread Index
     23 //   Thread Name
     24 //   Thread Queue Name
     25 //
     26 //  But if we need more generality, we can hang a key/value map off of this structure.
     27 //  That's why the thread matches spec test is done as a virtual method in Thread::MatchesSpec,
     28 //  since it is the native thread that would know how to interpret the keys.
     29 //  I was going to do the Queue Name this way out of sheer orneriness, but that seems a
     30 //  sufficiently general concept, so I put it in here on its own.
     31 
     32 class ThreadSpec
     33 {
     34 public:
     35     ThreadSpec ();
     36 
     37     ThreadSpec (const ThreadSpec &rhs);
     38 
     39     const ThreadSpec &
     40     operator=(const ThreadSpec &rhs);
     41 
     42     void
     43     SetIndex (uint32_t index)
     44     {
     45         m_index = index;
     46     }
     47 
     48     void
     49     SetTID   (lldb::tid_t tid)
     50     {
     51         m_tid = tid;
     52     }
     53 
     54     void
     55     SetName (const char *name)
     56     {
     57         m_name = name;
     58     }
     59 
     60     void
     61     SetQueueName (const char *queue_name)
     62     {
     63         m_queue_name = queue_name;
     64     }
     65 
     66     uint32_t
     67     GetIndex () const
     68     {
     69         return m_index;
     70     }
     71 
     72     lldb::tid_t
     73     GetTID () const
     74     {
     75         return m_tid;
     76     }
     77 
     78     const char *
     79     GetName () const;
     80 
     81     const char *
     82     GetQueueName () const;
     83 
     84     bool
     85     TIDMatches (lldb::tid_t thread_id) const
     86     {
     87         if (m_tid == LLDB_INVALID_THREAD_ID || thread_id == LLDB_INVALID_THREAD_ID)
     88             return true;
     89         else
     90             return thread_id == m_tid;
     91     }
     92 
     93     bool
     94     TIDMatches (Thread &thread) const;
     95 
     96     bool
     97     IndexMatches (uint32_t index) const
     98     {
     99         if (m_index == UINT32_MAX || index == UINT32_MAX)
    100             return true;
    101         else
    102             return index == m_index;
    103     }
    104 
    105     bool
    106     IndexMatches (Thread &thread) const;
    107 
    108     bool
    109     NameMatches (const char *name) const
    110     {
    111         if (m_name.empty())
    112             return true;
    113         else if (name == NULL)
    114             return false;
    115         else
    116             return m_name == name;
    117     }
    118 
    119     bool
    120     NameMatches (Thread &thread) const;
    121 
    122     bool
    123     QueueNameMatches (const char *queue_name) const
    124     {
    125         if (m_queue_name.empty())
    126             return true;
    127         else if (queue_name == NULL)
    128             return false;
    129         else
    130             return m_queue_name == queue_name;
    131     }
    132 
    133     bool
    134     QueueNameMatches (Thread &thread) const;
    135 
    136     bool
    137     ThreadPassesBasicTests (Thread &thread) const;
    138 
    139     bool
    140     HasSpecification () const;
    141 
    142     void
    143     GetDescription (Stream *s, lldb::DescriptionLevel level) const;
    144 
    145 protected:
    146 private:
    147     uint32_t m_index;
    148     lldb::tid_t m_tid;
    149     std::string m_name;
    150     std::string m_queue_name;
    151 };
    152 
    153 } // namespace lldb_private
    154 
    155 #endif  // liblldb_ThreadSpec_h_
    156