summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/include/Ice/Initialize.h18
-rw-r--r--cpp/src/Ice/ConnectionI.cpp10
-rw-r--r--cpp/src/Ice/ThreadPool.cpp10
-rwxr-xr-xcs/src/Ice/ConnectionI.cs12
-rwxr-xr-xcs/src/Ice/ThreadPool.cs10
-rwxr-xr-xcs/src/Ice/Util.cs6
-rw-r--r--java/src/Ice/ConnectionI.java12
-rw-r--r--java/src/Ice/InitializationData.java1
-rw-r--r--java/src/Ice/ThreadNotification.java16
-rw-r--r--java/src/IceInternal/ThreadPool.java10
10 files changed, 105 insertions, 0 deletions
diff --git a/cpp/include/Ice/Initialize.h b/cpp/include/Ice/Initialize.h
index 824d3f5f985..3d7e166072c 100644
--- a/cpp/include/Ice/Initialize.h
+++ b/cpp/include/Ice/Initialize.h
@@ -37,6 +37,23 @@ ICE_API PropertiesPtr createProperties();
ICE_API PropertiesPtr createProperties(StringSeq&);
ICE_API PropertiesPtr createProperties(int&, char*[]);
+//
+// This class is used to notify user of when Ice threads
+// are started and stopped.
+//
+class ThreadNotification : public IceUtil::Shared
+{
+public:
+
+ virtual void start() = 0;
+ virtual void stop() = 0;
+};
+
+typedef IceUtil::Handle<ThreadNotification> ThreadNotificationPtr;
+
+//
+// Communicator initialization info
+//
struct InitializationData
{
PropertiesPtr properties;
@@ -45,6 +62,7 @@ struct InitializationData
Context defaultContext;
StringConverterPtr stringConverter;
WstringConverterPtr wstringConverter;
+ ThreadNotificationPtr threadHook;
};
ICE_API CommunicatorPtr initialize(int&, char*[], InitializationData = InitializationData(),
diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp
index b23e628466d..2a5ca75f12e 100644
--- a/cpp/src/Ice/ConnectionI.cpp
+++ b/cpp/src/Ice/ConnectionI.cpp
@@ -2572,6 +2572,11 @@ Ice::ConnectionI::ThreadPerConnection::ThreadPerConnection(const ConnectionIPtr&
void
Ice::ConnectionI::ThreadPerConnection::run()
{
+ if(_connection->_instance->initializationData().threadHook)
+ {
+ _connection->_instance->initializationData().threadHook->start();
+ }
+
try
{
_connection->run();
@@ -2592,5 +2597,10 @@ Ice::ConnectionI::ThreadPerConnection::run()
out << "unknown exception in thread per connection:\n" << _connection->toString();
}
+ if(_connection->_instance->initializationData().threadHook)
+ {
+ _connection->_instance->initializationData().threadHook->stop();
+ }
+
_connection = 0; // Resolve cyclic dependency.
}
diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp
index 4d291161fbd..0bb280f8037 100644
--- a/cpp/src/Ice/ThreadPool.cpp
+++ b/cpp/src/Ice/ThreadPool.cpp
@@ -851,6 +851,11 @@ IceInternal::ThreadPool::EventHandlerThread::EventHandlerThread(const ThreadPool
void
IceInternal::ThreadPool::EventHandlerThread::run()
{
+ if(_pool->_instance->initializationData().threadHook)
+ {
+ _pool->_instance->initializationData().threadHook->start();
+ }
+
bool promote;
try
@@ -890,5 +895,10 @@ IceInternal::ThreadPool::EventHandlerThread::run()
}
}
+ if(_pool->_instance->initializationData().threadHook)
+ {
+ _pool->_instance->initializationData().threadHook->stop();
+ }
+
_pool = 0; // Break cyclic dependency.
}
diff --git a/cs/src/Ice/ConnectionI.cs b/cs/src/Ice/ConnectionI.cs
index 5f79bfde95b..9acea50d10f 100755
--- a/cs/src/Ice/ConnectionI.cs
+++ b/cs/src/Ice/ConnectionI.cs
@@ -2261,6 +2261,11 @@ namespace Ice
public void ThreadPerConnection()
{
+ if(instance_.initializationData().threadHook != null)
+ {
+ instance_.initializationData().threadHook.start();
+ }
+
try
{
run();
@@ -2274,6 +2279,13 @@ namespace Ice
_logger.error("system exception in thread per connection:\n" + ToString() + "\n" +
ex.ToString());
}
+ finally
+ {
+ if(instance_.initializationData().threadHook != null)
+ {
+ instance_.initializationData().threadHook.stop();
+ }
+ }
}
private IceInternal.Incoming getIncoming(ObjectAdapter adapter, bool response, byte compress, int requestId)
diff --git a/cs/src/Ice/ThreadPool.cs b/cs/src/Ice/ThreadPool.cs
index f6b98f735a3..d7a50f33351 100755
--- a/cs/src/Ice/ThreadPool.cs
+++ b/cs/src/Ice/ThreadPool.cs
@@ -921,6 +921,11 @@ namespace IceInternal
public void Run()
{
+ if(thread_Pool.instance_.initializationData().threadHook != null)
+ {
+ thread_Pool.instance_.initializationData().threadHook.start();
+ }
+
BasicStream stream = new BasicStream(thread_Pool.instance_);
bool promote;
@@ -955,6 +960,11 @@ namespace IceInternal
System.Threading.Monitor.Pulse(thread_Pool);
}
}
+
+ if(thread_Pool.instance_.initializationData().threadHook != null)
+ {
+ thread_Pool.instance_.initializationData().threadHook.stop();
+ }
#if TRACE_THREAD
thread_Pool.trace("run() terminated");
diff --git a/cs/src/Ice/Util.cs b/cs/src/Ice/Util.cs
index 8cabb9fdd2f..adb22f352e6 100755
--- a/cs/src/Ice/Util.cs
+++ b/cs/src/Ice/Util.cs
@@ -18,6 +18,11 @@ namespace Ice
using System.Text;
using System.Globalization;
+ public interface ThreadNotification
+ {
+ void start();
+ void stop();
+ }
public class InitializationData
{
@@ -25,6 +30,7 @@ namespace Ice
public Logger logger;
public Stats stats;
public Context defaultContext;
+ public ThreadNotification threadHook;
}
public sealed class Util
diff --git a/java/src/Ice/ConnectionI.java b/java/src/Ice/ConnectionI.java
index 53521ad6404..538950f53a8 100644
--- a/java/src/Ice/ConnectionI.java
+++ b/java/src/Ice/ConnectionI.java
@@ -2431,6 +2431,11 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
public void
run()
{
+ if(ConnectionI.this._instance.initializationData().threadHook != null)
+ {
+ ConnectionI.this._instance.initializationData().threadHook.start();
+ }
+
try
{
ConnectionI.this.run();
@@ -2439,6 +2444,13 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne
{
ConnectionI.this.error("exception in thread per connection", ex);
}
+ finally
+ {
+ if(ConnectionI.this._instance.initializationData().threadHook != null)
+ {
+ ConnectionI.this._instance.initializationData().threadHook.stop();
+ }
+ }
}
}
private Thread _threadPerConnection;
diff --git a/java/src/Ice/InitializationData.java b/java/src/Ice/InitializationData.java
index 1e1bc3ba34b..a5ea98908e2 100644
--- a/java/src/Ice/InitializationData.java
+++ b/java/src/Ice/InitializationData.java
@@ -20,4 +20,5 @@ public final class InitializationData
public Logger logger;
public Stats stats;
public java.util.Map defaultContext;
+ public ThreadNotification threadHook;
}
diff --git a/java/src/Ice/ThreadNotification.java b/java/src/Ice/ThreadNotification.java
new file mode 100644
index 00000000000..9d11a72a4fb
--- /dev/null
+++ b/java/src/Ice/ThreadNotification.java
@@ -0,0 +1,16 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package Ice;
+
+public interface ThreadNotification
+{
+ void start();
+ void stop();
+}
diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java
index 5538bc9af22..020c54ff3e6 100644
--- a/java/src/IceInternal/ThreadPool.java
+++ b/java/src/IceInternal/ThreadPool.java
@@ -1228,6 +1228,11 @@ public final class ThreadPool
public void
run()
{
+ if(_instance.initializationData().threadHook != null)
+ {
+ _instance.initializationData().threadHook.start();
+ }
+
BasicStream stream = new BasicStream(_instance);
boolean promote;
@@ -1275,6 +1280,11 @@ public final class ThreadPool
{
trace("run() terminated");
}
+
+ if(_instance.initializationData().threadHook != null)
+ {
+ _instance.initializationData().threadHook.stop();
+ }
}
}