diff options
Diffstat (limited to 'cpp')
26 files changed, 1035 insertions, 1000 deletions
diff --git a/cpp/include/Ice/Incoming.h b/cpp/include/Ice/Incoming.h index 293ba12235c..b9833a58d53 100644 --- a/cpp/include/Ice/Incoming.h +++ b/cpp/include/Ice/Incoming.h @@ -29,9 +29,9 @@ class ICE_API Incoming : public ::IceUtil::noncopyable { public: - Incoming(const InstancePtr&, const ::Ice::ObjectAdapterPtr&, Connection*, bool); + Incoming(const InstancePtr&, const ::Ice::ObjectAdapterPtr&, ::IceInternal::Connection*, bool, bool); - bool invoke(); // Returns true, if the method invocation was asynchronous. + void invoke(); BasicStream* is(); BasicStream* os(); @@ -55,16 +55,12 @@ private: Ice::LocalObjectPtr _cookie; // - // If null, no response is expected. Other than determining - // whether a response is expected or not, _connection is only - // needed for IncomingAsync. For performance reasons, a plain - // pointer is used instead of a handle. + // Optimization. The connection may not be deleted while a + // stack-allocated Incoming still holds it. // Connection* _connection; - // - // Compression flag, only needed for IncomingAsync. - // + bool _response; bool _compress; BasicStream _is; diff --git a/cpp/include/Ice/IncomingAsync.h b/cpp/include/Ice/IncomingAsync.h index aed7ed4240a..57d59f73e2f 100644 --- a/cpp/include/Ice/IncomingAsync.h +++ b/cpp/include/Ice/IncomingAsync.h @@ -51,19 +51,21 @@ private: void finishInvoke(); + // + // We need a separate InstancePtr, because _is and _os only hold a + // const InstancePtr& for optimization. + // + InstancePtr _instance; + Ice::Current _current; Ice::ObjectPtr _servant; Ice::ServantLocatorPtr _locator; Ice::LocalObjectPtr _cookie; ConnectionPtr _connection; - bool _compress; - // - // We need a separate InstancePtr, because _is and _os only hold a - // const InstancePtr& for optimization. - // - InstancePtr _instance; + bool _response; + bool _compress; BasicStream _is; BasicStream _os; diff --git a/cpp/slice/Ice/ObjectAdapter.ice b/cpp/slice/Ice/ObjectAdapter.ice index 89d04fff398..2d4002a7856 100644 --- a/cpp/slice/Ice/ObjectAdapter.ice +++ b/cpp/slice/Ice/ObjectAdapter.ice @@ -64,14 +64,33 @@ local interface ObjectAdapter * Temporarily hold receiving and dispatching requests. The object * adapter can be reactivated with the [activate] operation. * + * <note><para> Holding is not immediate, i.e., after + * [hold] returns, the object adapter might still be active + * for some time. You can use [waitForHold] to wait until + * holding is complete. </para></note> + * * @see activate * @see deactivate + * @see waitForHold * **/ void hold(); /** * + * Wait until the object adapter holds requests. Calling [hold] + * initiates holding of requests, and [waitForHold] only returns + * when such holding of requests has been completed. + * + * @see hold + * @see waitForDeactivate + * @see Communicator::waitForShutdown + * + **/ + void waitForHold(); + + /** + * * Deactivate all Endpoints that belong to this object * adapter. After deactivation, the object adapter stops receiving * requests through its Endpoints. object adapter's that have been @@ -82,7 +101,7 @@ local interface ObjectAdapter * to [deactivate] on an already deactivated object adapter are * ignored. * - * <note><para> Deactivate is not immediate, i.e., after + * <note><para> Deactivation is not immediate, i.e., after * [deactivate] returns, the object adapter might still be active * for some time. You can use [waitForDeactivate] to wait until * deactivation is complete. </para></note> @@ -103,6 +122,7 @@ local interface ObjectAdapter * been completed. * * @see deactivate + * @see waitForHold * @see Communicator::waitForShutdown * **/ diff --git a/cpp/src/Ice/.depend b/cpp/src/Ice/.depend index 5fef55a0a9c..b9c0811e176 100644 --- a/cpp/src/Ice/.depend +++ b/cpp/src/Ice/.depend @@ -20,8 +20,8 @@ CommunicatorI.o: CommunicatorI.cpp ../Ice/CommunicatorI.h ../../include/IceUtil/ ObjectFactory.o: ObjectFactory.cpp ../../include/Ice/ObjectFactory.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Stream.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ObjectFactoryManager.o: ObjectFactoryManager.cpp ../Ice/ObjectFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/LocalException.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ObjectAdapter.o: ObjectAdapter.cpp ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/LocalException.h ../../include/Ice/ObjectFactory.h ../../include/Ice/Stream.h ../../include/Ice/BuiltinSequences.h -ObjectAdapterI.o: ObjectAdapterI.cpp ../../include/IceUtil/UUID.h ../../include/IceUtil/Config.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/ServantLocator.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/PropertiesF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../Ice/ProxyFactory.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/ConnectionFactory.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/RouterInfo.h ../../include/Ice/RoutingTableF.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/LoggerUtil.h ../../include/Ice/IdentityUtil.h -ObjectAdapterFactory.o: ObjectAdapterFactory.cpp ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h +ObjectAdapterI.o: ObjectAdapterI.cpp ../../include/IceUtil/UUID.h ../../include/IceUtil/Config.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/ServantLocator.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/PropertiesF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../Ice/ProxyFactory.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/ConnectionFactory.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/RouterInfo.h ../../include/Ice/RoutingTableF.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/LoggerUtil.h ../../include/Ice/IdentityUtil.h +ObjectAdapterFactory.o: ObjectAdapterFactory.cpp ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ServantLocator.o: ServantLocator.cpp ../../include/Ice/ServantLocator.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Stream.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h UserExceptionFactory.o: UserExceptionFactory.cpp ../../include/Ice/UserExceptionFactory.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h UserExceptionFactoryManager.o: UserExceptionFactoryManager.cpp ../Ice/UserExceptionFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/LocalException.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h @@ -40,19 +40,19 @@ Current.o: Current.cpp ../../include/Ice/Current.h ../../include/Ice/LocalObject Router.o: Router.cpp ../../include/Ice/Router.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/ObjectFactory.h ../../include/Ice/Stream.h ../../include/Ice/BuiltinSequences.h RouterInfo.o: RouterInfo.cpp ../Ice/RouterInfo.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/RouterInfoF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/RouterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/RoutingTableF.h ../../include/Ice/Router.h ../../include/Ice/RoutingTable.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h RoutingTable.o: RoutingTable.cpp ../../include/Ice/RoutingTable.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/RoutingTableF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Identity.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Facet.h -Connection.o: Connection.cpp ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ConnectionF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/EndpointF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/OutgoingAsyncF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Properties.h ../../include/Ice/Proxy.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../Ice/TraceUtil.h ../Ice/DefaultsAndOverrides.h ../Ice/Transceiver.h ../Ice/ThreadPool.h ../../include/IceUtil/Thread.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/Endpoint.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/LocalException.h ../Ice/Protocol.h -ConnectionFactory.o: ConnectionFactory.cpp ../Ice/ConnectionFactory.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/EndpointF.h ../Ice/AcceptorF.h ../Ice/TransceiverF.h ../../include/Ice/RouterF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../Ice/Connection.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../Ice/Transceiver.h ../Ice/Connector.h ../Ice/ConnectorF.h ../Ice/Acceptor.h ../Ice/ThreadPool.h ../../include/IceUtil/Thread.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocatorF.h ../Ice/Reference.h ../Ice/Endpoint.h ../Ice/RouterInfo.h ../../include/Ice/RoutingTableF.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h +Connection.o: Connection.cpp ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ConnectionF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/EndpointF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/OutgoingAsyncF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Properties.h ../../include/Ice/Proxy.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../Ice/TraceUtil.h ../Ice/DefaultsAndOverrides.h ../Ice/Transceiver.h ../Ice/ThreadPool.h ../../include/IceUtil/Thread.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/Endpoint.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/LocalException.h ../Ice/Protocol.h +ConnectionFactory.o: ConnectionFactory.cpp ../Ice/ConnectionFactory.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/EndpointF.h ../Ice/AcceptorF.h ../Ice/TransceiverF.h ../../include/Ice/RouterF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../Ice/Transceiver.h ../Ice/Connector.h ../Ice/ConnectorF.h ../Ice/Acceptor.h ../Ice/ThreadPool.h ../../include/IceUtil/Thread.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocatorF.h ../Ice/Reference.h ../Ice/Endpoint.h ../Ice/RouterInfo.h ../../include/Ice/RoutingTableF.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h LocalObject.o: LocalObject.cpp ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/StreamF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h Object.o: Object.cpp ../../include/Ice/Object.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/StreamF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Stream.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ProxyFactory.o: ProxyFactory.cpp ../Ice/ProxyFactory.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../../include/Ice/ReferenceF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../../include/Ice/RouterF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LocatorF.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h -Proxy.o: Proxy.cpp ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ProxyFactory.h ../../include/Ice/InstanceF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/OutgoingAsync.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../Ice/RouterInfoF.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/PropertiesF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/ConnectionFactory.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/Connection.h ../Ice/RouterInfo.h ../../include/Ice/RoutingTableF.h ../Ice/LocatorInfo.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h +Proxy.o: Proxy.cpp ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Config.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ProxyFactory.h ../../include/Ice/InstanceF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/OutgoingAsync.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../Ice/RouterInfoF.h ../Ice/Endpoint.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/PropertiesF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/ConnectionFactory.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/Connection.h ../Ice/RouterInfo.h ../../include/Ice/RoutingTableF.h ../Ice/LocatorInfo.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h Outgoing.o: Outgoing.cpp ../../include/Ice/Outgoing.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ConnectionF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ReferenceF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/EndpointF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/OutgoingAsyncF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../../include/Ice/LocalException.h -OutgoingAsync.o: OutgoingAsync.cpp ../../include/Ice/OutgoingAsync.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/ReferenceF.h ../../include/Ice/InstanceF.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/EndpointF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h -Incoming.o: Incoming.cpp ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/ServantLocator.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/PropertiesF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/IdentityUtil.h ../../include/Ice/LoggerUtil.h ../Ice/StringUtil.h ../Ice/Protocol.h -IncomingAsync.o: IncomingAsync.cpp ../../include/Ice/IncomingAsync.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/ServantLocator.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../Ice/TransceiverF.h ../Ice/ThreadPoolF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/LocalException.h ../Ice/Protocol.h -Direct.o: Direct.cpp ../../include/Ice/Direct.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/ServantLocator.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../Ice/RouterInfoF.h ../../include/Ice/LocalException.h +OutgoingAsync.o: OutgoingAsync.cpp ../../include/Ice/OutgoingAsync.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/ReferenceF.h ../../include/Ice/InstanceF.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/EndpointF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Outgoing.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h +Incoming.o: Incoming.cpp ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Direct.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ServantLocator.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/Ice/PropertiesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Properties.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/IdentityUtil.h ../../include/Ice/LoggerUtil.h ../Ice/StringUtil.h ../Ice/Protocol.h +IncomingAsync.o: IncomingAsync.cpp ../../include/Ice/IncomingAsync.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ConnectionF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../../include/Ice/ServantLocator.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/Incoming.h ../Ice/Connection.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/EndpointF.h ../Ice/ThreadPoolF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../../include/Ice/OutgoingAsyncF.h ../Ice/DefaultsAndOverridesF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/LocalException.h ../Ice/Protocol.h +Direct.o: Direct.cpp ../../include/Ice/Direct.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/ReferenceF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Incoming.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/LoggerF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/LocatorInfoF.h ../../include/Ice/ServantLocator.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../Ice/RouterInfoF.h ../../include/Ice/LocalException.h Network.o: Network.cpp ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/Network.h ../../include/Ice/Config.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/StreamF.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h -ThreadPool.o: ThreadPool.cpp ../Ice/ThreadPool.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../Ice/ThreadPoolF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/PropertiesF.h ../Ice/EventHandlerF.h ../Ice/EventHandler.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../Ice/Network.h ../../include/Ice/LocalException.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/CommunicatorF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Properties.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/Protocol.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h +ThreadPool.o: ThreadPool.cpp ../Ice/ThreadPool.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../Ice/ThreadPoolF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../../include/Ice/PropertiesF.h ../Ice/EventHandlerF.h ../Ice/EventHandler.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../Ice/Network.h ../../include/Ice/LocalException.h ../../include/Ice/Identity.h ../../include/Ice/Facet.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/CommunicatorF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Properties.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionF.h ../../include/Ice/EndpointF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/Protocol.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h EventHandler.o: EventHandler.cpp ../Ice/EventHandler.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/EventHandlerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/InstanceF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Buffer.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/StreamF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/Ice/CommunicatorF.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/ObjectFactoryManagerF.h ../Ice/UserExceptionFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h Connector.o: Connector.cpp ../Ice/Connector.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/ConnectorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../Ice/TransceiverF.h Acceptor.o: Acceptor.cpp ../Ice/Acceptor.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/AcceptorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../Ice/TransceiverF.h diff --git a/cpp/src/Ice/CommunicatorI.cpp b/cpp/src/Ice/CommunicatorI.cpp index be71717e327..dc41f2849f2 100644 --- a/cpp/src/Ice/CommunicatorI.cpp +++ b/cpp/src/Ice/CommunicatorI.cpp @@ -37,11 +37,8 @@ Ice::CommunicatorI::destroy() if(!_destroyed) // Don't destroy twice. { _destroyed = true; - - _instance->objectAdapterFactory()->shutdown(); - _instance->destroy(); - _serverThreadPool = 0; + _instance->destroy(); } } @@ -60,14 +57,23 @@ Ice::CommunicatorI::shutdown() void Ice::CommunicatorI::waitForShutdown() { - // - // No mutex locking here, otherwise the communicator is blocked - // while waiting for shutdown. - // - if(_serverThreadPool) + ObjectAdapterFactoryPtr objectAdapterFactory; + { - _serverThreadPool->waitUntilFinished(); + RecMutex::Lock sync(*this); + if(_destroyed) + { + throw CommunicatorDestroyedException(__FILE__, __LINE__); + } + objectAdapterFactory = _instance->objectAdapterFactory(); } + + // + // We must call waitForShutdown on the object adapter factory + // outside the synchronization, otherwise the communicator is + // blocked while we wait for shutdown. + // + objectAdapterFactory->waitForShutdown(); } ObjectPrx @@ -307,8 +313,9 @@ Ice::CommunicatorI::~CommunicatorI() { Warning warn(_instance->logger()); warn << - "The communicator is not the last Ice object that is deleted. (You can\n" - "disable this warning by setting the property `Ice.Warn.Leaks' to 0.)"; + "The communicator is not the last Ice object that is\n" + "deleted. (You can disable this warning by setting the\n" + "property `Ice.Warn.Leaks' to 0.)"; } } } diff --git a/cpp/src/Ice/Connection.cpp b/cpp/src/Ice/Connection.cpp index 7cd4aae0847..1128835a881 100644 --- a/cpp/src/Ice/Connection.cpp +++ b/cpp/src/Ice/Connection.cpp @@ -36,17 +36,83 @@ using namespace IceInternal; void IceInternal::incRef(Connection* p) { p->__incRef(); } void IceInternal::decRef(Connection* p) { p->__decRef(); } +void +IceInternal::Connection::activate() +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + setState(StateActive); +} + +void +IceInternal::Connection::hold() +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + setState(StateHolding); +} + +void +IceInternal::Connection::destroy(DestructionReason reason) +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + switch(reason) + { + case ObjectAdapterDeactivated: + { + setState(StateClosing, ObjectAdapterDeactivatedException(__FILE__, __LINE__)); + break; + } + + case CommunicatorDestroyed: + { + setState(StateClosing, CommunicatorDestroyedException(__FILE__, __LINE__)); + break; + } + } +} + bool -IceInternal::Connection::destroyed() const +IceInternal::Connection::isDestroyed() const { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + return _state >= StateClosing; } +bool +IceInternal::Connection::isFinished() const +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + return _transceiver == 0; +} + +void +IceInternal::Connection::waitUntilHolding() const +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + while(_state < StateHolding || _dispatchCount > 0) + { + wait(); + } +} + +void +IceInternal::Connection::waitUntilFinished() const +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + while(_transceiver) + { + wait(); + } +} + void IceInternal::Connection::validate() { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); if(_endpoint->datagram()) { @@ -122,34 +188,20 @@ IceInternal::Connection::validate() } void -IceInternal::Connection::hold() +IceInternal::Connection::incProxyCount() { - IceUtil::RecMutex::Lock sync(*this); - setState(StateHolding); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + assert(_proxyCount >= 0); + ++_proxyCount; } void -IceInternal::Connection::activate() +IceInternal::Connection::decProxyCount() { - IceUtil::RecMutex::Lock sync(*this); - setState(StateActive); -} - -void -IceInternal::Connection::incUsageCount() -{ - IceUtil::RecMutex::Lock sync(*this); - assert(_usageCount >= 0); - ++_usageCount; -} - -void -IceInternal::Connection::decUsageCount() -{ - IceUtil::RecMutex::Lock sync(*this); - assert(_usageCount > 0); - --_usageCount; - if(_usageCount == 0 && !_adapter) + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + assert(_proxyCount > 0); + --_proxyCount; + if(_proxyCount == 0 && !_adapter) { assert(_requests.empty()); assert(_asyncRequests.empty()); @@ -164,9 +216,9 @@ IceInternal::Connection::prepareRequest(BasicStream* os) } void -IceInternal::Connection::sendRequest(Outgoing* out, bool oneway, bool comp) +IceInternal::Connection::sendRequest(Outgoing* out, bool oneway, bool compress) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); if(_exception.get()) { @@ -198,17 +250,17 @@ IceInternal::Connection::sendRequest(Outgoing* out, bool oneway, bool comp) if(os->b.size() < 100) // Don't compress if message size is smaller than 100 bytes. { - comp = false; + compress = false; } else { if(_defaultsAndOverrides->overrideCompress) { - comp = _defaultsAndOverrides->overrideCompressValue; + compress = _defaultsAndOverrides->overrideCompressValue; } } - if(comp) + if(compress) { // // Change message type. @@ -219,7 +271,7 @@ IceInternal::Connection::sendRequest(Outgoing* out, bool oneway, bool comp) // Do compression. // BasicStream cstream(_instance); - compress(*os, cstream); + doCompress(*os, cstream); // // Send the request. @@ -265,9 +317,9 @@ IceInternal::Connection::sendRequest(Outgoing* out, bool oneway, bool comp) } void -IceInternal::Connection::sendAsyncRequest(const OutgoingAsyncPtr& out, bool comp) +IceInternal::Connection::sendAsyncRequest(const OutgoingAsyncPtr& out, bool compress) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); if(_exception.get()) { @@ -296,17 +348,17 @@ IceInternal::Connection::sendAsyncRequest(const OutgoingAsyncPtr& out, bool comp if(os->b.size() < 100) // Don't compress if message size is smaller than 100 bytes. { - comp = false; + compress = false; } else { if(_defaultsAndOverrides->overrideCompress) { - comp = _defaultsAndOverrides->overrideCompressValue; + compress = _defaultsAndOverrides->overrideCompressValue; } } - if(comp) + if(compress) { // // Change message type. @@ -317,7 +369,7 @@ IceInternal::Connection::sendAsyncRequest(const OutgoingAsyncPtr& out, bool comp // Do compression. // BasicStream cstream(_instance); - compress(*os, cstream); + doCompress(*os, cstream); // // Send the request. @@ -398,6 +450,7 @@ IceInternal::Connection::finishBatchRequest(BasicStream* os) assert(_state < StateClosing); _batchStream.swap(*os); // Get the batch stream back. + ++_batchRequestNum; // Increment the number of requests in the batch. unlock(); // Give the Connection back. } @@ -409,9 +462,9 @@ IceInternal::Connection::abortBatchRequest() } void -IceInternal::Connection::flushBatchRequest(bool comp) +IceInternal::Connection::flushBatchRequest(bool compress) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); if(_exception.get()) { @@ -428,19 +481,26 @@ IceInternal::Connection::flushBatchRequest(bool comp) _batchStream.i = _batchStream.b.begin(); + // + // Fill in the number of requests in the batch. + // + const Byte* p; + p = reinterpret_cast<const Byte*>(&_batchRequestNum); + copy(p, p + sizeof(Int), _batchStream.b.begin() + headerSize); + if(_batchStream.b.size() < 100) // Don't compress if message size is smaller than 100 bytes. { - comp = false; + compress = false; } else { if(_defaultsAndOverrides->overrideCompress) { - comp = _defaultsAndOverrides->overrideCompressValue; + compress = _defaultsAndOverrides->overrideCompressValue; } } - if(comp) + if(compress) { // // Change message type. @@ -451,7 +511,7 @@ IceInternal::Connection::flushBatchRequest(bool comp) // Do compression. // BasicStream cstream(_instance); - compress(_batchStream, cstream); + doCompress(_batchStream, cstream); // // Send the batch request. @@ -480,11 +540,13 @@ IceInternal::Connection::flushBatchRequest(bool comp) } // - // Reset _batchStream so that new batch messages can be sent. + // Reset _batchStream and _batchRequestNum, so that new batch + // messages can be sent. // BasicStream dummy(_instance); _batchStream.swap(dummy); assert(_batchStream.b.empty()); + _batchRequestNum = 0; } catch(const LocalException& ex) { @@ -495,9 +557,9 @@ IceInternal::Connection::flushBatchRequest(bool comp) } void -IceInternal::Connection::sendResponse(BasicStream* os, bool comp) +IceInternal::Connection::sendResponse(BasicStream* os, bool compress) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); try { @@ -508,17 +570,17 @@ IceInternal::Connection::sendResponse(BasicStream* os, bool comp) if(os->b.size() < 100) // Don't compress if message size is smaller than 100 bytes. { - comp = false; + compress = false; } else { if(_defaultsAndOverrides->overrideCompress) { - comp = _defaultsAndOverrides->overrideCompressValue; + compress = _defaultsAndOverrides->overrideCompressValue; } } - if(comp) + if(compress) { // // Change message type. @@ -529,7 +591,7 @@ IceInternal::Connection::sendResponse(BasicStream* os, bool comp) // Do compression. // BasicStream cstream(_instance); - compress(*os, cstream); + doCompress(*os, cstream); // // Send the reply. @@ -557,17 +619,47 @@ IceInternal::Connection::sendResponse(BasicStream* os, bool comp) _transceiver->write(*os, _endpoint->timeout()); } - --_responseCount; + if(--_dispatchCount == 0) + { + notifyAll(); + } - if(_state == StateClosing && _responseCount == 0 && !_endpoint->datagram()) + if(_state == StateClosing && _dispatchCount == 0) { - closeConnection(); + initiateShutdown(); + } + } + catch(const LocalException& ex) + { + setState(StateClosed, ex); + } +} + +void +IceInternal::Connection::sendNoResponse() +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + try + { + if(_state == StateClosed) + { + return; + } + + if(--_dispatchCount == 0) + { + notifyAll(); + } + + if(_state == StateClosing && _dispatchCount == 0) + { + initiateShutdown(); } } catch(const LocalException& ex) { setState(StateClosed, ex); - return; } } @@ -588,7 +680,7 @@ IceInternal::Connection::endpoint() const void IceInternal::Connection::setAdapter(const ObjectAdapterPtr& adapter) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); // // We are registered with a thread pool in active and closing @@ -620,7 +712,7 @@ IceInternal::Connection::setAdapter(const ObjectAdapterPtr& adapter) ObjectAdapterPtr IceInternal::Connection::getAdapter() const { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); return _adapter; } @@ -640,12 +732,13 @@ void IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threadPool) { OutgoingAsyncPtr outAsync; - bool invoke = false; - bool comp = false; - bool batch = false; + + Int invoke = 0; + Int requestId = 0; + bool compress = false; { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); threadPool->promoteFollower(); @@ -671,9 +764,9 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa messageType == compressedReplyMsg) { BasicStream ustream(_instance); - uncompress(stream, ustream); + doUncompress(stream, ustream); stream.b.swap(ustream.b); - comp = true; + compress = true; } stream.i = stream.b.begin() + headerSize; @@ -691,7 +784,9 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa else { traceRequest("received request", stream, _logger, _traceLevels); - invoke = true; + stream.read(requestId); + invoke = 1; + ++_dispatchCount; } break; } @@ -707,7 +802,9 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa else { traceRequest("received compressed request", stream, _logger, _traceLevels); - invoke = true; + stream.read(requestId); + invoke = 1; + ++_dispatchCount; } break; } @@ -723,8 +820,12 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa else { traceBatchRequest("received batch request", stream, _logger, _traceLevels); - invoke = true; - batch = true; + stream.read(invoke); + if(invoke < 0) + { + throw NegativeSizeException(__FILE__, __LINE__); + } + _dispatchCount += invoke; } break; } @@ -740,8 +841,12 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa else { traceBatchRequest("received compressed batch request", stream, _logger, _traceLevels); - invoke = true; - batch = true; + stream.read(invoke); + if(invoke < 0) + { + throw NegativeSizeException(__FILE__, __LINE__); + } + _dispatchCount += invoke; } break; } @@ -758,7 +863,6 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa traceReply("received reply", stream, _logger, _traceLevels); } - Int requestId; stream.read(requestId); map<Int, Outgoing*>::iterator p = _requests.end(); @@ -893,22 +997,13 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa // Method invocation must be done outside the thread // synchronization, so that nested calls are possible. // - if(invoke) + if(invoke > 0) { // - // If this is not a batch request, get the request id. - // - Int requestId = 0; - if(!batch) - { - stream.read(requestId); - } - bool response = !_endpoint->datagram() && requestId != 0; - - // // Prepare the invocation. // - Incoming in(_instance, _adapter, response ? this : 0, comp); + bool response = !_endpoint->datagram() && requestId != 0; + Incoming in(_instance, _adapter, this, response, compress); BasicStream* is = in.is(); stream.swap(*is); BasicStream* os = in.os(); @@ -920,53 +1015,39 @@ IceInternal::Connection::message(BasicStream& stream, const ThreadPoolPtr& threa // if(response) { - ++_responseCount; - os->write(protocolVersion); - os->write(encodingVersion); - os->write(replyMsg); - os->write(Int(0)); // Message size (placeholder). - os->write(requestId); + assert(invoke == 1); + os->writeBlob(_replyHdr); + + // + // Fill in the request ID. + // + const Byte* p; + p = reinterpret_cast<const Byte*>(&requestId); + copy(p, p + sizeof(Int), os->b.begin() + headerSize); } // // Do the invocation, or multiple invocations for batch // messages. // - do + while(invoke-- > 0) { - if(in.invoke()) - { - // - // If invoke() returned true, the operation was - // dispatched asynchronously, meaning that we - // don't send a response below. - // - response = false; - } + in.invoke(); } - while(batch && is->i < is->b.end()); } catch(const LocalException& ex) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); setState(StateClosed, ex); return; } - - // - // Send a response if necessary. - // - if(response) - { - sendResponse(os, comp); - } } } void IceInternal::Connection::finished(const ThreadPoolPtr& threadPool) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); threadPool->promoteFollower(); @@ -977,13 +1058,15 @@ IceInternal::Connection::finished(const ThreadPoolPtr& threadPool) else if(_state == StateClosed) { _transceiver->close(); + _transceiver = 0; + notifyAll(); } } void IceInternal::Connection::exception(const LocalException& ex) { - IceUtil::RecMutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); setState(StateClosed, ex); } @@ -1004,62 +1087,42 @@ IceInternal::Connection::Connection(const InstancePtr& instance, _logger(_instance->logger()), _traceLevels(_instance->traceLevels()), _defaultsAndOverrides(_instance->defaultsAndOverrides()), + _registeredWithPool(false), _warn(_instance->properties()->getPropertyAsInt("Ice.Warn.Connections") > 0), + _requestHdr(headerSize + 4, 0), + _requestBatchHdr(headerSize + 4, 0), + _replyHdr(headerSize + 4, 0), _nextRequestId(1), _requestsHint(_requests.end()), _asyncRequestsHint(_asyncRequests.end()), _batchStream(_instance), - _responseCount(0), - _usageCount(0), - _state(StateHolding), - _registeredWithPool(false) + _batchRequestNum(0), + _dispatchCount(0), + _proxyCount(0), + _state(StateHolding) { vector<Byte>& requestHdr = const_cast<vector<Byte>&>(_requestHdr); - requestHdr.reserve(headerSize + 4); - requestHdr.push_back(protocolVersion); - requestHdr.push_back(encodingVersion); - requestHdr.push_back(requestMsg); - requestHdr.push_back(0); // Message size (placeholder). - requestHdr.push_back(0); // Message size (placeholder). - requestHdr.push_back(0); // Message size (placeholder). - requestHdr.push_back(0); // Message size (placeholder). - requestHdr.push_back(0); // Request ID (placeholder). - requestHdr.push_back(0); // Request ID (placeholder). - requestHdr.push_back(0); // Request ID (placeholder). - requestHdr.push_back(0); // Request ID (placeholder). - assert(_requestHdr.size() == headerSize + 4); + requestHdr[0] = protocolVersion; + requestHdr[1] = encodingVersion; + requestHdr[2] = requestMsg; vector<Byte>& requestBatchHdr = const_cast<vector<Byte>&>(_requestBatchHdr); - requestBatchHdr.resize(_requestHdr.size() - 4); - copy(_requestHdr.begin(), _requestHdr.end() - 4, requestBatchHdr.begin()); + requestBatchHdr[0] = protocolVersion; + requestBatchHdr[1] = encodingVersion; requestBatchHdr[2] = requestBatchMsg; + + vector<Byte>& replyHdr = const_cast<vector<Byte>&>(_replyHdr); + replyHdr[0] = protocolVersion; + replyHdr[1] = encodingVersion; + replyHdr[2] = replyMsg; } IceInternal::Connection::~Connection() { - assert(_usageCount == 0); assert(_state == StateClosed); -} - -void -IceInternal::Connection::destroy(DestructionReason reason) -{ - RecMutex::Lock sync(*this); - - switch(reason) - { - case ObjectAdapterDeactivated: - { - setState(StateClosing, ObjectAdapterDeactivatedException(__FILE__, __LINE__)); - break; - } - - case CommunicatorDestroyed: - { - setState(StateClosing, CommunicatorDestroyedException(__FILE__, __LINE__)); - break; - } - } + assert(!_transceiver); + assert(_dispatchCount == 0); + assert(_proxyCount == 0); } void @@ -1174,17 +1237,19 @@ IceInternal::Connection::setState(State state) registerWithPool(); } unregisterWithPool(); + _dispatchCount = 0; break; } } _state = state; + notifyAll(); - if(_state == StateClosing && _responseCount == 0 && !_endpoint->datagram()) + if(_state == StateClosing && _dispatchCount == 0) { try { - closeConnection(); + initiateShutdown(); } catch(const LocalException& ex) { @@ -1194,21 +1259,26 @@ IceInternal::Connection::setState(State state) } void -IceInternal::Connection::closeConnection() const +IceInternal::Connection::initiateShutdown() const { - BasicStream os(_instance); - os.write(protocolVersion); - os.write(encodingVersion); - os.write(closeConnectionMsg); - os.write(headerSize); // Message size. - os.i = os.b.begin(); - traceHeader("sending close connection", os, _logger, _traceLevels); - _transceiver->write(os, _endpoint->timeout()); + assert(_state == StateClosing); + assert(_dispatchCount == 0); - // - // A close connection is always followed by a connection shutdown. - // - _transceiver->shutdown(); + if(!_endpoint->datagram()) + { + // + // Before we shut down, we send a close connection message. + // + BasicStream os(_instance); + os.write(protocolVersion); + os.write(encodingVersion); + os.write(closeConnectionMsg); + os.write(headerSize); // Message size. + os.i = os.b.begin(); + traceHeader("sending close connection", os, _logger, _traceLevels); + _transceiver->write(os, _endpoint->timeout()); + _transceiver->shutdown(); + } } void @@ -1321,7 +1391,7 @@ getBZ2Error(int bzError) } void -IceInternal::Connection::compress(BasicStream& uncompressed, BasicStream& compressed) +IceInternal::Connection::doCompress(BasicStream& uncompressed, BasicStream& compressed) { const Byte* p; @@ -1366,7 +1436,7 @@ IceInternal::Connection::compress(BasicStream& uncompressed, BasicStream& compre } void -IceInternal::Connection::uncompress(BasicStream& compressed, BasicStream& uncompressed) +IceInternal::Connection::doUncompress(BasicStream& compressed, BasicStream& uncompressed) { Int uncompressedSize; compressed.i = compressed.b.begin() + headerSize; diff --git a/cpp/src/Ice/Connection.h b/cpp/src/Ice/Connection.h index 6ca8a3b5ec9..ef1eff48934 100644 --- a/cpp/src/Ice/Connection.h +++ b/cpp/src/Ice/Connection.h @@ -16,7 +16,7 @@ #define ICE_CONNECTION_H #include <IceUtil/RecMutex.h> - +#include <IceUtil/Monitor.h> #include <Ice/ConnectionF.h> #include <Ice/ConnectionFactoryF.h> #include <Ice/InstanceF.h> @@ -42,26 +42,45 @@ namespace IceInternal class Outgoing; -class Connection : public EventHandler, public ::IceUtil::RecMutex +class Connection : public EventHandler, public ::IceUtil::Monitor< ::IceUtil::RecMutex> { public: - bool destroyed() const; - void validate(); - void hold(); void activate(); - void incUsageCount(); - void decUsageCount(); + void hold(); + enum DestructionReason + { + ObjectAdapterDeactivated, + CommunicatorDestroyed + }; + void destroy(DestructionReason); + + bool isDestroyed() const; + bool isFinished() const; + + void waitUntilHolding() const; + void waitUntilFinished() const; + + void validate(); + + void incProxyCount(); + void decProxyCount(); + void prepareRequest(BasicStream*); void sendRequest(Outgoing*, bool, bool); void sendAsyncRequest(const OutgoingAsyncPtr&, bool); + void prepareBatchRequest(BasicStream*); void finishBatchRequest(BasicStream*); void abortBatchRequest(); void flushBatchRequest(bool); + void sendResponse(BasicStream*, bool); + void sendNoResponse(); + int timeout() const; EndpointPtr endpoint() const; + void setAdapter(const ::Ice::ObjectAdapterPtr&); ::Ice::ObjectAdapterPtr getAdapter() const; @@ -79,12 +98,6 @@ private: Connection(const InstancePtr&, const TransceiverPtr&, const EndpointPtr&, const ::Ice::ObjectAdapterPtr&); virtual ~Connection(); - enum DestructionReason - { - ObjectAdapterDeactivated, - CommunicatorDestroyed - }; - void destroy(DestructionReason); friend class IncomingConnectionFactory; friend class OutgoingConnectionFactory; @@ -98,34 +111,49 @@ private: void setState(State, const ::Ice::LocalException&); void setState(State); - void closeConnection() const; + + void initiateShutdown() const; + void registerWithPool(); void unregisterWithPool(); - static void compress(BasicStream&, BasicStream&); - static void uncompress(BasicStream&, BasicStream&); - const TransceiverPtr _transceiver; + static void doCompress(BasicStream&, BasicStream&); + static void doUncompress(BasicStream&, BasicStream&); + + TransceiverPtr _transceiver; const EndpointPtr _endpoint; + ::Ice::ObjectAdapterPtr _adapter; + const ::Ice::LoggerPtr _logger; const TraceLevelsPtr _traceLevels; const DefaultsAndOverridesPtr _defaultsAndOverrides; + const ThreadPoolPtr _clientThreadPool; const ThreadPoolPtr _serverThreadPool; + bool _registeredWithPool; + const bool _warn; + const std::vector< ::Ice::Byte> _requestHdr; const std::vector< ::Ice::Byte> _requestBatchHdr; + const std::vector< ::Ice::Byte> _replyHdr; + ::Ice::Int _nextRequestId; std::map< ::Ice::Int, Outgoing*> _requests; std::map< ::Ice::Int, Outgoing*>::iterator _requestsHint; std::map< ::Ice::Int, OutgoingAsyncPtr> _asyncRequests; std::map< ::Ice::Int, OutgoingAsyncPtr>::iterator _asyncRequestsHint; + std::auto_ptr< ::Ice::LocalException> _exception; + BasicStream _batchStream; - int _responseCount; - int _usageCount; + int _batchRequestNum; + + int _dispatchCount; // The number of requests currently being dispatched. + int _proxyCount; // The number of proxies using this connection. + State _state; - bool _registeredWithPool; }; } diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp index ff635001516..9c29f05c431 100644 --- a/cpp/src/Ice/ConnectionFactory.cpp +++ b/cpp/src/Ice/ConnectionFactory.cpp @@ -40,10 +40,61 @@ void IceInternal::decRef(OutgoingConnectionFactory* p) { p->__decRef(); } void IceInternal::incRef(IncomingConnectionFactory* p) { p->__incRef(); } void IceInternal::decRef(IncomingConnectionFactory* p) { p->__decRef(); } +void +IceInternal::OutgoingConnectionFactory::destroy() +{ + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + if(!_instance) + { + return; + } + +#ifdef _STLP_BEGIN_NAMESPACE + // voidbind2nd is an STLport extension for broken compilers in IceUtil/Functional.h + for_each(_connections.begin(), _connections.end(), + voidbind2nd(Ice::secondVoidMemFun1<EndpointPtr, Connection, Connection::DestructionReason> + (&Connection::destroy), Connection::CommunicatorDestroyed)); +#else + for_each(_connections.begin(), _connections.end(), + bind2nd(Ice::secondVoidMemFun1<EndpointPtr, Connection, Connection::DestructionReason> + (&Connection::destroy), Connection::CommunicatorDestroyed)); +#endif + + _instance = 0; + notifyAll(); +} + +void +IceInternal::OutgoingConnectionFactory::waitUntilFinished() +{ + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + + // + // First we wait until the factory is destroyed. + // + while(_instance) + { + wait(); + } + + // + // Now we wait for until the destruction of each connection is + // finished. + // + for_each(_connections.begin(), _connections.end(), + Ice::secondConstVoidMemFun<EndpointPtr, Connection>(&Connection::waitUntilFinished)); + + // + // We're done, now we can throw away all connections. + // + _connections.clear(); +} + ConnectionPtr IceInternal::OutgoingConnectionFactory::create(const vector<EndpointPtr>& endpoints) { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); if(!_instance) { @@ -53,12 +104,12 @@ IceInternal::OutgoingConnectionFactory::create(const vector<EndpointPtr>& endpoi assert(!endpoints.empty()); // - // Reap destroyed connections. + // Reap connections for which destruction has completed. // std::map<EndpointPtr, ConnectionPtr>::iterator p = _connections.begin(); while(p != _connections.end()) { - if(p->second->destroyed()) + if(p->second->isFinished()) { _connections.erase(p++); } @@ -84,7 +135,14 @@ IceInternal::OutgoingConnectionFactory::create(const vector<EndpointPtr>& endpoi map<EndpointPtr, ConnectionPtr>::const_iterator r = _connections.find(endpoint); if(r != _connections.end()) { - return r->second; + // + // Don't return connections for which destruction has been + // initiated. + // + if(!r->second->isDestroyed()) + { + return r->second; + } } } @@ -156,7 +214,7 @@ IceInternal::OutgoingConnectionFactory::create(const vector<EndpointPtr>& endpoi void IceInternal::OutgoingConnectionFactory::setRouter(const RouterPrx& router) { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); if(!_instance) { @@ -196,7 +254,7 @@ IceInternal::OutgoingConnectionFactory::setRouter(const RouterPrx& router) void IceInternal::OutgoingConnectionFactory::removeAdapter(const ObjectAdapterPtr& adapter) { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); if(!_instance) { @@ -220,45 +278,73 @@ IceInternal::OutgoingConnectionFactory::OutgoingConnectionFactory(const Instance IceInternal::OutgoingConnectionFactory::~OutgoingConnectionFactory() { assert(!_instance); + assert(_connections.empty()); } void -IceInternal::OutgoingConnectionFactory::destroy() +IceInternal::IncomingConnectionFactory::activate() { - IceUtil::Mutex::Lock sync(*this); - - if(!_instance) - { - return; - } - -#ifdef _STLP_BEGIN_NAMESPACE - // voidbind2nd is an STLport extension for broken compilers in IceUtil/Functional.h - for_each(_connections.begin(), _connections.end(), - voidbind2nd(Ice::secondVoidMemFun1<EndpointPtr, Connection, Connection::DestructionReason> - (&Connection::destroy), Connection::CommunicatorDestroyed)); -#else - for_each(_connections.begin(), _connections.end(), - bind2nd(Ice::secondVoidMemFun1<EndpointPtr, Connection, Connection::DestructionReason> - (&Connection::destroy), Connection::CommunicatorDestroyed)); -#endif - - _connections.clear(); - _instance = 0; + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + setState(StateActive); } void IceInternal::IncomingConnectionFactory::hold() { - ::IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); setState(StateHolding); } void -IceInternal::IncomingConnectionFactory::activate() +IceInternal::IncomingConnectionFactory::destroy() { - ::IceUtil::Mutex::Lock sync(*this); - setState(StateActive); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + setState(StateClosed); +} + +void +IceInternal::IncomingConnectionFactory::waitUntilHolding() const +{ + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + + // + // First we wait until the connection factory itself is in holding + // state. + // + while(_state < StateHolding) + { + wait(); + } + + // + // Now we wait until each connection is in holding state. + // + for_each(_connections.begin(), _connections.end(), Ice::constVoidMemFun(&Connection::waitUntilHolding)); +} + +void +IceInternal::IncomingConnectionFactory::waitUntilFinished() +{ + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + + // + // First we wait until the factory is destroyed. + // + while(_acceptor) + { + wait(); + } + + // + // Now we wait for until the destruction of each connection is + // finished. + // + for_each(_connections.begin(), _connections.end(), Ice::constVoidMemFun(&Connection::waitUntilFinished)); + + // + // We're done, now we can throw away all connections. + // + _connections.clear(); } EndpointPtr @@ -283,16 +369,17 @@ IceInternal::IncomingConnectionFactory::equivalent(const EndpointPtr& endp) cons list<ConnectionPtr> IceInternal::IncomingConnectionFactory::connections() const { - ::IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); + + list<ConnectionPtr> result; // - // Reap destroyed connections. + // Only copy connections which have not been destroyed. // - list<ConnectionPtr>& connections = const_cast<list<ConnectionPtr>& >(_connections); - connections.erase(remove_if(connections.begin(), connections.end(), ::Ice::constMemFun(&Connection::destroyed)), - connections.end()); + remove_copy_if(_connections.begin(), _connections.end(), back_inserter(result), + ::Ice::constMemFun(&Connection::isDestroyed)); - return _connections; + return result; } bool @@ -310,7 +397,7 @@ IceInternal::IncomingConnectionFactory::read(BasicStream&) void IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPtr& threadPool) { - ::IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); if(_state != StateActive) { @@ -320,10 +407,11 @@ IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPt } // - // Reap destroyed connections. + // Reap connections for which destruction has completed. // - _connections.erase(remove_if(_connections.begin(), _connections.end(), ::Ice::constMemFun(&Connection::destroyed)), - _connections.end()); + _connections.erase(remove_if(_connections.begin(), _connections.end(), + ::Ice::constMemFun(&Connection::isFinished)), + _connections.end()); // // Now accept a new connection. @@ -394,7 +482,7 @@ IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPt void IceInternal::IncomingConnectionFactory::finished(const ThreadPoolPtr& threadPool) { - ::IceUtil::Mutex::Lock sync(*this); + ::IceUtil::Monitor< ::IceUtil::Mutex>::Lock sync(*this); threadPool->promoteFollower(); @@ -405,12 +493,8 @@ IceInternal::IncomingConnectionFactory::finished(const ThreadPoolPtr& threadPool else if(_state == StateClosed) { _acceptor->close(); - - // - // We don't need the adapter anymore after we closed the - // acceptor. - // - _adapter = 0; + _acceptor = 0; + notifyAll(); } } @@ -438,9 +522,9 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance EventHandler(instance), _endpoint(endpoint), _adapter(adapter), + _registeredWithPool(false), _warn(_instance->properties()->getPropertyAsInt("Ice.Warn.Connections") > 0), - _state(StateHolding), - _registeredWithPool(false) + _state(StateHolding) { DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides(); if(defaultsAndOverrides->overrideTimeout) @@ -456,16 +540,10 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance ConnectionPtr connection = new Connection(_instance, _transceiver, _endpoint, _adapter); connection->validate(); _connections.push_back(connection); - - // - // We don't need an adapter anymore if we don't use an - // acceptor. - // - _adapter = 0; } else { - const_cast<AcceptorPtr&>(_acceptor) = _endpoint->acceptor(const_cast<EndpointPtr&>(_endpoint)); + _acceptor = _endpoint->acceptor(const_cast<EndpointPtr&>(_endpoint)); assert(_acceptor); _acceptor->listen(); } @@ -480,14 +558,8 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance IceInternal::IncomingConnectionFactory::~IncomingConnectionFactory() { assert(_state == StateClosed); - assert(!_adapter); -} - -void -IceInternal::IncomingConnectionFactory::destroy() -{ - ::IceUtil::Mutex::Lock sync(*this); - setState(StateClosed); + assert(!_acceptor); + assert(_connections.empty()); } void @@ -542,13 +614,12 @@ IceInternal::IncomingConnectionFactory::setState(State state) for_each(_connections.begin(), _connections.end(), bind2nd(Ice::voidMemFun1(&Connection::destroy), Connection::ObjectAdapterDeactivated)); #endif - _connections.clear(); - break; } } _state = state; + notifyAll(); } void diff --git a/cpp/src/Ice/ConnectionFactory.h b/cpp/src/Ice/ConnectionFactory.h index 791c433b0d0..35f99ca073b 100644 --- a/cpp/src/Ice/ConnectionFactory.h +++ b/cpp/src/Ice/ConnectionFactory.h @@ -15,7 +15,8 @@ #ifndef ICE_CONNECTION_FACTORY_H #define ICE_CONNECTION_FACTORY_H -#include <IceUtil/RecMutex.h> +#include <IceUtil/Mutex.h> +#include <IceUtil/Monitor.h> #include <Ice/ConnectionFactoryF.h> #include <Ice/ConnectionF.h> #include <Ice/InstanceF.h> @@ -38,10 +39,14 @@ class ObjectAdapterI; namespace IceInternal { -class OutgoingConnectionFactory : public ::IceUtil::Shared, public ::IceUtil::Mutex +class OutgoingConnectionFactory : public ::IceUtil::Shared, public ::IceUtil::Monitor< ::IceUtil::Mutex> { public: + void destroy(); + + void waitUntilFinished(); + ConnectionPtr create(const std::vector<EndpointPtr>&); void setRouter(const ::Ice::RouterPrx&); void removeAdapter(const ::Ice::ObjectAdapterPtr&); @@ -50,19 +55,22 @@ private: OutgoingConnectionFactory(const InstancePtr&); virtual ~OutgoingConnectionFactory(); - void destroy(); friend class Instance; InstancePtr _instance; std::map<EndpointPtr, ConnectionPtr> _connections; }; -class IncomingConnectionFactory : public EventHandler, public ::IceUtil::Mutex +class IncomingConnectionFactory : public EventHandler, public ::IceUtil::Monitor< ::IceUtil::Mutex> { public: - void hold(); void activate(); + void hold(); + void destroy(); + + void waitUntilHolding() const; + void waitUntilFinished(); EndpointPtr endpoint() const; bool equivalent(const EndpointPtr&) const; @@ -82,7 +90,6 @@ private: IncomingConnectionFactory(const InstancePtr&, const EndpointPtr&, const ::Ice::ObjectAdapterPtr&); virtual ~IncomingConnectionFactory(); - void destroy(); friend class ::Ice::ObjectAdapterI; enum State @@ -96,15 +103,20 @@ private: void registerWithPool(); void unregisterWithPool(); - const EndpointPtr _endpoint; - ::Ice::ObjectAdapterPtr _adapter; // Cannot be const, because it must be set to zero to break cyclic dependency. - const AcceptorPtr _acceptor; + AcceptorPtr _acceptor; const TransceiverPtr _transceiver; + const EndpointPtr _endpoint; + + const ::Ice::ObjectAdapterPtr _adapter; + const ThreadPoolPtr _serverThreadPool; + bool _registeredWithPool; + const bool _warn; + std::list<ConnectionPtr> _connections; + State _state; - bool _registeredWithPool; }; } diff --git a/cpp/src/Ice/Direct.cpp b/cpp/src/Ice/Direct.cpp index 3a40175c783..59be398b3c1 100644 --- a/cpp/src/Ice/Direct.cpp +++ b/cpp/src/Ice/Direct.cpp @@ -13,7 +13,7 @@ // ********************************************************************** #include <Ice/Direct.h> -#include <Ice/ObjectAdapterI.h> // We need ObjectAdapterI, not ObjectAdapter, because of inc/decUsageCount(). +#include <Ice/ObjectAdapterI.h> // We need ObjectAdapterI, not ObjectAdapter, because of inc/decDirectCount(). #include <Ice/ServantLocator.h> #include <Ice/Reference.h> #include <Ice/Object.h> @@ -26,10 +26,10 @@ using namespace IceInternal; IceInternal::Direct::Direct(const Current& current) : _current(current) { + dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->incDirectCount(); + try { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->incUsageCount(); - _servant = _current.adapter->identityToServant(_current.id); if(!_servant && !_current.id.category.empty()) @@ -82,12 +82,12 @@ IceInternal::Direct::Direct(const Current& current) : } catch(...) { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); + dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decDirectCount(); throw; } } - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); + dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decDirectCount(); throw; } } @@ -102,12 +102,12 @@ IceInternal::Direct::~Direct() } catch(...) { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); + dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decDirectCount(); throw; } } - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); + dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decDirectCount(); } const ObjectPtr& diff --git a/cpp/src/Ice/Incoming.cpp b/cpp/src/Ice/Incoming.cpp index 5f1fd6b1fce..8a2d066ebb7 100644 --- a/cpp/src/Ice/Incoming.cpp +++ b/cpp/src/Ice/Incoming.cpp @@ -13,9 +13,10 @@ // ********************************************************************** #include <Ice/Incoming.h> -#include <Ice/ObjectAdapterI.h> // We need ObjectAdapterI, not ObjectAdapter, because of inc/decUsageCount(). +#include <Ice/ObjectAdapter.h> #include <Ice/ServantLocator.h> #include <Ice/Object.h> +#include <Ice/Connection.h> #include <Ice/LocalException.h> #include <Ice/Instance.h> #include <Ice/Properties.h> @@ -28,9 +29,10 @@ using namespace std; using namespace Ice; using namespace IceInternal; -IceInternal::Incoming::Incoming(const InstancePtr& instance, const ObjectAdapterPtr& adapter, - Connection* connection, bool compress) : +IceInternal::Incoming::Incoming(const InstancePtr& instance, const ObjectAdapterPtr& adapter, Connection* connection, + bool response, bool compress) : _connection(connection), + _response(response), _compress(compress), _is(instance), _os(instance) @@ -38,7 +40,7 @@ IceInternal::Incoming::Incoming(const InstancePtr& instance, const ObjectAdapter _current.adapter = adapter; } -bool +void IceInternal::Incoming::invoke() { // @@ -62,7 +64,7 @@ IceInternal::Incoming::invoke() _is.startReadEncaps(); - if(_connection) // Response expected? + if(_response) { assert(_os.b.size() == headerSize + 4); // Dispatch status position. _os.write(static_cast<Byte>(0)); @@ -81,8 +83,6 @@ IceInternal::Incoming::invoke() { if(_current.adapter) { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->incUsageCount(); - _servant = _current.adapter->identityToServant(_current.id); if(!_servant && !_current.id.category.empty()) @@ -135,21 +135,12 @@ IceInternal::Incoming::invoke() // call is not finished yet. // assert(status == DispatchOK); - return true; + return; } } } catch(RequestFailedException& ex) { - if(_is.b.empty()) // Asynchronous dispatch? - { - Error out(_os.instance()->logger()); - out << "dispatch exception in asynchronous method: " << ex; - ex.ice_throw(); - } - - finishInvoke(); - if(ex.id.name.empty()) { ex.id = _current.id; @@ -165,7 +156,9 @@ IceInternal::Incoming::invoke() ex.operation = _current.operation; } - if(_connection) // Response expected? + warning(ex); + + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -190,21 +183,14 @@ IceInternal::Incoming::invoke() _os.write(ex.operation); } - warning(ex); - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); + return; } catch(const LocalException& ex) { - if(_is.b.empty()) // Asynchronous dispatch? - { - Error out(_os.instance()->logger()); - out << "dispatch exception in asynchronous method: " << ex; - ex.ice_throw(); - } - - finishInvoke(); + warning(ex); - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -214,21 +200,14 @@ IceInternal::Incoming::invoke() _os.write(str.str()); } - warning(ex); - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); + return; } catch(const UserException& ex) { - if(_is.b.empty()) // Asynchronous dispatch? - { - Error out(_os.instance()->logger()); - out << "dispatch exception in asynchronous method: " << ex; - ex.ice_throw(); - } - - finishInvoke(); + warning(ex); - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -238,21 +217,14 @@ IceInternal::Incoming::invoke() _os.write(str.str()); } - warning(ex); - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); + return; } catch(const Exception& ex) { - if(_is.b.empty()) // Asynchronous dispatch? - { - Error out(_os.instance()->logger()); - out << "dispatch exception in asynchronous method: " << ex; - ex.ice_throw(); - } - - finishInvoke(); + warning(ex); - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -262,21 +234,14 @@ IceInternal::Incoming::invoke() _os.write(str.str()); } - warning(ex); - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); + return; } catch(const std::exception& ex) { - if(_is.b.empty()) // Asynchronous dispatch? - { - Error out(_os.instance()->logger()); - out << "dispatch exception in asynchronous method: std::exception: " << ex.what(); - throw UnknownException(__FILE__, __LINE__); - } - - finishInvoke(); + warning(string("std::exception: ") + ex.what()); - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -286,21 +251,14 @@ IceInternal::Incoming::invoke() _os.write(str.str()); } - warning(string("std::exception: ") + ex.what()); - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); + return; } catch(...) { - if(_is.b.empty()) // Asynchronous dispatch? - { - Error out(_os.instance()->logger()); - out << "dispatch exception in asynchronous method: unknown c++ exception"; - throw UnknownException(__FILE__, __LINE__); - } - - finishInvoke(); + warning("unknown c++ exception"); - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -309,8 +267,8 @@ IceInternal::Incoming::invoke() _os.write(reason); } - warning("unknown c++ exception"); - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); + return; } // @@ -319,9 +277,7 @@ IceInternal::Incoming::invoke() // the caller of this operation. // - finishInvoke(); - - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); @@ -344,7 +300,7 @@ IceInternal::Incoming::invoke() } } - return false; // Regular, non-asynchronous dispatch. + finishInvoke(); } BasicStream* @@ -364,26 +320,24 @@ IceInternal::Incoming::finishInvoke() { if(_locator && _servant) { - try - { - _locator->finished(_current, _servant, _cookie); - } - catch(...) - { - if(_current.adapter) - { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); - } - throw; - } + _locator->finished(_current, _servant, _cookie); + } + + _is.endReadEncaps(); + + // + // Send a response if necessary. If we don't need to send a + // response, we still need to tell the connection that we're + // finished with dispatching. + // + if(_response) + { + _connection->sendResponse(&_os, _compress); } - - if(_current.adapter) + else { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); + _connection->sendNoResponse(); } - - _is.endReadEncaps(); } void diff --git a/cpp/src/Ice/IncomingAsync.cpp b/cpp/src/Ice/IncomingAsync.cpp index a6e1559c5ee..77eec9331f1 100644 --- a/cpp/src/Ice/IncomingAsync.cpp +++ b/cpp/src/Ice/IncomingAsync.cpp @@ -13,7 +13,6 @@ // ********************************************************************** #include <Ice/IncomingAsync.h> -#include <Ice/ObjectAdapterI.h> // We need ObjectAdapterI, not ObjectAdapter, because of inc/decUsageCount(). #include <Ice/ServantLocator.h> #include <Ice/Object.h> #include <Ice/Incoming.h> @@ -35,13 +34,14 @@ void IceInternal::incRef(AMD_Object_ice_invoke* p) { p->__incRef(); } void IceInternal::decRef(AMD_Object_ice_invoke* p) { p->__decRef(); } IceInternal::IncomingAsync::IncomingAsync(Incoming& in) : + _instance(in._is.instance()), _current(in._current), _servant(in._servant), _locator(in._locator), _cookie(in._cookie), _connection(in._connection), + _response(in._response), _compress(in._compress), - _instance(in._is.instance()), _is(_instance), _os(_instance) { @@ -52,9 +52,7 @@ IceInternal::IncomingAsync::IncomingAsync(Incoming& in) : void IceInternal::IncomingAsync::__response(bool ok) { - finishInvoke(); - - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); @@ -66,9 +64,9 @@ IceInternal::IncomingAsync::__response(bool ok) { *(_os.b.begin() + headerSize + 4) = static_cast<Byte>(DispatchUserException); // Dispatch status position. } - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } void @@ -80,8 +78,6 @@ IceInternal::IncomingAsync::__exception(const Exception& exc) } catch(RequestFailedException& ex) { - finishInvoke(); - if(ex.id.name.empty()) { ex.id = _current.id; @@ -97,7 +93,7 @@ IceInternal::IncomingAsync::__exception(const Exception& exc) ex.operation = _current.operation; } - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -120,15 +116,13 @@ IceInternal::IncomingAsync::__exception(const Exception& exc) ex.id.__write(&_os); _os.write(ex.facet); _os.write(ex.operation); - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } catch(const LocalException& ex) { - finishInvoke(); - - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -136,15 +130,13 @@ IceInternal::IncomingAsync::__exception(const Exception& exc) ostringstream str; str << ex; _os.write(str.str()); - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } catch(const UserException& ex) { - finishInvoke(); - - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -152,15 +144,13 @@ IceInternal::IncomingAsync::__exception(const Exception& exc) ostringstream str; str << ex; _os.write(str.str()); - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } catch(const Exception& ex) { - finishInvoke(); - - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -168,18 +158,16 @@ IceInternal::IncomingAsync::__exception(const Exception& exc) ostringstream str; str << ex; _os.write(str.str()); - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } } void IceInternal::IncomingAsync::__exception(const std::exception& ex) { - finishInvoke(); - - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. @@ -187,33 +175,30 @@ IceInternal::IncomingAsync::__exception(const std::exception& ex) ostringstream str; str << "std::exception: " << ex.what(); _os.write(str.str()); - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } void IceInternal::IncomingAsync::__exception() { - if(_connection) // Response expected? + if(_response) { _os.endWriteEncaps(); _os.b.resize(headerSize + 4); // Dispatch status position. _os.write(static_cast<Byte>(DispatchUnknownException)); string reason = "unknown c++ exception"; _os.write(reason); - - _connection->sendResponse(&_os, _compress); } + + finishInvoke(); } void IceInternal::IncomingAsync::__fatal(const LocalException& ex) { - if(_connection) - { - _connection->exception(ex); - } + _connection->exception(ex); } BasicStream* @@ -233,20 +218,24 @@ IceInternal::IncomingAsync::finishInvoke() { if(_locator && _servant) { - try - { - _locator->finished(_current, _servant, _cookie); - } - catch(...) - { - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); - throw; - } + _locator->finished(_current, _servant, _cookie); } - - dynamic_cast<ObjectAdapterI*>(_current.adapter.get())->decUsageCount(); - + _is.endReadEncaps(); + + // + // Send a response if necessary. If we don't need to send a + // response, we still need to tell the connection that we're + // finished with dispatching. + // + if(_response) + { + _connection->sendResponse(&_os, _compress); + } + else + { + _connection->sendNoResponse(); + } } IceAsync::Ice::AMD_Object_ice_invoke::AMD_Object_ice_invoke(Incoming& in) : diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp index 614803f09a7..75894b607bf 100644 --- a/cpp/src/Ice/Instance.cpp +++ b/cpp/src/Ice/Instance.cpp @@ -499,121 +499,63 @@ IceInternal::Instance::finishSetup(int& argc, char* argv[]) void IceInternal::Instance::destroy() { - ThreadPoolPtr clientThreadPool; - ThreadPoolPtr serverThreadPool; + assert(!_destroyed); + + _objectAdapterFactory->shutdown(); + _objectAdapterFactory->waitForShutdown(); + + _outgoingConnectionFactory->destroy(); + _outgoingConnectionFactory->waitUntilFinished(); { IceUtil::RecMutex::Lock sync(*this); - if(_destroyed) - { - return; // Don't destroy twice. - } - - _destroyed = true; + _objectAdapterFactory = 0; + _outgoingConnectionFactory = 0; - if(_objectAdapterFactory) + if(_serverThreadPool) { - // Don't shut down the object adapters -- the communicator - // must do this before it destroys this object. - _objectAdapterFactory = 0; + _serverThreadPool->destroy(); + _serverThreadPool->joinWithAllThreads(); + _serverThreadPool = 0; } - if(_outgoingConnectionFactory) + if(_clientThreadPool) { - _outgoingConnectionFactory->destroy(); - _outgoingConnectionFactory = 0; + _clientThreadPool->destroy(); + _clientThreadPool->joinWithAllThreads(); + _clientThreadPool = 0; } - // - // We destroy the thread pool outside the thread - // synchronization. - // - clientThreadPool = _clientThreadPool; - _clientThreadPool = 0; - serverThreadPool = _serverThreadPool; - _serverThreadPool = 0; - } - - // - // We must destroy the outgoing connection factory before we - // destroy the client thread pool. - // - if(clientThreadPool) - { - clientThreadPool->waitUntilFinished(); - clientThreadPool->destroy(); - clientThreadPool->joinWithAllThreads(); - } - - // - // We must destroy the object adapter factory before we destroy - // the server thread pool. - // - if(serverThreadPool) - { - serverThreadPool->waitUntilFinished(); - serverThreadPool->destroy(); - serverThreadPool->joinWithAllThreads(); - } - - { - IceUtil::RecMutex::Lock sync(*this); - - if(_servantFactoryManager) - { - _servantFactoryManager->destroy(); - _servantFactoryManager = 0; - } + _servantFactoryManager->destroy(); + _servantFactoryManager = 0; - if(_userExceptionFactoryManager) - { - _userExceptionFactoryManager->destroy(); - _userExceptionFactoryManager = 0; - } + _userExceptionFactoryManager->destroy(); + _userExceptionFactoryManager = 0; - if(_referenceFactory) - { - _referenceFactory->destroy(); - _referenceFactory = 0; - } + _referenceFactory->destroy(); + _referenceFactory = 0; - if(_proxyFactory) - { - // No destroy function defined - // _proxyFactory->destroy(); - _proxyFactory = 0; - } + // No destroy function defined. + // _proxyFactory->destroy(); + _proxyFactory = 0; - if(_routerManager) - { - _routerManager->destroy(); - _routerManager = 0; - } + _routerManager->destroy(); + _routerManager = 0; - if(_locatorManager) - { - _locatorManager->destroy(); - _locatorManager = 0; - } + _locatorManager->destroy(); + _locatorManager = 0; - if(_endpointFactoryManager) - { - _endpointFactoryManager->destroy(); - _endpointFactoryManager = 0; - } + _endpointFactoryManager->destroy(); + _endpointFactoryManager = 0; - if(_pluginManager) - { - _pluginManager->destroy(); - _pluginManager = 0; - } + _pluginManager->destroy(); + _pluginManager = 0; - if(_dynamicLibraryList) - { - // No destroy function defined - // _dynamicLibraryList->destroy(); - _dynamicLibraryList = 0; - } + // No destroy function defined. + // _dynamicLibraryList->destroy(); + _dynamicLibraryList = 0; + + _destroyed = true; } } diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp index f10d21a3cc9..b4419cf68ce 100644 --- a/cpp/src/Ice/ObjectAdapterFactory.cpp +++ b/cpp/src/Ice/ObjectAdapterFactory.cpp @@ -14,6 +14,7 @@ #include <Ice/ObjectAdapterFactory.h> #include <Ice/ObjectAdapterI.h> +#include <Ice/LocalException.h> #include <Ice/Functional.h> using namespace std; @@ -26,18 +27,60 @@ void IceInternal::decRef(ObjectAdapterFactory* p) { p->__decRef(); } void IceInternal::ObjectAdapterFactory::shutdown() { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + // + // Ignore shutdown requests if the object adapter factory has + // already been shut down. + // + if(!_instance) + { + return; + } + for_each(_adapters.begin(), _adapters.end(), Ice::secondVoidMemFun<string, ObjectAdapter>(&ObjectAdapter::deactivate)); + + _instance = 0; + _communicator = 0; + notifyAll(); +} + +void +IceInternal::ObjectAdapterFactory::waitForShutdown() +{ + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + // + // First we wait for the shutdown of the factory itself. + // + while(_instance) + { + wait(); + } + + // + // Now we wait for deactivation of each object adapter. + // + for_each(_adapters.begin(), _adapters.end(), + Ice::secondVoidMemFun<string, ObjectAdapter>(&ObjectAdapter::waitForDeactivate)); + + // + // We're done, now we can throw away the object adapters. + // _adapters.clear(); } ObjectAdapterPtr IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const string& endpts, const string& id) { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + if(!_instance) + { + throw CommunicatorDestroyedException(__FILE__, __LINE__); + } map<string, ObjectAdapterIPtr>::iterator p = _adapters.find(name); if(p != _adapters.end()) @@ -53,13 +96,25 @@ IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const ObjectAdapterPtr IceInternal::ObjectAdapterFactory::findObjectAdapter(const ObjectPrx& proxy) { - IceUtil::Mutex::Lock sync(*this); + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + if(!_instance) + { + throw CommunicatorDestroyedException(__FILE__, __LINE__); + } for(map<string, ObjectAdapterIPtr>::iterator p = _adapters.begin(); p != _adapters.end(); ++p) { - if(p->second->isLocal(proxy)) + try { - return p->second; + if(p->second->isLocal(proxy)) + { + return p->second; + } + } + catch(const ObjectAdapterDeactivatedException&) + { + // Ignore. } } @@ -72,3 +127,10 @@ IceInternal::ObjectAdapterFactory::ObjectAdapterFactory(const InstancePtr& insta _communicator(communicator) { } + +IceInternal::ObjectAdapterFactory::~ObjectAdapterFactory() +{ + assert(!_instance); + assert(!_communicator); + assert(_adapters.empty()); +} diff --git a/cpp/src/Ice/ObjectAdapterFactory.h b/cpp/src/Ice/ObjectAdapterFactory.h index e6c8262453f..5473a990c8a 100644 --- a/cpp/src/Ice/ObjectAdapterFactory.h +++ b/cpp/src/Ice/ObjectAdapterFactory.h @@ -17,21 +17,25 @@ #include <Ice/ObjectAdapterI.h> #include <IceUtil/Mutex.h> +#include <IceUtil/Monitor.h> namespace IceInternal { -class ObjectAdapterFactory : public ::IceUtil::Shared, public ::IceUtil::Mutex +class ObjectAdapterFactory : public ::IceUtil::Shared, public ::IceUtil::Monitor< ::IceUtil::Mutex> { public: void shutdown(); + void waitForShutdown(); + ::Ice::ObjectAdapterPtr createObjectAdapter(const std::string&, const std::string&, const std::string&); ::Ice::ObjectAdapterPtr findObjectAdapter(const ::Ice::ObjectPrx&); private: ObjectAdapterFactory(const InstancePtr&, const ::Ice::CommunicatorPtr&); + virtual ~ObjectAdapterFactory(); friend class Instance; InstancePtr _instance; diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index 4a78165d898..5ccbe2a7871 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -46,12 +46,7 @@ Ice::ObjectAdapterI::getCommunicator() { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); return _communicator; } @@ -61,12 +56,7 @@ Ice::ObjectAdapterI::activate() { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); if(!_printAdapterReadyDone) { @@ -120,43 +110,46 @@ Ice::ObjectAdapterI::hold() { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), Ice::voidMemFun(&IncomingConnectionFactory::hold)); } void +Ice::ObjectAdapterI::waitForHold() +{ + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + checkForDeactivation(); + + for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), + Ice::constVoidMemFun(&IncomingConnectionFactory::waitUntilHolding)); +} + +void Ice::ObjectAdapterI::deactivate() { + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + // + // Ignore deactivation requests if the object adapter has already + // been deactivated. + // + if(!_instance) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - - if(!_instance) - { - // - // Ignore deactivation requests if the Object Adapter has - // already been deactivated. - // - return; - } - - for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), - Ice::voidMemFun(&IncomingConnectionFactory::destroy)); - _incomingConnectionFactories.clear(); - - _instance->outgoingConnectionFactory()->removeAdapter(this); - - _instance = 0; - _communicator = 0; + return; } + + for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), + Ice::voidMemFun(&IncomingConnectionFactory::destroy)); + + _instance->outgoingConnectionFactory()->removeAdapter(this); + + _instance = 0; + _communicator = 0; - decUsageCount(); + notifyAll(); } void @@ -164,14 +157,62 @@ Ice::ObjectAdapterI::waitForDeactivate() { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - assert(_usageCount >= 0); - - while(_usageCount > 0) + // + // First we wait for deactivation of the adapter itself, and for + // the return of all direct method calls using this adapter. + // + while(_instance || _directCount > 0) { wait(); } - assert(_usageCount == 0); + // + // Now we wait for until all incoming connection factories are + // finished. + // + for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), + Ice::voidMemFun(&IncomingConnectionFactory::waitUntilFinished)); + + // + // We're done, now we can throw away all incoming connection + // factories. + // + _incomingConnectionFactories.clear(); + + // + // Now it's also time to clean up the active servant map. + // + _activeServantMap.clear(); + _activeServantMapHint = _activeServantMap.end(); + + // + // And the servant locators, too. + // + std::map<std::string, ServantLocatorPtr>::iterator p; + for(p = _locatorMap.begin(); p != _locatorMap.end(); ++p) + { + try + { + p->second->deactivate(); + } + catch(const Exception& ex) + { + Error out(_logger); + out << "exception during locator deactivation:\n" + << "object adapter: `" << _name << "'\n" + << "locator prefix: `" << p->first << "'\n" + << ex; + } + catch(...) + { + Error out(_logger); + out << "unknown exception during locator deactivation:\n" + << "object adapter: `" << _name << "'\n" + << "locator prefix: `" << p->first << "'"; + } + } + _locatorMap.clear(); + _locatorMapHint = _locatorMap.end(); } ObjectPrx @@ -179,16 +220,10 @@ Ice::ObjectAdapterI::add(const ObjectPtr& object, const Identity& ident) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - + checkForDeactivation(); checkIdentity(ident); - if( (_activeServantMapHint != _activeServantMap.end() && _activeServantMapHint->first == ident) + if((_activeServantMapHint != _activeServantMap.end() && _activeServantMapHint->first == ident) || _activeServantMap.find(ident) != _activeServantMap.end()) { AlreadyRegisteredException ex(__FILE__, __LINE__); @@ -207,12 +242,7 @@ Ice::ObjectAdapterI::addWithUUID(const ObjectPtr& object) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); Identity ident; ident.name = IceUtil::generateUUID(); @@ -227,13 +257,7 @@ Ice::ObjectAdapterI::remove(const Identity& ident) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - + checkForDeactivation(); checkIdentity(ident); ObjectDict::iterator p = _activeServantMap.find(ident); @@ -254,14 +278,9 @@ Ice::ObjectAdapterI::addServantLocator(const ServantLocatorPtr& locator, const s { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); - if( (_locatorMapHint != _locatorMap.end() && _locatorMapHint->first == prefix) + if((_locatorMapHint != _locatorMap.end() && _locatorMapHint->first == prefix) || _locatorMap.find(prefix) != _locatorMap.end()) { AlreadyRegisteredException ex(__FILE__, __LINE__); @@ -278,12 +297,7 @@ Ice::ObjectAdapterI::removeServantLocator(const string& prefix) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); map<string, ServantLocatorPtr>::iterator p = _locatorMap.end(); @@ -326,20 +340,7 @@ Ice::ObjectAdapterI::findServantLocator(const string& prefix) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - // - // Don't check whether deactivation has been initiated. This - // operation might be called (e.g., from Incoming or Direct) - // after deactivation has been initiated, but before - // deactivation has been completed. - // - /* - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - */ + checkForDeactivation(); map<string, ServantLocatorPtr>::iterator p = _locatorMap.end(); @@ -372,25 +373,12 @@ Ice::ObjectAdapterI::identityToServant(const Identity& ident) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - // - // Don't check whether deactivation has been initiated. This - // operation might be called (e.g., from Incoming or Direct) - // after deactivation has been initiated, but before - // deactivation has been completed. - // - /* - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - */ + checkForDeactivation(); // - // Don't call checkIdentity. We simply want null to be - // returned (e.g., for Direct, Incoming) in case the identity - // is incorrect and therefore no servant can be found. + // Don't call checkIdentity. We simply want null to returned + // (e.g., for Direct, Incoming) in case the identity is incorrect + // and therefore no servant can be found. // /* checkIdentity(ident); @@ -426,51 +414,33 @@ Ice::ObjectAdapterI::proxyToServant(const ObjectPrx& proxy) ObjectPrx Ice::ObjectAdapterI::createProxy(const Identity& ident) { + IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + + checkForDeactivation(); checkIdentity(ident); - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - return newProxy(ident); } ObjectPrx Ice::ObjectAdapterI::createDirectProxy(const Identity& ident) { - checkIdentity(ident); - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - + checkForDeactivation(); + checkIdentity(ident); + return newDirectProxy(ident); } ObjectPrx Ice::ObjectAdapterI::createReverseProxy(const Identity& ident) { - checkIdentity(ident); - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } - + checkForDeactivation(); + checkIdentity(ident); + // // Create a reference and return a reverse proxy for this reference. // @@ -485,12 +455,7 @@ Ice::ObjectAdapterI::addRouter(const RouterPrx& router) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); RouterInfoPtr routerInfo = _instance->routerManager()->get(router); if(routerInfo) @@ -530,12 +495,7 @@ Ice::ObjectAdapterI::setLocator(const LocatorPrx& locator) { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); _locatorInfo = _instance->locatorManager()->get(locator); } @@ -545,12 +505,7 @@ Ice::ObjectAdapterI::getIncomingConnections() const { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; - throw ex; - } + checkForDeactivation(); list<ConnectionPtr> connections; vector<IncomingConnectionFactoryPtr>::const_iterator p; @@ -563,72 +518,32 @@ Ice::ObjectAdapterI::getIncomingConnections() const } void -Ice::ObjectAdapterI::incUsageCount() +Ice::ObjectAdapterI::incDirectCount() { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - // - // Don't check whether deactivation has been initiated. This - // operation might be called (e.g., from Incoming or Direct) - // after deactivation has been initiated, but before - // deactivation has been completed. - // - /* - assert(_instance); - */ - assert(_usageCount >= 0); - ++_usageCount; + checkForDeactivation(); + + assert(_directCount >= 0); + ++_directCount; } void -Ice::ObjectAdapterI::decUsageCount() +Ice::ObjectAdapterI::decDirectCount() { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); // - // The object adapter may already be deactivated when the usage - // count is decremented, thus no check for prior deactivation, - // i.e., no assert(_instance). + // The object adapter may already have been deactivated when the + // direct count is decremented, thus there is no check for prior + // deactivation. // - assert(_usageCount > 0); - --_usageCount; - if(_usageCount == 0) - { - _activeServantMap.clear(); - _activeServantMapHint = _activeServantMap.end(); - - std::map<std::string, ServantLocatorPtr>::iterator p; - for(p = _locatorMap.begin(); p != _locatorMap.end(); ++p) - { - try - { - p->second->deactivate(); - } - catch(const Exception& ex) - { - Error out(_logger); - out << "exception during locator deactivation:\n" - << "object adapter: `" << _name << "'\n" - << "locator prefix: `" << p->first << "'\n" - << ex; - } - catch(...) - { - Error out(_logger); - out << "unknown exception during locator deactivation:\n" - << "object adapter: `" << _name << "'\n" - << "locator prefix: `" << p->first << "'"; - } - } -// for_each(_locatorMap.begin(), _locatorMap.end(), -// Ice::secondVoidMemFun<string, ServantLocator>(&ServantLocator::deactivate)); - _locatorMap.clear(); - _locatorMapHint = _locatorMap.end(); - _logger = 0; - + assert(_directCount > 0); + if(--_directCount == 0) + { notifyAll(); - } + } } Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const CommunicatorPtr& communicator, @@ -641,7 +556,7 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica _logger(instance->logger()), _activeServantMapHint(_activeServantMap.end()), _locatorMapHint(_locatorMap.end()), - _usageCount(1) + _directCount(0) { string s(endpts); transform(s.begin(), s.end(), s.begin(), ::tolower); @@ -683,7 +598,7 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica EndpointPtr endp = _instance->endpointFactoryManager()->create(es); _incomingConnectionFactories.push_back(new IncomingConnectionFactory(instance, endp, this)); - end = end + 1; + ++end; } } catch(...) @@ -697,18 +612,19 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica Ice::ObjectAdapterI::~ObjectAdapterI() { - assert(_usageCount == 0); - - if(_instance) - { - Warning out(_instance->logger()); - out << "object adapter has not been deactivated"; - } + assert(!_instance); + assert(!_communicator); + assert(_incomingConnectionFactories.empty()); + assert(_activeServantMap.empty()); + assert(_locatorMap.empty()); + assert(_directCount == 0); } ObjectPrx Ice::ObjectAdapterI::newProxy(const Identity& ident) const { + checkForDeactivation(); + if(_id.empty()) { return newDirectProxy(ident); @@ -732,6 +648,8 @@ Ice::ObjectAdapterI::newProxy(const Identity& ident) const ObjectPrx Ice::ObjectAdapterI::newDirectProxy(const Identity& ident) const { + checkForDeactivation(); + vector<EndpointPtr> endpoints; // @@ -760,20 +678,11 @@ Ice::ObjectAdapterI::newDirectProxy(const Identity& ident) const } -void -Ice::ObjectAdapterI::checkIdentity(const Identity& ident) -{ - if(ident.name.size() == 0) - { - IllegalIdentityException e(__FILE__, __LINE__); - e.id = ident; - throw e; - } -} - bool Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const { + checkForDeactivation(); + ReferencePtr ref = proxy->__reference(); vector<EndpointPtr>::const_iterator p; @@ -822,3 +731,25 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const return false; } + +void +Ice::ObjectAdapterI::checkForDeactivation() const +{ + if(!_instance) + { + ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); + ex.name = _name; + throw ex; + } +} + +void +Ice::ObjectAdapterI::checkIdentity(const Identity& ident) +{ + if(ident.name.size() == 0) + { + IllegalIdentityException e(__FILE__, __LINE__); + e.id = ident; + throw e; + } +} diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h index 1c5e01b9fca..6cffdd4a92f 100644 --- a/cpp/src/Ice/ObjectAdapterI.h +++ b/cpp/src/Ice/ObjectAdapterI.h @@ -17,6 +17,7 @@ #include <IceUtil/Shared.h> #include <IceUtil/Mutex.h> +#include <IceUtil/Monitor.h> #include <Ice/ObjectAdapter.h> #include <Ice/InstanceF.h> #include <Ice/ObjectAdapterFactoryF.h> @@ -44,6 +45,7 @@ public: virtual void activate(); virtual void hold(); + virtual void waitForHold(); virtual void deactivate(); virtual void waitForDeactivate(); @@ -67,8 +69,8 @@ public: virtual void setLocator(const LocatorPrx&); std::list< ::IceInternal::ConnectionPtr> getIncomingConnections() const; - void incUsageCount(); - void decUsageCount(); + void incDirectCount(); + void decDirectCount(); private: @@ -79,15 +81,16 @@ private: ObjectPrx newProxy(const Identity&) const; ObjectPrx newDirectProxy(const Identity&) const; - static void checkIdentity(const Identity&); bool isLocal(const ObjectPrx&) const; + void checkForDeactivation() const; + static void checkIdentity(const Identity&); ::IceInternal::InstancePtr _instance; CommunicatorPtr _communicator; bool _printAdapterReadyDone; - std::string _name; - std::string _id; - LoggerPtr _logger; + const std::string _name; + const std::string _id; + const LoggerPtr _logger; ObjectDict _activeServantMap; ObjectDict::iterator _activeServantMapHint; std::map<std::string, ServantLocatorPtr> _locatorMap; @@ -96,8 +99,7 @@ private: std::vector< ::IceInternal::EndpointPtr> _routerEndpoints; IceUtil::Mutex _routerEndpointsMutex; ::IceInternal::LocatorInfoPtr _locatorInfo; - int _usageCount; - static const char * const _kindOfObject; + int _directCount; // The number of direct proxies dispatching on this object adapter. }; } diff --git a/cpp/src/Ice/OutgoingAsync.cpp b/cpp/src/Ice/OutgoingAsync.cpp index 2fad7d86c0a..28cc5f85b12 100644 --- a/cpp/src/Ice/OutgoingAsync.cpp +++ b/cpp/src/Ice/OutgoingAsync.cpp @@ -79,14 +79,14 @@ IceInternal::OutgoingAsync::__setup(const ConnectionPtr& connection, const Refer void IceInternal::OutgoingAsync::__invoke() { - _connection->incUsageCount(); + _connection->incProxyCount(); try { _connection->sendAsyncRequest(this, _compress); } catch(...) { - _connection->decUsageCount(); + _connection->decProxyCount(); throw; } } @@ -190,23 +190,23 @@ IceInternal::OutgoingAsync::__finished(BasicStream& is) catch(const Exception& ex) { warnException(ex); - _connection->decUsageCount(); + _connection->decProxyCount(); return; } catch(const std::exception& ex) { warnException(ex); - _connection->decUsageCount(); + _connection->decProxyCount(); return; } catch(...) { warnException(); - _connection->decUsageCount(); + _connection->decProxyCount(); return; } - _connection->decUsageCount(); + _connection->decProxyCount(); } void @@ -219,23 +219,23 @@ IceInternal::OutgoingAsync::__finished(const LocalException& ex) catch(const Exception& ex) { warnException(ex); - _connection->decUsageCount(); + _connection->decProxyCount(); return; } catch(const std::exception& ex) { warnException(ex); - _connection->decUsageCount(); + _connection->decProxyCount(); return; } catch(...) { warnException(ex); - _connection->decUsageCount(); + _connection->decProxyCount(); return; } - _connection->decUsageCount(); + _connection->decProxyCount(); } BasicStream* diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp index 445fe90237d..a369a9b1f16 100644 --- a/cpp/src/Ice/Proxy.cpp +++ b/cpp/src/Ice/Proxy.cpp @@ -768,7 +768,7 @@ IceDelegateM::Ice::Object::~Object() { if(__connection) { - __connection->decUsageCount(); + __connection->decProxyCount(); } } @@ -901,12 +901,12 @@ IceDelegateM::Ice::Object::__copyFrom(const ::IceInternal::Handle< ::IceDelegate if(from->__connection) { - from->__connection->incUsageCount(); + from->__connection->incProxyCount(); } if(__connection) { - __connection->decUsageCount(); + __connection->decProxyCount(); } __connection = from->__connection; @@ -954,7 +954,7 @@ IceDelegateM::Ice::Object::setup(const ReferencePtr& ref) } assert(p != connections.end()); __connection = *p; - __connection->incUsageCount(); + __connection->incProxyCount(); } else { @@ -994,7 +994,7 @@ IceDelegateM::Ice::Object::setup(const ReferencePtr& ref) OutgoingConnectionFactoryPtr factory = __reference->instance->outgoingConnectionFactory(); __connection = factory->create(filteredEndpoints); assert(__connection); - __connection->incUsageCount(); + __connection->incProxyCount(); } catch(const LocalException& ex) { diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp index f5d947d9117..d33e51fea03 100644 --- a/cpp/src/Ice/ThreadPool.cpp +++ b/cpp/src/Ice/ThreadPool.cpp @@ -33,8 +33,7 @@ void IceInternal::decRef(ThreadPool* p) { p->__decRef(); } void IceInternal::ThreadPool::_register(SOCKET fd, const EventHandlerPtr& handler) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - ++_handlers; + IceUtil::Mutex::Lock sync(*this); _changes.push_back(make_pair(fd, handler)); setInterrupt(0); } @@ -42,7 +41,7 @@ IceInternal::ThreadPool::_register(SOCKET fd, const EventHandlerPtr& handler) void IceInternal::ThreadPool::unregister(SOCKET fd) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); _changes.push_back(make_pair(fd, EventHandlerPtr(0))); setInterrupt(0); } @@ -67,28 +66,6 @@ IceInternal::ThreadPool::initiateShutdown() } void -IceInternal::ThreadPool::waitUntilFinished() -{ - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - - while(_handlers != 0 && _threadNum != 0) - { - wait(); - } - - if(_handlers != 0) - { - Error out(_instance->logger()); - out << "can't wait for graceful application termination in thread pool\n" - << "since all threads have vanished"; - } - else - { - assert(_handlerMap.empty()); - } -} - -void IceInternal::ThreadPool::joinWithAllThreads() { // @@ -107,7 +84,6 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, bool server) : _instance(instance), _destroyed(false), _lastFd(INVALID_SOCKET), - _handlers(0), _timeout(0), _multipleThreads(false) { @@ -122,22 +98,23 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, bool server) : _maxFd = _fdIntrRead; _minFd = _fdIntrRead; + int threadNum; if(server) { _timeout = _instance->properties()->getPropertyAsInt("Ice.ServerIdleTime"); - _threadNum = _instance->properties()->getPropertyAsIntWithDefault("Ice.ThreadPool.Server.Size", 10); + threadNum = _instance->properties()->getPropertyAsIntWithDefault("Ice.ThreadPool.Server.Size", 10); } else { - _threadNum = _instance->properties()->getPropertyAsIntWithDefault("Ice.ThreadPool.Client.Size", 1); + threadNum = _instance->properties()->getPropertyAsIntWithDefault("Ice.ThreadPool.Client.Size", 1); } - if(_threadNum < 1) + if(threadNum < 1) { - _threadNum = 1; + threadNum = 1; } - if(_threadNum > 1) + if(threadNum > 1) { _multipleThreads = true; } @@ -145,7 +122,7 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, bool server) : __setNoDelete(true); try { - for(int i = 0 ; i < _threadNum ; ++i) + for(int i = 0 ; i < threadNum ; ++i) { IceUtil::ThreadPtr thread = new EventHandlerThread(this); _threads.push_back(thread->start()); @@ -181,7 +158,7 @@ IceInternal::ThreadPool::~ThreadPool() void IceInternal::ThreadPool::destroy() { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); assert(!_destroyed); _destroyed = true; setInterrupt(0); @@ -259,33 +236,16 @@ void IceInternal::ThreadPool::run() { ThreadPoolPtr self = this; - bool shutdown = false; while(true) { if(_multipleThreads) { - _threadMutex.lock(); + _threadMutex.lock(); } repeatSelect: - // - // We must shut down the object adapter factory. We cannot do - // this in initiateShutdown(), because this method must be - // signal safe. We also cannot do this within the - // synchronization of this object, so we do it here. - // - if(shutdown) - { - shutdown = false; - ObjectAdapterFactoryPtr factory = _instance->objectAdapterFactory(); - if(factory) - { - factory->shutdown(); - } - } - fd_set fdSet; memcpy(&fdSet, &_fdSet, sizeof(fd_set)); int ret; @@ -301,11 +261,11 @@ IceInternal::ThreadPool::run() ret = ::select(_maxFd + 1, &fdSet, 0, 0, 0); } - if(ret == 0) // Timeout. + if(ret == 0) // We initiate a shutdown if there is a thread pool timeout. { assert(_timeout); _timeout = 0; - shutdown = true; + initiateShutdown(); goto repeatSelect; } @@ -323,9 +283,10 @@ IceInternal::ThreadPool::run() EventHandlerPtr handler; bool finished = false; + bool shutdown = false; { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); if(FD_ISSET(_fdIntrRead, &fdSet)) { @@ -353,48 +314,43 @@ IceInternal::ThreadPool::run() shutdown = clearInterrupt(); - // - // Server shutdown? - // - if(shutdown) - { - goto repeatSelect; - } - - // - // An event handler must have been registered or - // unregistered. - // - assert(!_changes.empty()); - pair<SOCKET, EventHandlerPtr> change = _changes.front(); - _changes.pop_front(); - - if(change.second) // Addition if handler is set. + if(!shutdown) { - _handlerMap.insert(change); - FD_SET(change.first, &_fdSet); - _maxFd = max(_maxFd, change.first); - _minFd = min(_minFd, change.first); - goto repeatSelect; - } - else // Removal if handler is not set. - { - map<SOCKET, EventHandlerPtr>::iterator p = _handlerMap.find(change.first); - assert(p != _handlerMap.end()); - handler = p->second; - finished = true; - _handlerMap.erase(p); - FD_CLR(change.first, &_fdSet); - _maxFd = _fdIntrRead; - _minFd = _fdIntrRead; - if(!_handlerMap.empty()) + // + // An event handler must have been registered or + // unregistered. + // + assert(!_changes.empty()); + pair<SOCKET, EventHandlerPtr> change = _changes.front(); + _changes.pop_front(); + + if(change.second) // Addition if handler is set. + { + _handlerMap.insert(change); + FD_SET(change.first, &_fdSet); + _maxFd = max(_maxFd, change.first); + _minFd = min(_minFd, change.first); + goto repeatSelect; + } + else // Removal if handler is not set. { - _maxFd = max(_maxFd, (--_handlerMap.end())->first); - _minFd = min(_minFd, _handlerMap.begin()->first); + map<SOCKET, EventHandlerPtr>::iterator p = _handlerMap.find(change.first); + assert(p != _handlerMap.end()); + handler = p->second; + finished = true; + _handlerMap.erase(p); + FD_CLR(change.first, &_fdSet); + _maxFd = _fdIntrRead; + _minFd = _fdIntrRead; + if(!_handlerMap.empty()) + { + _maxFd = max(_maxFd, (--_handlerMap.end())->first); + _minFd = min(_minFd, _handlerMap.begin()->first); + } + // Don't goto repeatSelect; we have to call + // finished() on the event handler below, outside + // the thread synchronization. } - // Don't goto repeatSelect; we have to call - // finished() on the event handler below, outside - // the thread synchronization. } } else @@ -481,60 +437,73 @@ IceInternal::ThreadPool::run() } } - assert(handler); + assert(handler || shutdown); - if(finished) + if(shutdown) { // - // Notify a handler about it's removal from the thread - // pool. + // Initiate server shutdown. // - try - { - handler->finished(self); // "self" is faster than "this", as the reference count is not modified. - } - catch(const LocalException& ex) - { - Error out(_instance->logger()); - out << "exception while calling finished():\n" << ex << '\n' << handler->toString(); - } - + ObjectAdapterFactoryPtr factory = _instance->objectAdapterFactory(); + if(factory) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - assert(_handlers > 0); - if(--_handlers == 0) - { - notifyAll(); // For waitUntilFinished(). - } + promoteFollower(); + factory->shutdown(); } } else { - // - // If the handler is "readable", try to read a message. - // - BasicStream stream(_instance); - if(handler->readable()) + assert(handler); + + if(finished) { + // + // Notify a handler about it's removal from the thread + // pool. + // try { - read(handler); - } - catch(const TimeoutException&) // Expected. - { - goto repeatSelect; + handler->finished(self); // "self" is faster than "this", as the reference count is not modified. } catch(const LocalException& ex) { - handler->exception(ex); - goto repeatSelect; + Error out(_instance->logger()); + out << "exception while calling finished():\n" << ex << '\n' << handler->toString(); } - - stream.swap(handler->_stream); - assert(stream.i == stream.b.end()); } + else + { + // + // If the handler is "readable", try to read a + // message. + // + BasicStream stream(_instance); + if(handler->readable()) + { + try + { + read(handler); + } + catch(const TimeoutException&) // Expected. + { + goto repeatSelect; + } + catch(const LocalException& ex) + { + handler->exception(ex); + goto repeatSelect; + } + + stream.swap(handler->_stream); + assert(stream.i == stream.b.end()); + } - handler->message(stream, self); // "self" is faster than "this", as the reference count is not modified. + // + // "self" is faster than "this", as the reference + // count is not modified. + // + handler->message(stream, self); + } } } } @@ -619,25 +588,6 @@ IceInternal::ThreadPool::EventHandlerThread::run() out << "unknown exception in thread pool"; } - { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*_pool.get()); - --_pool->_threadNum; - assert(_pool->_threadNum >= 0); - - // - // The notifyAll() shouldn't be needed, *except* if one of the - // threads exits because of an exception. (Which is an error - // condition in Ice and if it happens needs to be debugged.) - // However, I call notifyAll() anyway, in all cases, using a - // "defensive" programming approach when it comes to - // multithreading. - // - if(_pool->_threadNum == 0) - { - _pool->notifyAll(); // For waitUntil...Finished() methods. - } - } - _pool->promoteFollower(); _pool = 0; // Break cyclic dependency. } diff --git a/cpp/src/Ice/ThreadPool.h b/cpp/src/Ice/ThreadPool.h index 133d6b16696..9860d06ffc7 100644 --- a/cpp/src/Ice/ThreadPool.h +++ b/cpp/src/Ice/ThreadPool.h @@ -17,7 +17,6 @@ #include <IceUtil/Shared.h> #include <IceUtil/Mutex.h> -#include <IceUtil/Monitor.h> #include <IceUtil/Thread.h> #include <Ice/ThreadPoolF.h> @@ -36,7 +35,7 @@ namespace IceInternal class BasicStream; -class ThreadPool : public ::IceUtil::Shared, public IceUtil::Monitor<IceUtil::Mutex> +class ThreadPool : public ::IceUtil::Shared, public IceUtil::Mutex { public: @@ -44,7 +43,6 @@ public: void unregister(SOCKET); void promoteFollower(); void initiateShutdown(); // Signal-safe shutdown initiation. - void waitUntilFinished(); void joinWithAllThreads(); private: @@ -70,7 +68,6 @@ private: fd_set _fdSet; std::list<std::pair<SOCKET, EventHandlerPtr> > _changes; // Event handler set for addition; null for removal. std::map<SOCKET, EventHandlerPtr> _handlerMap; - int _handlers; int _timeout; ::IceUtil::Mutex _threadMutex; bool _multipleThreads; @@ -89,7 +86,6 @@ private: friend class EventHandlerThread; std::vector<IceUtil::ThreadControl> _threads; // Control for all threads, running or not. - int _threadNum; // Number of running threads. }; } diff --git a/cpp/src/Ice/TraceUtil.cpp b/cpp/src/Ice/TraceUtil.cpp index cf01b7390d6..fb1f148737b 100644 --- a/cpp/src/Ice/TraceUtil.cpp +++ b/cpp/src/Ice/TraceUtil.cpp @@ -217,10 +217,13 @@ IceInternal::traceBatchRequest(const char* heading, const BasicStream& str, cons s << heading; printHeader(s, stream); - int cnt = 0; - while(stream.i != stream.b.end()) + Int batchRequestNum; + stream.read(batchRequestNum); + s << "\nnumber of requests = " << batchRequestNum; + + while(batchRequestNum) { - s << "\nrequest #" << cnt++ << ':'; + s << "\nrequest #" << batchRequestNum-- << ':'; printRequestHeader(s, stream); stream.skipEncaps(); } diff --git a/cpp/test/Ice/adapterDeactivation/AllTests.cpp b/cpp/test/Ice/adapterDeactivation/AllTests.cpp index c23f0dd90a5..e9344409fb0 100644 --- a/cpp/test/Ice/adapterDeactivation/AllTests.cpp +++ b/cpp/test/Ice/adapterDeactivation/AllTests.cpp @@ -37,5 +37,16 @@ allTests(const CommunicatorPtr& communicator) obj->deactivate(); cout << "ok" << endl; + cout << "testing whether server is gone... " << flush; + try + { + obj->ice_ping(); + test(false); + } + catch(const LocalException&) + { + cout << "ok" << endl; + } + return obj; } diff --git a/cpp/test/Ice/adapterDeactivation/Client.cpp b/cpp/test/Ice/adapterDeactivation/Client.cpp index 5f5f7753831..35f920af47e 100644 --- a/cpp/test/Ice/adapterDeactivation/Client.cpp +++ b/cpp/test/Ice/adapterDeactivation/Client.cpp @@ -38,17 +38,5 @@ TestClient::run(int argc, char* argv[]) { TestPrx allTests(const CommunicatorPtr&); TestPrx obj = allTests(communicator()); - - cout << "testing whether server is gone... " << flush; - try - { - obj->ice_ping(); - test(false); - } - catch(const LocalException&) - { - cout << "ok" << endl; - } - return EXIT_SUCCESS; } diff --git a/cpp/test/Ice/adapterDeactivation/Collocated.cpp b/cpp/test/Ice/adapterDeactivation/Collocated.cpp index 4082a6345bb..2a1e47a371a 100644 --- a/cpp/test/Ice/adapterDeactivation/Collocated.cpp +++ b/cpp/test/Ice/adapterDeactivation/Collocated.cpp @@ -43,18 +43,7 @@ TestServer::run(int argc, char* argv[]) adapter->addServantLocator(locator, ""); TestPrx allTests(const CommunicatorPtr&); - TestPrx obj = allTests(communicator()); - - cout << "testing whether server is gone... " << flush; - try - { - obj->ice_ping(); - test(false); - } - catch(const LocalException&) - { - cout << "ok" << endl; - } + allTests(communicator()); adapter->waitForDeactivate(); return EXIT_SUCCESS; diff --git a/cpp/test/Ice/exceptions/AllTests.cpp b/cpp/test/Ice/exceptions/AllTests.cpp index 0c800ad3fe1..dd630b29bb4 100644 --- a/cpp/test/Ice/exceptions/AllTests.cpp +++ b/cpp/test/Ice/exceptions/AllTests.cpp @@ -672,13 +672,14 @@ typedef ::IceUtil::Handle< ::AMI_WrongOperation_noSuchOperationI> AMI_WrongOpera ThrowerPrx allTests(const Ice::CommunicatorPtr& communicator, bool collocated) { - cout << "testing AlreadyRegisteredException and NotRegisteredException for servant... " << flush; + cout << "testing servant registration exceptions... " << flush; { Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter("TestAdapter1"); Ice::ObjectPtr obj = new EmptyI; adapter->add(obj, Ice::stringToIdentity("x")); bool gotException = false; - try { + try + { adapter->add(obj, Ice::stringToIdentity("x")); } catch(const Ice::AlreadyRegisteredException&) @@ -689,7 +690,8 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) gotException = false; adapter->remove(Ice::stringToIdentity("x")); - try { + try + { adapter->remove(Ice::stringToIdentity("x")); } catch(const Ice::NotRegisteredException&) @@ -702,13 +704,14 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) } cout << "ok" << endl; - cout << "testing AlreadyRegisteredException and NotRegisteredException for servant locator... " << flush; + cout << "testing servant locator registrations exceptions... " << flush; { Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter("TestAdapter2"); Ice::ServantLocatorPtr loc = new ServantLocatorI; adapter->addServantLocator(loc, "x"); bool gotException = false; - try { + try + { adapter->addServantLocator(loc, "x"); } catch(const Ice::AlreadyRegisteredException&) @@ -719,7 +722,8 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) gotException = false; adapter->removeServantLocator("x"); - try { + try + { adapter->removeServantLocator("x"); } catch(const Ice::NotRegisteredException&) @@ -732,12 +736,13 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) } cout << "ok" << endl; - cout << "testing AlreadyRegisteredException and NotRegisteredException for object factory... " << flush; + cout << "testing object factory registration exceptions... " << flush; { Ice::ObjectFactoryPtr of = new ObjectFactoryI; communicator->addObjectFactory(of, "x"); bool gotException = false; - try { + try + { communicator->addObjectFactory(of, "x"); } catch(const Ice::AlreadyRegisteredException&) @@ -748,7 +753,8 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) gotException = false; communicator->removeObjectFactory("x"); - try { + try + { communicator->removeObjectFactory("x"); } catch(const Ice::NotRegisteredException&) @@ -759,12 +765,13 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) } cout << "ok" << endl; - cout << "testing AlreadyRegisteredException and NotRegisteredException for user exception factory... " << flush; + cout << "testing user exception factory registration exceptions... " << flush; { Ice::UserExceptionFactoryPtr f = new MyExceptionFactory; communicator->addUserExceptionFactory(f, "::x"); bool gotException = false; - try { + try + { communicator->addUserExceptionFactory(f, "::x"); } catch(const Ice::AlreadyRegisteredException&) @@ -775,7 +782,8 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) gotException = false; communicator->removeUserExceptionFactory("::x"); - try { + try + { communicator->removeUserExceptionFactory("::x"); } catch(const Ice::NotRegisteredException&) |