diff options
author | Michi Henning <michi@zeroc.com> | 2002-12-02 04:56:39 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2002-12-02 04:56:39 +0000 |
commit | c3b16c1d6638143ec4334775846b2d2c7b4f3d96 (patch) | |
tree | 641015f47f4647cd6657e322a1acaf7749b61605 /cpp | |
parent | file IncomingAsyncF.h was initially added on branch amd. (diff) | |
download | ice-c3b16c1d6638143ec4334775846b2d2c7b4f3d96.tar.bz2 ice-c3b16c1d6638143ec4334775846b2d2c7b4f3d96.tar.xz ice-c3b16c1d6638143ec4334775846b2d2c7b4f3d96.zip |
Added ThreadStartedException and appropriate test in Thread::start() to
catch re-use of a Thread object.
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/IceUtil/Thread.h | 3 | ||||
-rw-r--r-- | cpp/include/IceUtil/ThreadException.h | 10 | ||||
-rw-r--r-- | cpp/src/IceUtil/Thread.cpp | 22 | ||||
-rw-r--r-- | cpp/src/IceUtil/ThreadException.cpp | 23 | ||||
-rw-r--r-- | cpp/test/IceUtil/thread/.depend | 4 | ||||
-rw-r--r-- | cpp/test/IceUtil/thread/Makefile | 1 | ||||
-rw-r--r-- | cpp/test/IceUtil/thread/TestSuite.cpp | 2 |
7 files changed, 60 insertions, 5 deletions
diff --git a/cpp/include/IceUtil/Thread.h b/cpp/include/IceUtil/Thread.h index 1e5634d2c18..05278771089 100644 --- a/cpp/include/IceUtil/Thread.h +++ b/cpp/include/IceUtil/Thread.h @@ -90,9 +90,9 @@ public: private: #ifdef _WIN32 + bool _detached; HandleWrapperPtr _handle; unsigned _id; - bool _detached; #else pthread_t _id; #endif @@ -124,6 +124,7 @@ public: private: + bool _started; #ifdef _WIN32 unsigned _id; HandleWrapperPtr _handle; diff --git a/cpp/include/IceUtil/ThreadException.h b/cpp/include/IceUtil/ThreadException.h index 418f8397974..8417b5516d8 100644 --- a/cpp/include/IceUtil/ThreadException.h +++ b/cpp/include/IceUtil/ThreadException.h @@ -44,6 +44,16 @@ public: virtual Exception* ice_clone() const; virtual void ice_throw() const; }; + +class ICE_UTIL_API ThreadStartedException : public Exception +{ +public: + + ThreadStartedException(const char*, int); + virtual std::string ice_name() const; + virtual Exception* ice_clone() const; + virtual void ice_throw() const; +}; } diff --git a/cpp/src/IceUtil/Thread.cpp b/cpp/src/IceUtil/Thread.cpp index 29853280530..067bd721d76 100644 --- a/cpp/src/IceUtil/Thread.cpp +++ b/cpp/src/IceUtil/Thread.cpp @@ -22,6 +22,7 @@ using namespace std; IceUtil::ThreadControl::ThreadControl() : _handle(new HandleWrapper(0)), + _detached(false), _id(GetCurrentThreadId()) { HANDLE proc = GetCurrentProcess(); @@ -35,8 +36,8 @@ IceUtil::ThreadControl::ThreadControl() : IceUtil::ThreadControl::ThreadControl(const HandleWrapperPtr& handle, unsigned id) : _handle(handle), - _id(id), - _detached(false) + _detached(false), + _id(id) { } @@ -109,6 +110,7 @@ IceUtil::ThreadControl::yield() } IceUtil::Thread::Thread() : + _started(false), _id(0), _handle(new HandleWrapper(0)) { @@ -156,6 +158,12 @@ startHook(void* arg) IceUtil::ThreadControl IceUtil::Thread::start() { + if(_started) + { + throw ThreadStartedException(__FILE__, __LINE__); + } + _started = true; + // // It's necessary to increment the reference count since // pthread_create won't necessarily call the thread function until @@ -275,7 +283,9 @@ IceUtil::ThreadControl::yield() sched_yield(); } -IceUtil::Thread::Thread() +IceUtil::Thread::Thread() : + _started(false), + _id(0) { } @@ -321,6 +331,12 @@ startHook(void* arg) IceUtil::ThreadControl IceUtil::Thread::start() { + if(_started) + { + throw ThreadStartedException(__FILE__, __LINE__); + } + _started = true; + // // It's necessary to increment the reference count since // pthread_create won't necessarily call the thread function until diff --git a/cpp/src/IceUtil/ThreadException.cpp b/cpp/src/IceUtil/ThreadException.cpp index 709a048df30..6860de992aa 100644 --- a/cpp/src/IceUtil/ThreadException.cpp +++ b/cpp/src/IceUtil/ThreadException.cpp @@ -102,3 +102,26 @@ IceUtil::ThreadLockedException::ice_throw() const { throw *this; } + +IceUtil::ThreadStartedException::ThreadStartedException(const char* file, int line) : + Exception(file, line) +{ +} + +string +IceUtil::ThreadStartedException::ice_name() const +{ + return "IceUtil::ThreadStartedException"; +} + +IceUtil::Exception* +IceUtil::ThreadStartedException::ice_clone() const +{ + return new ThreadStartedException(*this); +} + +void +IceUtil::ThreadStartedException::ice_throw() const +{ + throw *this; +} diff --git a/cpp/test/IceUtil/thread/.depend b/cpp/test/IceUtil/thread/.depend index 9c4f2f4c546..6ed277e4027 100644 --- a/cpp/test/IceUtil/thread/.depend +++ b/cpp/test/IceUtil/thread/.depend @@ -1,9 +1,11 @@ TestBase.o: TestBase.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h TestBase.h CreateTest.o: CreateTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h CreateTest.h TestBase.h ../../include/TestCommon.h +DetachTest.o: DetachTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h DetachTest.h TestBase.h ../../include/TestCommon.h +StartTest.o: StartTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h StartTest.h TestBase.h ../../include/TestCommon.h RWRecMutexTest.o: RWRecMutexTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h RWRecMutexTest.h TestBase.h ../../include/TestCommon.h RecMutexTest.o: RecMutexTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h RecMutexTest.h TestBase.h ../../include/TestCommon.h MutexTest.o: MutexTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h MutexTest.h TestBase.h ../../include/TestCommon.h MonitorMutexTest.o: MonitorMutexTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h MonitorMutexTest.h TestBase.h ../../include/TestCommon.h MonitorRecMutexTest.o: MonitorRecMutexTest.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h MonitorRecMutexTest.h TestBase.h ../../include/TestCommon.h -TestSuite.o: TestSuite.cpp TestSuite.h TestBase.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h MutexTest.h RecMutexTest.h RWRecMutexTest.h CreateTest.h MonitorMutexTest.h MonitorRecMutexTest.h +TestSuite.o: TestSuite.cpp TestSuite.h TestBase.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h MutexTest.h RecMutexTest.h RWRecMutexTest.h CreateTest.h DetachTest.h StartTest.h MonitorMutexTest.h MonitorRecMutexTest.h Client.o: Client.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/OutputUtil.h ../../include/TestCommon.h TestSuite.h TestBase.h diff --git a/cpp/test/IceUtil/thread/Makefile b/cpp/test/IceUtil/thread/Makefile index ad5fa17752b..31bb9f22e36 100644 --- a/cpp/test/IceUtil/thread/Makefile +++ b/cpp/test/IceUtil/thread/Makefile @@ -21,6 +21,7 @@ TARGETS = $(CLIENT) OBJS = TestBase.o \ CreateTest.o \ DetachTest.o \ + StartTest.o \ RWRecMutexTest.o \ RecMutexTest.o \ MutexTest.o \ diff --git a/cpp/test/IceUtil/thread/TestSuite.cpp b/cpp/test/IceUtil/thread/TestSuite.cpp index 09d4e82fff6..cc8a5ce71b7 100644 --- a/cpp/test/IceUtil/thread/TestSuite.cpp +++ b/cpp/test/IceUtil/thread/TestSuite.cpp @@ -18,6 +18,7 @@ #include <RWRecMutexTest.h> #include <CreateTest.h> #include <DetachTest.h> +#include <StartTest.h> #include <MonitorMutexTest.h> #include <MonitorRecMutexTest.h> @@ -28,6 +29,7 @@ initializeTestSuite() { allTests.push_back(new CreateTest); allTests.push_back(new DetachTest); + allTests.push_back(new StartTest); allTests.push_back(new MutexTest); allTests.push_back(new RecMutexTest); allTests.push_back(new RWRecMutexTest); |