summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/include/IceUtil/Thread.h3
-rw-r--r--cpp/include/IceUtil/ThreadException.h10
-rw-r--r--cpp/src/IceUtil/Thread.cpp22
-rw-r--r--cpp/src/IceUtil/ThreadException.cpp23
-rw-r--r--cpp/test/IceUtil/thread/.depend4
-rw-r--r--cpp/test/IceUtil/thread/Makefile1
-rw-r--r--cpp/test/IceUtil/thread/TestSuite.cpp2
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);