X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcommon%2Fptid.h;h=f5625a61387b5bfd44b88f464571b5ace1de921f;hb=5b0e2db4fa08b43e9ff78d6e9a45d496522bd241;hp=337bfb0899d090d2c9ea5d3ebb7573be362ec23b;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/common/ptid.h b/gdb/common/ptid.h index 337bfb0899..f5625a6138 100644 --- a/gdb/common/ptid.h +++ b/gdb/common/ptid.h @@ -1,6 +1,6 @@ /* The ptid_t type and common functions operating on it. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef PTID_H -#define PTID_H +#ifndef COMMON_PTID_H +#define COMMON_PTID_H /* The ptid struct is a collection of the various "ids" necessary for identifying the inferior process/thread being debugged. This @@ -32,65 +32,124 @@ thread_stratum target that might want to sit on top. */ -struct ptid +class ptid_t { - /* Process id. */ - int pid; +public: + /* Must have a trivial defaulted default constructor so that the + type remains POD. */ + ptid_t () noexcept = default; - /* Lightweight process id. */ - long lwp; + /* Make a ptid given the necessary PID, LWP, and TID components. - /* Thread id. */ - long tid; -}; + A ptid with only a PID (LWP and TID equal to zero) is usually used to + represent a whole process, including all its lwps/threads. */ -typedef struct ptid ptid_t; + explicit constexpr ptid_t (int pid, long lwp = 0, long tid = 0) + : m_pid (pid), m_lwp (lwp), m_tid (tid) + {} -/* The null or zero ptid, often used to indicate no process. */ -extern ptid_t null_ptid; + /* Fetch the pid (process id) component from the ptid. */ -/* The (-1,0,0) ptid, often used to indicate either an error condition - or a "don't care" condition, i.e, "run all threads." */ -extern ptid_t minus_one_ptid; + constexpr int pid () const + { return m_pid; } + + /* Return true if the ptid's lwp member is non-zero. */ + + constexpr bool lwp_p () const + { return m_lwp != 0; } + + /* Fetch the lwp (lightweight process) component from the ptid. */ + + constexpr long lwp () const + { return m_lwp; } + + /* Return true if the ptid's tid member is non-zero. */ + + constexpr bool tid_p () const + { return m_tid != 0; } + + /* Fetch the tid (thread id) component from a ptid. */ + + constexpr long tid () const + { return m_tid; } + + /* Return true if the ptid represents a whole process, including all its + lwps/threads. Such ptids have the form of (pid, 0, 0), with + pid != -1. */ -/* Make a ptid given the necessary PID, LWP, and TID components. */ -ptid_t ptid_build (int pid, long lwp, long tid); + constexpr bool is_pid () const + { + return (*this != make_null () + && *this != make_minus_one () + && m_lwp == 0 + && m_tid == 0); + } -/* Make a new ptid from just a pid. This ptid is usually used to - represent a whole process, including all its lwps/threads. */ -ptid_t pid_to_ptid (int pid); + /* Compare two ptids to see if they are equal. */ -/* Fetch the pid (process id) component from a ptid. */ -int ptid_get_pid (ptid_t ptid); + constexpr bool operator== (const ptid_t &other) const + { + return (m_pid == other.m_pid + && m_lwp == other.m_lwp + && m_tid == other.m_tid); + } -/* Fetch the lwp (lightweight process) component from a ptid. */ -long ptid_get_lwp (ptid_t ptid); + /* Compare two ptids to see if they are different. */ -/* Fetch the tid (thread id) component from a ptid. */ -long ptid_get_tid (ptid_t ptid); + constexpr bool operator!= (const ptid_t &other) const + { + return !(*this == other); + } -/* Compare two ptids to see if they are equal. */ -int ptid_equal (ptid_t ptid1, ptid_t ptid2); + /* Return true if the ptid matches FILTER. FILTER can be the wild + card MINUS_ONE_PTID (all ptids match it); can be a ptid representing + a process (ptid.is_pid () returns true), in which case, all lwps and + threads of that given process match, lwps and threads of other + processes do not; or, it can represent a specific thread, in which + case, only that thread will match true. The ptid must represent a + specific LWP or THREAD, it can never be a wild card. */ -/* Returns true if PTID represents a whole process, including all its - lwps/threads. Such ptids have the form of (pid,0,0), with pid != - -1. */ -int ptid_is_pid (ptid_t ptid); + constexpr bool matches (const ptid_t &filter) const + { + return (/* If filter represents any ptid, it's always a match. */ + filter == make_minus_one () + /* If filter is only a pid, any ptid with that pid + matches. */ + || (filter.is_pid () && m_pid == filter.pid ()) -/* Return true if PTID's lwp member is non-zero. */ -int ptid_lwp_p (ptid_t ptid); + /* Otherwise, this ptid only matches if it's exactly equal + to filter. */ + || *this == filter); + } -/* Return true if PTID's tid member is non-zero. */ -int ptid_tid_p (ptid_t ptid); + /* Make a null ptid. */ -/* Returns true if PTID matches filter FILTER. FILTER can be the wild - card MINUS_ONE_PTID (all ptid match it); can be a ptid representing - a process (ptid_is_pid returns true), in which case, all lwps and - threads of that given process match, lwps and threads of other - processes do not; or, it can represent a specific thread, in which - case, only that thread will match true. PTID must represent a - specific LWP or THREAD, it can never be a wild card. */ + static constexpr ptid_t make_null () + { return ptid_t (0, 0, 0); } + + /* Make a minus one ptid. */ + + static constexpr ptid_t make_minus_one () + { return ptid_t (-1, 0, 0); } + +private: + /* Process id. */ + int m_pid; + + /* Lightweight process id. */ + long m_lwp; + + /* Thread id. */ + long m_tid; +}; + +/* The null or zero ptid, often used to indicate no process. */ + +extern const ptid_t null_ptid; + +/* The (-1,0,0) ptid, often used to indicate either an error condition + or a "don't care" condition, i.e, "run all threads." */ -extern int ptid_match (ptid_t ptid, ptid_t filter); +extern const ptid_t minus_one_ptid; -#endif +#endif /* COMMON_PTID_H */