Changeset 3327
- Timestamp:
- 01/29/10 13:00:29 (7 weeks ago)
- Location:
- Core/branches/0075_TR_SCRIPTING/Threading
- Files:
-
- 7 modified
-
I_Thread.hpp (modified) (4 diffs)
-
src/Thread_posix.cpp (modified) (5 diffs)
-
src/Thread_posix.hpp (modified) (2 diffs)
-
src/Thread_solaris.cpp (modified) (4 diffs)
-
src/Thread_solaris.hpp (modified) (2 diffs)
-
src/Thread_win32.cpp (modified) (6 diffs)
-
src/Thread_win32.hpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Core/branches/0075_TR_SCRIPTING/Threading/I_Thread.hpp
r298 r3327 31 31 #include <boost/noncopyable.hpp> 32 32 33 #include <string> 34 33 35 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 34 36 namespace Zen { … … 42 44 /// @{ 43 45 public: 46 struct ThreadId; 44 47 /// @} 45 48 … … 56 59 /// Block until this I_Thread has terminated. 57 60 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; 58 69 /// @} 59 70 … … 62 73 public: 63 74 static void sleepForMilliseconds(unsigned const _milliseconds); // current thread will sleep 75 /// @} 76 77 /// @name Inner Classes 78 /// @{ 79 public: 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 64 136 /// @} 65 137 -
Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_posix.cpp
r1094 r3327 29 29 30 30 #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> 31 40 32 41 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ … … 38 47 : m_pRunnable(_pRunnable) 39 48 , m_nativeThread() 49 , m_threadId() 40 50 , m_isStarted(false) 41 51 , m_isJoined(false) … … 70 80 throw std::runtime_error(ErrMsg.str()); 71 81 } 72 //m_ThreadId.m_pNativeThreadId = new NativeThreadId_posix(m_nativeThread);82 m_threadId.m_pNativeThreadId = new NativeThreadId_posix(m_nativeThread); 73 83 m_isStarted = true; 74 84 } … … 108 118 109 119 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 120 I_Thread::ThreadId 121 Thread_posix::getCurrentThreadId() const 122 { 123 return ThreadId(new NativeThreadId_posix(::pthread_self())); 124 } 125 126 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 127 const I_Thread::ThreadId& 128 Thread_posix::getThreadId() const 129 { 130 return m_threadId; 131 } 132 133 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 110 134 //DWORD WINAPI 111 135 void* … … 126 150 127 151 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 152 bool 153 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 160 bool 161 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 168 I_Thread::ThreadId::I_NativeThreadId* 169 Thread_posix::NativeThreadId_posix::clone() const 170 { 171 return new NativeThreadId_posix(m_nativeThreadId); 172 } 173 174 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 175 std::string 176 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 128 184 } // namespace Threading 129 185 } // namespace Zen -
Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_posix.hpp
r1094 r3327 58 58 virtual void stop(); 59 59 virtual void join(); 60 virtual ThreadId getCurrentThreadId() const; 61 virtual const ThreadId& getThreadId() const; 62 /// @} 63 64 /// @name Inner classes 65 /// @{ 66 public: 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 60 99 /// @} 61 100 … … 78 117 I_Runnable* m_pRunnable; 79 118 ::pthread_t m_nativeThread; 119 ThreadId m_threadId; 80 120 volatile bool m_isStarted; 81 121 volatile bool m_isJoined; -
Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_solaris.cpp
r6 r3327 28 28 #include "Thread_solaris.hpp" 29 29 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> 31 37 32 38 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ … … 38 44 : m_pRunnable(_pRunnable) 39 45 , m_nativeThread() 46 , m_threadId() 40 47 , m_isStarted(false) 41 48 , m_isJoined(false) … … 105 112 106 113 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 114 I_Thread::ThreadId 115 Thread_solaris::getCurrentThreadId() const 116 { 117 return ThreadId(new NativeThreadId_solaris(::thr_self())); 118 } 119 120 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 121 const I_Thread::ThreadId& 122 Thread_solaris::getThreadId() const 123 { 124 return m_threadId; 125 } 126 127 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 107 128 DWORD WINAPI 108 129 Thread_solaris::threadFunction (::LPVOID _pThis) … … 120 141 121 142 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 143 bool 144 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 151 bool 152 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 159 I_Thread::ThreadId::I_NativeThreadId* 160 Thread_solaris::NativeThreadId_solaris::clone() const 161 { 162 return new NativeThreadId_solaris(m_nativeThreadId); 163 } 164 165 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 166 std::string 167 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 122 175 } // namespace Threading 123 176 } // namespace Zen -
Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_solaris.hpp
r1074 r3327 55 55 virtual void stop(); 56 56 virtual void join(); 57 virtual ThreadId getCurrentThreadId() const; 58 virtual const ThreadId& getThreadId() const; 59 /// @} 60 61 /// @name Inner Classes 62 /// @{ 63 public: 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 57 96 /// @} 58 97 … … 75 114 I_Runnable* m_pRunnable; 76 115 ::thread_t m_nativeThread; 116 ThreadId m_threadId; 77 117 volatile bool m_isStarted; 78 118 volatile bool m_isJoined; -
Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_win32.cpp
r814 r3327 29 29 30 30 #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 35 41 36 42 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ … … 41 47 Thread_win32::Thread_win32(I_Runnable *const _pRunnable) 42 48 : m_pRunnable(_pRunnable) 49 , m_threadHandle() 50 , m_threadId() 43 51 , m_isStarted(false) 44 52 , m_isJoined(false) … … 53 61 stop(); 54 62 55 if (::GetCurrentThreadId() != m_threadId)56 {63 //if (::GetCurrentThreadId() != getThreadId()) 64 //{ 57 65 join(); 58 }66 //} 59 67 60 68 #ifdef USE_CPP_THREADING … … 82 90 if (!m_isStarted) 83 91 { 92 NativeThreadId_win32* const pNativeThreadId_win32 = new NativeThreadId_win32(); 93 m_threadId.m_pNativeThreadId = pNativeThreadId_win32; 84 94 #ifdef USE_CPP_THREADING 85 95 m_threadHandle = ::CreateThread(NULL, 0, threadFunction, … … 125 135 126 136 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 137 I_Thread::ThreadId 138 Thread_win32::getCurrentThreadId() const 139 { 140 return ThreadId(new NativeThreadId_win32(::GetCurrentThreadId())); 141 } 142 143 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 144 const I_Thread::ThreadId& 145 Thread_win32::getThreadId() const 146 { 147 return m_threadId; 148 } 149 150 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 127 151 DWORD WINAPI 128 152 Thread_win32::threadFunction (::LPVOID _pThis) 129 153 { 130 154 Thread_win32* const pThis = static_cast <Thread_win32*> (_pThis); 131 #ifndef USE_CPP_THREADING132 pThis->m_threadId = ::GetCurrentThreadId();133 #endif134 155 try 135 156 { … … 146 167 147 168 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 169 bool 170 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 177 bool 178 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 185 I_Thread::ThreadId::I_NativeThreadId* 186 Thread_win32::NativeThreadId_win32::clone() const 187 { 188 return new Thread_win32::NativeThreadId_win32(m_nativeThreadId); 189 } 190 191 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 192 std::string 193 Thread_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 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 148 201 } // namespace Threading 149 202 } // namespace Zen -
Core/branches/0075_TR_SCRIPTING/Threading/src/Thread_win32.hpp
r1074 r3327 59 59 virtual void stop(); 60 60 virtual void join(); 61 virtual ThreadId getCurrentThreadId() const; 62 virtual const ThreadId& getThreadId() const; 63 /// @} 64 65 /// @name Inner classes 66 /// @{ 67 public: 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 61 101 /// @} 62 102 … … 80 120 I_Runnable* m_pRunnable; 81 121 ::HANDLE m_threadHandle; 122 ThreadId m_threadId; 82 123 volatile bool m_isStarted; 83 124 volatile bool m_isJoined; 84 DWORD m_threadId;85 125 /// @} 86 126
