diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2006-06-01 15:31:11 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2006-06-01 15:31:11 +0000 |
commit | dba48e6aa9feac17c9ee2c02adb90a01c9ebae8e (patch) | |
tree | 1f890a3a36238d21c10bb7adba0dc979c2905689 | |
parent | Added a bunch of missing dependencies on Glacier2 to a few IceGrid (diff) | |
download | ice-dba48e6aa9feac17c9ee2c02adb90a01c9ebae8e.tar.bz2 ice-dba48e6aa9feac17c9ee2c02adb90a01c9ebae8e.tar.xz ice-dba48e6aa9feac17c9ee2c02adb90a01c9ebae8e.zip |
Added thread start/stop hooks
-rw-r--r-- | cpp/include/Ice/Initialize.h | 18 | ||||
-rw-r--r-- | cpp/src/Ice/ConnectionI.cpp | 10 | ||||
-rw-r--r-- | cpp/src/Ice/ThreadPool.cpp | 10 | ||||
-rwxr-xr-x | cs/src/Ice/ConnectionI.cs | 12 | ||||
-rwxr-xr-x | cs/src/Ice/ThreadPool.cs | 10 | ||||
-rwxr-xr-x | cs/src/Ice/Util.cs | 6 | ||||
-rw-r--r-- | java/src/Ice/ConnectionI.java | 12 | ||||
-rw-r--r-- | java/src/Ice/InitializationData.java | 1 | ||||
-rw-r--r-- | java/src/Ice/ThreadNotification.java | 16 | ||||
-rw-r--r-- | java/src/IceInternal/ThreadPool.java | 10 |
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(); + } } } |