Changeset 3327

Show
Ignore:
Timestamp:
01/29/10 13:00:29 (7 weeks ago)
Author:
mgray
Message:

Added getCurrentThreadId() and getThreadId() method implementations to Zen::Threading::I_Thread and associated concrete implementations.

Location:
Core/branches/0075_TR_SCRIPTING/Threading
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • Core/branches/0075_TR_SCRIPTING/Threading/I_Thread.hpp

    r298 r3327  
    3131#include <boost/noncopyable.hpp> 
    3232 
     33#include <string> 
     34 
    3335//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    3436namespace Zen { 
     
    4244    /// @{ 
    4345public: 
     46    struct ThreadId; 
    4447    /// @} 
    4548 
     
    5659        /// Block until this I_Thread has terminated. 
    5760        virtual void join() = 0; 
     61 
     62    /// Returns a copy of running (kernel-)thread's id, rendered in this  
     63    /// object's id format (so that you can safely compare it to  
     64    /// getThreadId()).  Always valid. 
     65    virtual ThreadId getCurrentThreadId() const = 0; 
     66 
     67    /// Returns a copy of this object's id. Not valid until after start(). 
     68    virtual const ThreadId& getThreadId() const = 0;  
    5869    /// @} 
    5970 
     
    6273public: 
    6374    static void sleepForMilliseconds(unsigned const _milliseconds); // current thread will sleep 
     75    /// @} 
     76 
     77    /// @name Inner Classes 
     78    /// @{ 
     79public: 
     80    struct ThreadId 
     81    { 
     82        /// @name Inner Interfaces 
     83        /// @{ 
     84    public: 
     85        class I_NativeThreadId 
     86        { 
     87            /// @name Types 
     88            /// @{ 
     89        public: 
     90            /// @} 
     91 
     92            /// @name I_NativeThreadId interface 
     93            /// @{ 
     94        public: 
     95            virtual bool operator==(const I_NativeThreadId& _otherId) const = 0; 
     96            virtual bool operator!=(const I_NativeThreadId& _otherId) const = 0; 
     97            virtual I_NativeThreadId* clone() const = 0; 
     98            virtual std::string toString() const = 0; 
     99            /// @} 
     100 
     101            /// @name 'Structors 
     102            /// @{ 
     103        public: 
     104                     I_NativeThreadId() {} 
     105            virtual ~I_NativeThreadId() {} 
     106            /// @} 
     107 
     108        };  // class I_NativeThreadId 
     109        /// @} 
     110 
     111        /// @name ThreadId implementation 
     112        /// @{ 
     113    public: 
     114        ThreadId& operator=  (const ThreadId& _otherId)       {delete m_pNativeThreadId; m_pNativeThreadId = _otherId.m_pNativeThreadId->clone(); return *this;} 
     115        bool      operator== (const ThreadId& _otherId) const {return (m_pNativeThreadId == _otherId.m_pNativeThreadId) || ( m_pNativeThreadId &&  _otherId.m_pNativeThreadId && (*m_pNativeThreadId == *_otherId.m_pNativeThreadId));} 
     116        bool      operator!= (const ThreadId& _otherId) const {return (m_pNativeThreadId != _otherId.m_pNativeThreadId) && (!m_pNativeThreadId || !_otherId.m_pNativeThreadId || (*m_pNativeThreadId != *_otherId.m_pNativeThreadId));} 
     117                  operator std::string ()               const {return m_pNativeThreadId ? m_pNativeThreadId->toString() : "";} 
     118        std::string toString()                          const {return m_pNativeThreadId ? m_pNativeThreadId->toString() : "";} 
     119        /// @} 
     120 
     121        /// @name 'Structors 
     122        /// @{ 
     123    public: 
     124         ThreadId(I_NativeThreadId* const _pId = NULL) : m_pNativeThreadId(_pId)                                {} 
     125         ThreadId(const ThreadId& _otherId)            : m_pNativeThreadId(_otherId.m_pNativeThreadId->clone()) {} 
     126        ~ThreadId()                                                                                             {delete m_pNativeThreadId;} 
     127        /// @} 
     128 
     129        /// @name Member variables 
     130        /// @{ 
     131    public: 
     132        I_NativeThreadId* m_pNativeThreadId; 
     133        /// @} 
     134 
     135    };  // struct ThreadId 
    64136    /// @} 
    65137 
  • Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_posix.cpp

    r1094 r3327  
    2929 
    3030#include "../I_Runnable.hpp" 
     31#include "../SpinLock.hpp" 
     32#include "../CriticalSection.hpp" 
     33 
     34#include <stdexcept> 
     35#include <sstream> 
     36#include <map> 
     37 
     38#include <unistd.h> 
     39#include <sys/errno.h> 
    3140 
    3241//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     
    3847:   m_pRunnable(_pRunnable) 
    3948,   m_nativeThread() 
     49,   m_threadId() 
    4050,   m_isStarted(false) 
    4151,   m_isJoined(false) 
     
    7080                throw std::runtime_error(ErrMsg.str()); 
    7181            } 
    72             //m_ThreadId.m_pNativeThreadId = new NativeThreadId_posix(m_nativeThread); 
     82            m_threadId.m_pNativeThreadId = new NativeThreadId_posix(m_nativeThread); 
    7383            m_isStarted = true; 
    7484        } 
     
    108118 
    109119//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     120I_Thread::ThreadId 
     121Thread_posix::getCurrentThreadId() const 
     122{ 
     123    return ThreadId(new NativeThreadId_posix(::pthread_self())); 
     124} 
     125 
     126//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     127const I_Thread::ThreadId& 
     128Thread_posix::getThreadId() const 
     129{ 
     130    return m_threadId; 
     131} 
     132 
     133//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    110134//DWORD WINAPI 
    111135void* 
     
    126150 
    127151//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     152bool 
     153Thread_posix::NativeThreadId_posix::operator==(const I_Thread::ThreadId::I_NativeThreadId& _id) const 
     154{ 
     155    const NativeThreadId_posix* const pNativeThreadId_posix = static_cast<const NativeThreadId_posix*>(&_id); 
     156    return (pNativeThreadId_posix != NULL) && (::pthread_equal(m_nativeThreadId, pNativeThreadId_posix->m_nativeThreadId) != 0); 
     157} 
     158 
     159//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     160bool 
     161Thread_posix::NativeThreadId_posix::operator!=(const I_Thread::ThreadId::I_NativeThreadId& _id) const 
     162{ 
     163    const NativeThreadId_posix* const pNativeThreadId_posix = static_cast<const NativeThreadId_posix*>(&_id); 
     164    return (pNativeThreadId_posix == NULL) || (::pthread_equal(m_nativeThreadId, pNativeThreadId_posix->m_nativeThreadId) == 0); 
     165} 
     166 
     167//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     168I_Thread::ThreadId::I_NativeThreadId* 
     169Thread_posix::NativeThreadId_posix::clone() const 
     170{ 
     171    return new NativeThreadId_posix(m_nativeThreadId); 
     172} 
     173 
     174//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     175std::string 
     176Thread_posix::NativeThreadId_posix::toString() const 
     177{ 
     178    std::ostringstream oStream; 
     179    oStream << std::hex << std::uppercase << "0x" << m_nativeThreadId; 
     180    return oStream.str(); 
     181} 
     182 
     183//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    128184}   // namespace Threading 
    129185}   // namespace Zen 
  • Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_posix.hpp

    r1094 r3327  
    5858        virtual void stop(); 
    5959        virtual void join(); 
     60    virtual ThreadId getCurrentThreadId() const; 
     61    virtual const ThreadId& getThreadId() const; 
     62    /// @} 
     63 
     64    /// @name Inner classes 
     65    /// @{ 
     66public: 
     67    class NativeThreadId_posix 
     68    :   public I_Thread::ThreadId::I_NativeThreadId 
     69    { 
     70        /// @name Friend declarations 
     71        /// @{ 
     72    private: 
     73        friend class Thread_posix; 
     74        /// @} 
     75 
     76        /// @name NativeThreadId_posix implementation 
     77        /// @{ 
     78    public: 
     79        virtual bool operator==(const I_NativeThreadId&) const; 
     80        virtual bool operator!=(const I_NativeThreadId&) const; 
     81        virtual I_NativeThreadId* clone() const; 
     82        virtual std::string toString() const; 
     83        /// @} 
     84 
     85        /// @name 'Structors 
     86        /// @{ 
     87    public: 
     88                 NativeThreadId_posix(::pthread_t const _id) : m_nativeThreadId(_id) {} 
     89        virtual ~NativeThreadId_posix() {} 
     90        /// @} 
     91 
     92        /// @name Member variables 
     93        /// @{ 
     94    private: 
     95        const ::pthread_t m_nativeThreadId; 
     96        /// @} 
     97 
     98    };  // class NativeThreadId_posix 
    6099    /// @} 
    61100 
     
    78117    I_Runnable*         m_pRunnable; 
    79118    ::pthread_t         m_nativeThread; 
     119    ThreadId            m_threadId; 
    80120    volatile bool       m_isStarted; 
    81121    volatile bool       m_isJoined; 
  • Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_solaris.cpp

    r6 r3327  
    2828#include "Thread_solaris.hpp" 
    2929 
    30 #include "../I_Runnable.hpp" 
     30#include "../I_Runnable.hpp 
     31#include "../SpinLock.hpp" 
     32#include "../CriticalSection.hpp" 
     33#include <stdexcept> 
     34#include <sstream> 
     35#include <map> 
     36#include <unistd.h> 
    3137 
    3238//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     
    3844:       m_pRunnable(_pRunnable) 
    3945,   m_nativeThread() 
     46,   m_threadId() 
    4047,   m_isStarted(false) 
    4148,   m_isJoined(false) 
     
    105112 
    106113//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     114I_Thread::ThreadId 
     115Thread_solaris::getCurrentThreadId() const 
     116{ 
     117    return ThreadId(new NativeThreadId_solaris(::thr_self())); 
     118} 
     119 
     120//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     121const I_Thread::ThreadId& 
     122Thread_solaris::getThreadId() const 
     123{ 
     124    return m_threadId; 
     125} 
     126 
     127//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    107128DWORD WINAPI 
    108129Thread_solaris::threadFunction (::LPVOID _pThis) 
     
    120141 
    121142//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     143bool 
     144Thread_solaris::NativeThreadId_solaris::operator==(const I_Thread::ThreadId::I_NativeThreadId& _id) const 
     145{ 
     146    const NativeThreadId_solaris* const pNativeThreadId_solaris = static_cast<const NativeThreadId_solaris*>(&_id); 
     147    return (pNativeThreadId_solaris != NULL) && (m_nativeThreadId == pNativeThreadId_solaris->m_nativeThreadId); 
     148} 
     149 
     150//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     151bool 
     152Thread_solaris::NativeThreadId_solaris::operator!=(const I_Thread::ThreadId::I_NativeThreadId& _id) const 
     153{ 
     154    const NativeThreadId_solaris* const pNativeThreadId_solaris = static_cast<const NativeThreadId_solaris*>(&_id); 
     155    return (pNativeThreadId_solaris == NULL) || (m_nativeThreadId != pNativeThreadId_solaris->m_nativeThreadId); 
     156} 
     157 
     158//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     159I_Thread::ThreadId::I_NativeThreadId* 
     160Thread_solaris::NativeThreadId_solaris::clone() const 
     161{ 
     162    return new NativeThreadId_solaris(m_nativeThreadId); 
     163} 
     164 
     165//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     166std::string 
     167Thread_solaris::NativeThreadId_solaris::toString() const 
     168{ 
     169    std::ostringstream oStream; 
     170    oStream << std::hex << std::uppercase << "0x" << m_nativeThreadId; 
     171    return oStream.str(); 
     172} 
     173 
     174//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    122175}   // namespace Threading 
    123176}   // namespace Zen 
  • Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_solaris.hpp

    r1074 r3327  
    5555        virtual void stop(); 
    5656        virtual void join(); 
     57    virtual ThreadId getCurrentThreadId() const; 
     58    virtual const ThreadId& getThreadId() const; 
     59    /// @} 
     60 
     61    /// @name Inner Classes 
     62    /// @{ 
     63public: 
     64    class NativeThreadId_solaris 
     65    :   public I_Thread::ThreadId::I_NativeThreadId 
     66    { 
     67        /// @name Friend declarations 
     68        /// @{ 
     69    private: 
     70        friend class Thread_solaris; 
     71        /// @} 
     72 
     73        /// @name NativeThreadId_solaris implementation 
     74        /// @{ 
     75    public: 
     76        virtual bool operator==(const I_NativeThreadId& _otherId) const; 
     77        virtual bool operator!=(const I_NativeThreadId& _otherId) const; 
     78        virtual I_NativeThreadId* clone() const; 
     79        virtual std::string toString() const; 
     80        /// @} 
     81 
     82        /// @name 'Structors 
     83        /// @{ 
     84    public: 
     85                 NativeThreadId_solaris(::thread_t const _id) : m_nativeThreadId(_id) {} 
     86        virtual ~NativeThreadId_solaris() {} 
     87        /// @} 
     88 
     89        /// @name Member variables 
     90        /// @{ 
     91    private: 
     92        const ::thread_t    m_nativeThreadId; 
     93        /// @} 
     94 
     95    };  // class NativeThreadId_solaris 
    5796    /// @} 
    5897 
     
    75114    I_Runnable*         m_pRunnable; 
    76115    ::thread_t          m_nativeThread; 
     116    ThreadId            m_threadId; 
    77117    volatile bool       m_isStarted; 
    78118    volatile bool       m_isJoined; 
  • Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_win32.cpp

    r814 r3327  
    2929 
    3030#include "../I_Runnable.hpp" 
    31  
    32 //Define this in your main_env_vars.vsprops file if you need to use CPP threading for some reason 
    33 //If you're not sure, keep it this way. 
    34 //#define USE_CPP_THREADING 
     31#include "../SpinLock.hpp" 
     32#include "../CriticalSection.hpp" 
     33 
     34#include <stdexcept> 
     35#include <sstream> 
     36#include <map> 
     37 
     38#ifdef DEBUG 
     39#include <iostream> 
     40#endif // DEBUG 
    3541 
    3642//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     
    4147Thread_win32::Thread_win32(I_Runnable *const _pRunnable) 
    4248:       m_pRunnable(_pRunnable) 
     49,   m_threadHandle() 
     50,   m_threadId() 
    4351,       m_isStarted(false) 
    4452,       m_isJoined(false) 
     
    5361                stop(); 
    5462 
    55                 if (::GetCurrentThreadId() != m_threadId) 
    56                 { 
     63        //if (::GetCurrentThreadId() != getThreadId()) 
     64                //{ 
    5765                        join(); 
    58                 } 
     66                //} 
    5967 
    6068#ifdef USE_CPP_THREADING 
     
    8290        if (!m_isStarted) 
    8391        { 
     92        NativeThreadId_win32* const pNativeThreadId_win32 = new NativeThreadId_win32(); 
     93        m_threadId.m_pNativeThreadId = pNativeThreadId_win32; 
    8494#ifdef USE_CPP_THREADING 
    8595                m_threadHandle = ::CreateThread(NULL, 0, threadFunction, 
     
    125135 
    126136//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     137I_Thread::ThreadId 
     138Thread_win32::getCurrentThreadId() const 
     139{ 
     140    return ThreadId(new NativeThreadId_win32(::GetCurrentThreadId())); 
     141} 
     142 
     143//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     144const I_Thread::ThreadId& 
     145Thread_win32::getThreadId() const 
     146{ 
     147    return m_threadId; 
     148} 
     149 
     150//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    127151DWORD WINAPI 
    128152Thread_win32::threadFunction (::LPVOID _pThis) 
    129153{ 
    130154    Thread_win32* const pThis = static_cast <Thread_win32*> (_pThis); 
    131 #ifndef USE_CPP_THREADING 
    132     pThis->m_threadId = ::GetCurrentThreadId(); 
    133 #endif 
    134155        try 
    135156        { 
     
    146167 
    147168//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     169bool 
     170Thread_win32::NativeThreadId_win32::operator==(const I_Thread::ThreadId::I_NativeThreadId& _id) const 
     171{ 
     172    const NativeThreadId_win32* const pNativeThreadId_win32 = dynamic_cast<const NativeThreadId_win32*>(&_id); 
     173    return (pNativeThreadId_win32 != NULL) && (m_nativeThreadId == pNativeThreadId_win32->m_nativeThreadId); 
     174} 
     175 
     176//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     177bool 
     178Thread_win32::NativeThreadId_win32::operator!=(const I_Thread::ThreadId::I_NativeThreadId& _id) const 
     179{ 
     180    const NativeThreadId_win32* const pNativeThreadId_win32 = dynamic_cast<const NativeThreadId_win32*>(&_id); 
     181    return (pNativeThreadId_win32 == NULL) && (m_nativeThreadId == pNativeThreadId_win32->m_nativeThreadId); 
     182} 
     183 
     184//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     185I_Thread::ThreadId::I_NativeThreadId* 
     186Thread_win32::NativeThreadId_win32::clone() const 
     187{ 
     188    return new Thread_win32::NativeThreadId_win32(m_nativeThreadId); 
     189} 
     190 
     191//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     192std::string 
     193Thread_win32::NativeThreadId_win32::toString() const 
     194{ 
     195    std::ostringstream oStream; 
     196    oStream << std::hex << std::uppercase << "0x" << m_nativeThreadId; 
     197    return oStream.str(); 
     198} 
     199 
     200//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    148201}   // namespace Threading 
    149202}   // namespace Zen 
  • Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_win32.hpp

    r1074 r3327  
    5959        virtual void stop(); 
    6060        virtual void join(); 
     61    virtual ThreadId getCurrentThreadId() const; 
     62    virtual const ThreadId& getThreadId() const; 
     63    /// @} 
     64 
     65    /// @name Inner classes 
     66    /// @{ 
     67public: 
     68    class NativeThreadId_win32 
     69    :   public I_Thread::ThreadId::I_NativeThreadId 
     70    { 
     71        /// @name Friend declarations 
     72        /// @{ 
     73    private: 
     74        friend class Thread_win32; 
     75        /// @} 
     76 
     77        /// @name NativeThreadId_win32 implementation 
     78        /// @{ 
     79    public: 
     80        virtual bool operator==(const I_NativeThreadId& _otherId) const; 
     81        virtual bool operator!=(const I_NativeThreadId& _otherId) const; 
     82        virtual I_NativeThreadId* clone() const; 
     83        virtual std::string toString() const; 
     84        /// @} 
     85 
     86        /// @name 'Structors 
     87        /// @{ 
     88    public: 
     89                 NativeThreadId_win32() : m_nativeThreadId() {} 
     90                 NativeThreadId_win32(::DWORD const _id) : m_nativeThreadId(_id) {} 
     91        virtual ~NativeThreadId_win32() {} 
     92        /// @} 
     93 
     94        /// @name Member variables 
     95        /// @{ 
     96    private: 
     97        ::DWORD m_nativeThreadId; 
     98        /// @} 
     99 
     100    };  // class NativeThreadId_win32 
    61101    /// @} 
    62102 
     
    80120    I_Runnable*         m_pRunnable; 
    81121    ::HANDLE            m_threadHandle; 
     122    ThreadId        m_threadId; 
    82123    volatile bool   m_isStarted; 
    83124    volatile bool   m_isJoined; 
    84         DWORD                   m_threadId; 
    85125        /// @} 
    86126