zeroc-ice 3.6b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ICE_LICENSE +54 -0
- data/LICENSE +339 -0
- data/bin/slice2rb +17 -0
- data/ext/Communicator.cpp +596 -0
- data/ext/Communicator.h +25 -0
- data/ext/Config.h +111 -0
- data/ext/Connection.cpp +381 -0
- data/ext/Connection.h +26 -0
- data/ext/Endpoint.cpp +311 -0
- data/ext/Endpoint.h +27 -0
- data/ext/ImplicitContext.cpp +152 -0
- data/ext/ImplicitContext.h +25 -0
- data/ext/Init.cpp +52 -0
- data/ext/Logger.cpp +151 -0
- data/ext/Logger.h +28 -0
- data/ext/ObjectFactory.cpp +140 -0
- data/ext/ObjectFactory.h +50 -0
- data/ext/Operation.cpp +676 -0
- data/ext/Operation.h +36 -0
- data/ext/Properties.cpp +369 -0
- data/ext/Properties.h +25 -0
- data/ext/Proxy.cpp +1354 -0
- data/ext/Proxy.h +27 -0
- data/ext/Slice.cpp +223 -0
- data/ext/Slice.h +22 -0
- data/ext/Types.cpp +3160 -0
- data/ext/Types.h +545 -0
- data/ext/Util.cpp +792 -0
- data/ext/Util.h +511 -0
- data/ext/extconf.rb +118 -0
- data/ext/ice/BZIP_LICENSE +42 -0
- data/ext/ice/MCPP_LICENSE +36 -0
- data/ext/ice/bzip2/blocksort.c +1094 -0
- data/ext/ice/bzip2/bzlib.c +1572 -0
- data/ext/ice/bzip2/bzlib.h +282 -0
- data/ext/ice/bzip2/bzlib_private.h +509 -0
- data/ext/ice/bzip2/compress.c +672 -0
- data/ext/ice/bzip2/crctable.c +104 -0
- data/ext/ice/bzip2/decompress.c +646 -0
- data/ext/ice/bzip2/huffman.c +205 -0
- data/ext/ice/bzip2/randtable.c +84 -0
- data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
- data/ext/ice/cpp/include/Ice/Application.h +156 -0
- data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
- data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
- data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
- data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
- data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
- data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
- data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/Config.h +97 -0
- data/ext/ice/cpp/include/Ice/Connection.h +495 -0
- data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
- data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
- data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
- data/ext/ice/cpp/include/Ice/Current.h +94 -0
- data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
- data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
- data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
- data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
- data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
- data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
- data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
- data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
- data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
- data/ext/ice/cpp/include/Ice/Exception.h +114 -0
- data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
- data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
- data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
- data/ext/ice/cpp/include/Ice/Format.h +39 -0
- data/ext/ice/cpp/include/Ice/Functional.h +138 -0
- data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
- data/ext/ice/cpp/include/Ice/Handle.h +192 -0
- data/ext/ice/cpp/include/Ice/Ice.h +54 -0
- data/ext/ice/cpp/include/Ice/Identity.h +160 -0
- data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
- data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
- data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
- data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
- data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
- data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
- data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
- data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
- data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
- data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
- data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
- data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
- data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
- data/ext/ice/cpp/include/Ice/Logger.h +94 -0
- data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
- data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
- data/ext/ice/cpp/include/Ice/Makefile +26 -0
- data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
- data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
- data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
- data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
- data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
- data/ext/ice/cpp/include/Ice/Object.h +165 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
- data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
- data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
- data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
- data/ext/ice/cpp/include/Ice/Process.h +568 -0
- data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
- data/ext/ice/cpp/include/Ice/Properties.h +130 -0
- data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
- data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
- data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
- data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
- data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
- data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
- data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
- data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
- data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
- data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
- data/ext/ice/cpp/include/Ice/Router.h +1155 -0
- data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
- data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
- data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/Service.h +260 -0
- data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
- data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
- data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
- data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
- data/ext/ice/cpp/include/Ice/Stream.h +449 -0
- data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
- data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
- data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
- data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
- data/ext/ice/cpp/include/Ice/Version.h +254 -0
- data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
- data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
- data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
- data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
- data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
- data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
- data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
- data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
- data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
- data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
- data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
- data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
- data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
- data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
- data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
- data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
- data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
- data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
- data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
- data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
- data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
- data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
- data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
- data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
- data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
- data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
- data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
- data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
- data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
- data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
- data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
- data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
- data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
- data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
- data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
- data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
- data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
- data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
- data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
- data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
- data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
- data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
- data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
- data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
- data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
- data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
- data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
- data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
- data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
- data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
- data/ext/ice/cpp/include/Slice/Makefile +26 -0
- data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
- data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
- data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
- data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
- data/ext/ice/cpp/include/Slice/Util.h +33 -0
- data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
- data/ext/ice/cpp/src/Ice/ACM.h +117 -0
- data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
- data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
- data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
- data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
- data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
- data/ext/ice/cpp/src/Ice/Base64.h +36 -0
- data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
- data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
- data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
- data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
- data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
- data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
- data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
- data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Connector.h +36 -0
- data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
- data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
- data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
- data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
- data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
- data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
- data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
- data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
- data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
- data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
- data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
- data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
- data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
- data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
- data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
- data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
- data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
- data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
- data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
- data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
- data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
- data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
- data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
- data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
- data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
- data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
- data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
- data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
- data/ext/ice/cpp/src/Ice/Instance.h +198 -0
- data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
- data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
- data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
- data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
- data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
- data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
- data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
- data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
- data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
- data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
- data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
- data/ext/ice/cpp/src/Ice/Makefile +190 -0
- data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
- data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
- data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
- data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
- data/ext/ice/cpp/src/Ice/Network.h +291 -0
- data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
- data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
- data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
- data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
- data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
- data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
- data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
- data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
- data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
- data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
- data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
- data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
- data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
- data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
- data/ext/ice/cpp/src/Ice/Reference.h +305 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
- data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
- data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
- data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
- data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
- data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
- data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
- data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
- data/ext/ice/cpp/src/Ice/Selector.h +231 -0
- data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
- data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
- data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
- data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
- data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
- data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
- data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
- data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
- data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
- data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
- data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
- data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
- data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
- data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
- data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
- data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
- data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
- data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
- data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
- data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
- data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
- data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
- data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
- data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
- data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
- data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
- data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
- data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
- data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
- data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
- data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
- data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
- data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
- data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
- data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
- data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
- data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
- data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
- data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
- data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
- data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
- data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
- data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
- data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
- data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
- data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
- data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
- data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
- data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
- data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
- data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
- data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
- data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
- data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
- data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
- data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
- data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
- data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
- data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
- data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
- data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
- data/ext/ice/cpp/src/Slice/MD5.h +44 -0
- data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
- data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
- data/ext/ice/cpp/src/Slice/Makefile +65 -0
- data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
- data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
- data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
- data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
- data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
- data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
- data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
- data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
- data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
- data/ext/ice/mcpp/config.h.Darwin +227 -0
- data/ext/ice/mcpp/config.h.Linux +227 -0
- data/ext/ice/mcpp/config.h.MINGW +7 -0
- data/ext/ice/mcpp/configed.H +382 -0
- data/ext/ice/mcpp/directive.c +1699 -0
- data/ext/ice/mcpp/eval.c +1673 -0
- data/ext/ice/mcpp/expand.c +2980 -0
- data/ext/ice/mcpp/internal.H +564 -0
- data/ext/ice/mcpp/main.c +1131 -0
- data/ext/ice/mcpp/mbchar.c +869 -0
- data/ext/ice/mcpp/mcpp_lib.h +31 -0
- data/ext/ice/mcpp/mcpp_out.h +13 -0
- data/ext/ice/mcpp/support.c +2811 -0
- data/ext/ice/mcpp/system.H +396 -0
- data/ext/ice/mcpp/system.c +4940 -0
- data/ice.gemspec +41 -0
- data/lib/Glacier2.rb +12 -0
- data/lib/Glacier2/Metrics.rb +99 -0
- data/lib/Glacier2/PermissionsVerifier.rb +168 -0
- data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
- data/lib/Glacier2/Router.rb +141 -0
- data/lib/Glacier2/RouterF.rb +29 -0
- data/lib/Glacier2/SSLInfo.rb +79 -0
- data/lib/Glacier2/Session.rb +470 -0
- data/lib/Ice.rb +659 -0
- data/lib/Ice/BuiltinSequences.rb +64 -0
- data/lib/Ice/Communicator.rb +93 -0
- data/lib/Ice/CommunicatorF.rb +28 -0
- data/lib/Ice/Connection.rb +414 -0
- data/lib/Ice/ConnectionF.rb +36 -0
- data/lib/Ice/Current.rb +152 -0
- data/lib/Ice/Endpoint.rb +265 -0
- data/lib/Ice/EndpointF.rb +52 -0
- data/lib/Ice/EndpointTypes.rb +77 -0
- data/lib/Ice/FacetMap.rb +28 -0
- data/lib/Ice/Identity.rb +70 -0
- data/lib/Ice/ImplicitContext.rb +59 -0
- data/lib/Ice/ImplicitContextF.rb +28 -0
- data/lib/Ice/Instrumentation.rb +425 -0
- data/lib/Ice/InstrumentationF.rb +35 -0
- data/lib/Ice/LocalException.rb +1081 -0
- data/lib/Ice/Locator.rb +314 -0
- data/lib/Ice/LocatorF.rb +34 -0
- data/lib/Ice/Logger.rb +57 -0
- data/lib/Ice/LoggerF.rb +28 -0
- data/lib/Ice/Metrics.rb +696 -0
- data/lib/Ice/ObjectAdapterF.rb +28 -0
- data/lib/Ice/ObjectFactory.rb +53 -0
- data/lib/Ice/ObjectFactoryF.rb +28 -0
- data/lib/Ice/Plugin.rb +87 -0
- data/lib/Ice/PluginF.rb +32 -0
- data/lib/Ice/Process.rb +93 -0
- data/lib/Ice/ProcessF.rb +29 -0
- data/lib/Ice/Properties.rb +65 -0
- data/lib/Ice/PropertiesAdmin.rb +104 -0
- data/lib/Ice/PropertiesF.rb +33 -0
- data/lib/Ice/Router.rb +163 -0
- data/lib/Ice/RouterF.rb +29 -0
- data/lib/Ice/SliceChecksumDict.rb +28 -0
- data/lib/Ice/Version.rb +100 -0
- data/lib/IceBox.rb +10 -0
- data/lib/IceBox/IceBox.rb +272 -0
- data/lib/IceGrid.rb +17 -0
- data/lib/IceGrid/Admin.rb +1076 -0
- data/lib/IceGrid/Descriptor.rb +1505 -0
- data/lib/IceGrid/Exception.rb +401 -0
- data/lib/IceGrid/FileParser.rb +105 -0
- data/lib/IceGrid/Locator.rb +105 -0
- data/lib/IceGrid/Observer.rb +571 -0
- data/lib/IceGrid/Query.rb +168 -0
- data/lib/IceGrid/Registry.rb +120 -0
- data/lib/IceGrid/Session.rb +114 -0
- data/lib/IceGrid/UserAccountMapper.rb +101 -0
- data/lib/IcePatch2.rb +10 -0
- data/lib/IcePatch2/FileInfo.rb +75 -0
- data/lib/IcePatch2/FileServer.rb +141 -0
- data/lib/IceStorm.rb +11 -0
- data/lib/IceStorm/IceStorm.rb +463 -0
- data/lib/IceStorm/Metrics.rb +155 -0
- data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
- data/slice/Freeze/CatalogData.ice +49 -0
- data/slice/Freeze/Connection.ice +111 -0
- data/slice/Freeze/ConnectionF.ice +20 -0
- data/slice/Freeze/DB.ice +37 -0
- data/slice/Freeze/Evictor.ice +339 -0
- data/slice/Freeze/EvictorF.ice +22 -0
- data/slice/Freeze/EvictorStorage.ice +72 -0
- data/slice/Freeze/Exception.ice +100 -0
- data/slice/Freeze/Transaction.ice +57 -0
- data/slice/Freeze/TransactionalEvictor.ice +50 -0
- data/slice/Glacier2/Metrics.ice +77 -0
- data/slice/Glacier2/PermissionsVerifier.ice +105 -0
- data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
- data/slice/Glacier2/Router.ice +178 -0
- data/slice/Glacier2/RouterF.ice +20 -0
- data/slice/Glacier2/SSLInfo.ice +50 -0
- data/slice/Glacier2/Session.ice +273 -0
- data/slice/Ice/BuiltinSequences.ice +48 -0
- data/slice/Ice/Communicator.ice +567 -0
- data/slice/Ice/CommunicatorF.ice +20 -0
- data/slice/Ice/Connection.ice +323 -0
- data/slice/Ice/ConnectionF.ice +22 -0
- data/slice/Ice/Current.ice +160 -0
- data/slice/Ice/Endpoint.ice +227 -0
- data/slice/Ice/EndpointF.ice +32 -0
- data/slice/Ice/EndpointTypes.ice +38 -0
- data/slice/Ice/FacetMap.ice +25 -0
- data/slice/Ice/Identity.ice +59 -0
- data/slice/Ice/ImplicitContext.ice +109 -0
- data/slice/Ice/ImplicitContextF.ice +20 -0
- data/slice/Ice/Instrumentation.ice +499 -0
- data/slice/Ice/InstrumentationF.ice +26 -0
- data/slice/Ice/LocalException.ice +1015 -0
- data/slice/Ice/Locator.ice +227 -0
- data/slice/Ice/LocatorF.ice +21 -0
- data/slice/Ice/Logger.ice +86 -0
- data/slice/Ice/LoggerF.ice +20 -0
- data/slice/Ice/Metrics.ice +422 -0
- data/slice/Ice/ObjectAdapter.ice +673 -0
- data/slice/Ice/ObjectAdapterF.ice +20 -0
- data/slice/Ice/ObjectFactory.ice +60 -0
- data/slice/Ice/ObjectFactoryF.ice +20 -0
- data/slice/Ice/Plugin.ice +117 -0
- data/slice/Ice/PluginF.ice +21 -0
- data/slice/Ice/Process.ice +54 -0
- data/slice/Ice/ProcessF.ice +20 -0
- data/slice/Ice/Properties.ice +228 -0
- data/slice/Ice/PropertiesAdmin.ice +75 -0
- data/slice/Ice/PropertiesF.ice +21 -0
- data/slice/Ice/RemoteLogger.ice +232 -0
- data/slice/Ice/Router.ice +83 -0
- data/slice/Ice/RouterF.ice +20 -0
- data/slice/Ice/ServantLocator.ice +117 -0
- data/slice/Ice/ServantLocatorF.ice +20 -0
- data/slice/Ice/SliceChecksumDict.ice +25 -0
- data/slice/Ice/Version.ice +39 -0
- data/slice/IceBox/IceBox.ice +194 -0
- data/slice/IceDiscovery/IceDiscovery.ice +32 -0
- data/slice/IceGrid/Admin.ice +1578 -0
- data/slice/IceGrid/Descriptor.ice +1079 -0
- data/slice/IceGrid/Discovery.ice +73 -0
- data/slice/IceGrid/Exception.ice +383 -0
- data/slice/IceGrid/FileParser.ice +61 -0
- data/slice/IceGrid/Locator.ice +56 -0
- data/slice/IceGrid/Observer.ice +394 -0
- data/slice/IceGrid/PluginFacade.ice +316 -0
- data/slice/IceGrid/Query.ice +130 -0
- data/slice/IceGrid/Registry.ice +138 -0
- data/slice/IceGrid/Session.ice +124 -0
- data/slice/IceGrid/UserAccountMapper.ice +58 -0
- data/slice/IcePatch2/FileInfo.ice +49 -0
- data/slice/IcePatch2/FileServer.ice +129 -0
- data/slice/IceSSL/ConnectionInfo.ice +34 -0
- data/slice/IceSSL/EndpointInfo.ice +41 -0
- data/slice/IceStorm/IceStorm.ice +405 -0
- data/slice/IceStorm/Metrics.ice +71 -0
- metadata +737 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#ifndef ICE_TCP_ENDPOINT_I_H
|
|
11
|
+
#define ICE_TCP_ENDPOINT_I_H
|
|
12
|
+
|
|
13
|
+
#include <IceUtil/Config.h>
|
|
14
|
+
#include <Ice/IPEndpointI.h>
|
|
15
|
+
#include <Ice/EndpointFactory.h>
|
|
16
|
+
#include <Ice/Network.h> // for IceIternal::Address
|
|
17
|
+
|
|
18
|
+
namespace IceInternal
|
|
19
|
+
{
|
|
20
|
+
|
|
21
|
+
class TcpEndpointI : public IPEndpointI
|
|
22
|
+
{
|
|
23
|
+
public:
|
|
24
|
+
|
|
25
|
+
TcpEndpointI(const ProtocolInstancePtr&, const std::string&, Ice::Int, const Address&, Ice::Int, const std::string&,
|
|
26
|
+
bool);
|
|
27
|
+
TcpEndpointI(const ProtocolInstancePtr&);
|
|
28
|
+
TcpEndpointI(const ProtocolInstancePtr&, BasicStream*);
|
|
29
|
+
|
|
30
|
+
virtual Ice::EndpointInfoPtr getInfo() const;
|
|
31
|
+
|
|
32
|
+
virtual Ice::Int timeout() const;
|
|
33
|
+
virtual EndpointIPtr timeout(Ice::Int) const;
|
|
34
|
+
virtual bool compress() const;
|
|
35
|
+
virtual EndpointIPtr compress(bool) const;
|
|
36
|
+
virtual bool datagram() const;
|
|
37
|
+
virtual bool secure() const;
|
|
38
|
+
|
|
39
|
+
virtual TransceiverPtr transceiver() const;
|
|
40
|
+
virtual AcceptorPtr acceptor(const std::string&) const;
|
|
41
|
+
virtual std::string options() const;
|
|
42
|
+
|
|
43
|
+
virtual bool operator==(const Ice::LocalObject&) const;
|
|
44
|
+
virtual bool operator<(const Ice::LocalObject&) const;
|
|
45
|
+
|
|
46
|
+
TcpEndpointIPtr endpoint(const TcpAcceptorPtr&) const;
|
|
47
|
+
|
|
48
|
+
using IPEndpointI::connectionId;
|
|
49
|
+
|
|
50
|
+
protected:
|
|
51
|
+
|
|
52
|
+
virtual void streamWriteImpl(BasicStream*) const;
|
|
53
|
+
virtual void hashInit(Ice::Int&) const;
|
|
54
|
+
virtual void fillEndpointInfo(Ice::IPEndpointInfo*) const;
|
|
55
|
+
virtual bool checkOption(const std::string&, const std::string&, const std::string&);
|
|
56
|
+
|
|
57
|
+
virtual ConnectorPtr createConnector(const Address&, const NetworkProxyPtr&) const;
|
|
58
|
+
virtual IPEndpointIPtr createEndpoint(const std::string&, int, const std::string&) const;
|
|
59
|
+
|
|
60
|
+
private:
|
|
61
|
+
|
|
62
|
+
//
|
|
63
|
+
// All members are const, because endpoints are immutable.
|
|
64
|
+
//
|
|
65
|
+
const Ice::Int _timeout;
|
|
66
|
+
const bool _compress;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
class TcpEndpointFactory : public EndpointFactory
|
|
70
|
+
{
|
|
71
|
+
public:
|
|
72
|
+
|
|
73
|
+
virtual ~TcpEndpointFactory();
|
|
74
|
+
|
|
75
|
+
virtual Ice::Short type() const;
|
|
76
|
+
virtual std::string protocol() const;
|
|
77
|
+
virtual EndpointIPtr create(std::vector<std::string>&, bool) const;
|
|
78
|
+
virtual EndpointIPtr read(BasicStream*) const;
|
|
79
|
+
virtual void destroy();
|
|
80
|
+
|
|
81
|
+
virtual EndpointFactoryPtr clone(const ProtocolInstancePtr&) const;
|
|
82
|
+
|
|
83
|
+
private:
|
|
84
|
+
|
|
85
|
+
TcpEndpointFactory(const ProtocolInstancePtr&);
|
|
86
|
+
friend class Instance;
|
|
87
|
+
|
|
88
|
+
ProtocolInstancePtr _instance;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#endif
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Ice/TcpTransceiver.h>
|
|
11
|
+
#include <Ice/Connection.h>
|
|
12
|
+
#include <Ice/ProtocolInstance.h>
|
|
13
|
+
#include <Ice/LoggerUtil.h>
|
|
14
|
+
#include <Ice/Buffer.h>
|
|
15
|
+
#include <Ice/LocalException.h>
|
|
16
|
+
|
|
17
|
+
#include <IceUtil/DisableWarnings.h>
|
|
18
|
+
|
|
19
|
+
using namespace std;
|
|
20
|
+
using namespace Ice;
|
|
21
|
+
using namespace IceInternal;
|
|
22
|
+
|
|
23
|
+
NativeInfoPtr
|
|
24
|
+
IceInternal::TcpTransceiver::getNativeInfo()
|
|
25
|
+
{
|
|
26
|
+
return _stream;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
SocketOperation
|
|
30
|
+
IceInternal::TcpTransceiver::initialize(Buffer& readBuffer, Buffer& writeBuffer, bool&)
|
|
31
|
+
{
|
|
32
|
+
return _stream->connect(readBuffer, writeBuffer);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
SocketOperation
|
|
36
|
+
IceInternal::TcpTransceiver::closing(bool initiator, const Ice::LocalException&)
|
|
37
|
+
{
|
|
38
|
+
// If we are initiating the connection closure, wait for the peer
|
|
39
|
+
// to close the TCP/IP connection. Otherwise, close immediately.
|
|
40
|
+
return initiator ? SocketOperationRead : SocketOperationNone;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void
|
|
44
|
+
IceInternal::TcpTransceiver::close()
|
|
45
|
+
{
|
|
46
|
+
_stream->close();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
SocketOperation
|
|
50
|
+
IceInternal::TcpTransceiver::write(Buffer& buf)
|
|
51
|
+
{
|
|
52
|
+
return _stream->write(buf);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
SocketOperation
|
|
56
|
+
IceInternal::TcpTransceiver::read(Buffer& buf, bool&)
|
|
57
|
+
{
|
|
58
|
+
return _stream->read(buf);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#ifdef ICE_USE_IOCP
|
|
62
|
+
bool
|
|
63
|
+
IceInternal::TcpTransceiver::startWrite(Buffer& buf)
|
|
64
|
+
{
|
|
65
|
+
return _stream->startWrite(buf);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void
|
|
69
|
+
IceInternal::TcpTransceiver::finishWrite(Buffer& buf)
|
|
70
|
+
{
|
|
71
|
+
_stream->finishWrite(buf);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
void
|
|
75
|
+
IceInternal::TcpTransceiver::startRead(Buffer& buf)
|
|
76
|
+
{
|
|
77
|
+
_stream->startRead(buf);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void
|
|
81
|
+
IceInternal::TcpTransceiver::finishRead(Buffer& buf, bool&)
|
|
82
|
+
{
|
|
83
|
+
_stream->finishRead(buf);
|
|
84
|
+
}
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
string
|
|
88
|
+
IceInternal::TcpTransceiver::protocol() const
|
|
89
|
+
{
|
|
90
|
+
return _instance->protocol();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
string
|
|
94
|
+
IceInternal::TcpTransceiver::toString() const
|
|
95
|
+
{
|
|
96
|
+
return _stream->toString();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
string
|
|
100
|
+
IceInternal::TcpTransceiver::toDetailedString() const
|
|
101
|
+
{
|
|
102
|
+
return toString();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
Ice::ConnectionInfoPtr
|
|
106
|
+
IceInternal::TcpTransceiver::getInfo() const
|
|
107
|
+
{
|
|
108
|
+
Ice::TCPConnectionInfoPtr info = new Ice::TCPConnectionInfo();
|
|
109
|
+
fdToAddressAndPort(_stream->fd(), info->localAddress, info->localPort, info->remoteAddress, info->remotePort);
|
|
110
|
+
return info;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
void
|
|
114
|
+
IceInternal::TcpTransceiver::checkSendSize(const Buffer&)
|
|
115
|
+
{
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
IceInternal::TcpTransceiver::TcpTransceiver(const ProtocolInstancePtr& instance, const StreamSocketPtr& stream) :
|
|
119
|
+
_instance(instance),
|
|
120
|
+
_stream(stream)
|
|
121
|
+
{
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
IceInternal::TcpTransceiver::~TcpTransceiver()
|
|
125
|
+
{
|
|
126
|
+
}
|
|
127
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#ifndef ICE_TCP_TRANSCEIVER_H
|
|
11
|
+
#define ICE_TCP_TRANSCEIVER_H
|
|
12
|
+
|
|
13
|
+
#include <Ice/ProtocolInstanceF.h>
|
|
14
|
+
#include <Ice/Transceiver.h>
|
|
15
|
+
#include <Ice/Network.h>
|
|
16
|
+
#include <Ice/StreamSocket.h>
|
|
17
|
+
|
|
18
|
+
namespace IceInternal
|
|
19
|
+
{
|
|
20
|
+
|
|
21
|
+
class TcpConnector;
|
|
22
|
+
class TcpAcceptor;
|
|
23
|
+
|
|
24
|
+
class TcpTransceiver : public Transceiver
|
|
25
|
+
{
|
|
26
|
+
public:
|
|
27
|
+
|
|
28
|
+
virtual NativeInfoPtr getNativeInfo();
|
|
29
|
+
|
|
30
|
+
virtual SocketOperation initialize(Buffer&, Buffer&, bool&);
|
|
31
|
+
virtual SocketOperation closing(bool, const Ice::LocalException&);
|
|
32
|
+
virtual void close();
|
|
33
|
+
virtual SocketOperation write(Buffer&);
|
|
34
|
+
virtual SocketOperation read(Buffer&, bool&);
|
|
35
|
+
#ifdef ICE_USE_IOCP
|
|
36
|
+
virtual bool startWrite(Buffer&);
|
|
37
|
+
virtual void finishWrite(Buffer&);
|
|
38
|
+
virtual void startRead(Buffer&);
|
|
39
|
+
virtual void finishRead(Buffer&, bool&);
|
|
40
|
+
#endif
|
|
41
|
+
virtual std::string protocol() const;
|
|
42
|
+
virtual std::string toString() const;
|
|
43
|
+
virtual std::string toDetailedString() const;
|
|
44
|
+
virtual Ice::ConnectionInfoPtr getInfo() const;
|
|
45
|
+
virtual void checkSendSize(const Buffer&);
|
|
46
|
+
|
|
47
|
+
private:
|
|
48
|
+
|
|
49
|
+
TcpTransceiver(const ProtocolInstancePtr&, const StreamSocketPtr&);
|
|
50
|
+
virtual ~TcpTransceiver();
|
|
51
|
+
|
|
52
|
+
friend class TcpConnector;
|
|
53
|
+
friend class TcpAcceptor;
|
|
54
|
+
|
|
55
|
+
const ProtocolInstancePtr _instance;
|
|
56
|
+
const StreamSocketPtr _stream;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#endif
|
|
@@ -0,0 +1,1357 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Ice/ThreadPool.h>
|
|
11
|
+
#include <IceUtil/DisableWarnings.h>
|
|
12
|
+
#include <Ice/EventHandler.h>
|
|
13
|
+
#include <Ice/Network.h>
|
|
14
|
+
#include <Ice/LocalException.h>
|
|
15
|
+
#include <Ice/Instance.h>
|
|
16
|
+
#include <Ice/LoggerUtil.h>
|
|
17
|
+
#include <Ice/Protocol.h>
|
|
18
|
+
#include <Ice/ObjectAdapterFactory.h>
|
|
19
|
+
#include <Ice/Properties.h>
|
|
20
|
+
#include <Ice/TraceLevels.h>
|
|
21
|
+
|
|
22
|
+
#if defined(ICE_OS_WINRT)
|
|
23
|
+
# include <IceUtil/StringConverter.h>
|
|
24
|
+
#endif
|
|
25
|
+
|
|
26
|
+
using namespace std;
|
|
27
|
+
using namespace Ice;
|
|
28
|
+
using namespace Ice::Instrumentation;
|
|
29
|
+
using namespace IceInternal;
|
|
30
|
+
|
|
31
|
+
ICE_DECLSPEC_EXPORT IceUtil::Shared* IceInternal::upCast(ThreadPool* p) { return p; }
|
|
32
|
+
|
|
33
|
+
namespace
|
|
34
|
+
{
|
|
35
|
+
|
|
36
|
+
class ShutdownWorkItem : public ThreadPoolWorkItem
|
|
37
|
+
{
|
|
38
|
+
public:
|
|
39
|
+
|
|
40
|
+
ShutdownWorkItem(const InstancePtr& instance) : _instance(instance)
|
|
41
|
+
{
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
virtual void
|
|
45
|
+
execute(ThreadPoolCurrent& current)
|
|
46
|
+
{
|
|
47
|
+
current.ioCompleted();
|
|
48
|
+
try
|
|
49
|
+
{
|
|
50
|
+
_instance->objectAdapterFactory()->shutdown();
|
|
51
|
+
}
|
|
52
|
+
catch(const CommunicatorDestroyedException&)
|
|
53
|
+
{
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private:
|
|
58
|
+
|
|
59
|
+
const InstancePtr _instance;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
class FinishedWorkItem : public ThreadPoolWorkItem
|
|
63
|
+
{
|
|
64
|
+
public:
|
|
65
|
+
|
|
66
|
+
FinishedWorkItem(const EventHandlerPtr& handler, bool close) : _handler(handler), _close(close)
|
|
67
|
+
{
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
virtual void
|
|
71
|
+
execute(ThreadPoolCurrent& current)
|
|
72
|
+
{
|
|
73
|
+
_handler->finished(current, _close);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private:
|
|
77
|
+
|
|
78
|
+
const EventHandlerPtr _handler;
|
|
79
|
+
const bool _close;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
class JoinThreadWorkItem : public ThreadPoolWorkItem
|
|
83
|
+
{
|
|
84
|
+
public:
|
|
85
|
+
|
|
86
|
+
JoinThreadWorkItem(const IceUtil::ThreadPtr& thread) : _thread(thread)
|
|
87
|
+
{
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
virtual void
|
|
91
|
+
execute(ThreadPoolCurrent&)
|
|
92
|
+
{
|
|
93
|
+
// No call to ioCompleted, this shouldn't block (and we don't want to cause
|
|
94
|
+
// a new thread to be started).
|
|
95
|
+
_thread->getThreadControl().join();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private:
|
|
99
|
+
|
|
100
|
+
IceUtil::ThreadPtr _thread;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
class InterruptWorkItem : public ThreadPoolWorkItem
|
|
104
|
+
{
|
|
105
|
+
public:
|
|
106
|
+
|
|
107
|
+
virtual void
|
|
108
|
+
execute(ThreadPoolCurrent& current)
|
|
109
|
+
{
|
|
110
|
+
// Nothing to do, this is just used to interrupt the thread pool selector.
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
ThreadPoolWorkItemPtr interruptWorkItem;
|
|
114
|
+
|
|
115
|
+
class InterruptWorkItemInit
|
|
116
|
+
{
|
|
117
|
+
public:
|
|
118
|
+
|
|
119
|
+
InterruptWorkItemInit()
|
|
120
|
+
{
|
|
121
|
+
interruptWorkItem = new InterruptWorkItem;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
InterruptWorkItemInit init;
|
|
125
|
+
|
|
126
|
+
//
|
|
127
|
+
// Exception raised by the thread pool work queue when the thread pool
|
|
128
|
+
// is destroyed.
|
|
129
|
+
//
|
|
130
|
+
class ThreadPoolDestroyedException
|
|
131
|
+
{
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
IceInternal::DispatchWorkItem::DispatchWorkItem()
|
|
137
|
+
{
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
IceInternal::DispatchWorkItem::DispatchWorkItem(const Ice::ConnectionPtr& connection) : _connection(connection)
|
|
141
|
+
{
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void
|
|
145
|
+
IceInternal::DispatchWorkItem::execute(ThreadPoolCurrent& current)
|
|
146
|
+
{
|
|
147
|
+
current.ioCompleted(); // Promote follower
|
|
148
|
+
current.dispatchFromThisThread(this);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
IceInternal::ThreadPoolWorkQueue::ThreadPoolWorkQueue(const InstancePtr& instance, Selector& selector) :
|
|
152
|
+
_instance(instance),
|
|
153
|
+
_selector(selector),
|
|
154
|
+
_destroyed(false)
|
|
155
|
+
#ifdef ICE_USE_IOCP
|
|
156
|
+
, _info(SocketOperationRead)
|
|
157
|
+
#endif
|
|
158
|
+
{
|
|
159
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
160
|
+
SOCKET fds[2];
|
|
161
|
+
createPipe(fds);
|
|
162
|
+
_fdIntrRead = fds[0];
|
|
163
|
+
_fdIntrWrite = fds[1];
|
|
164
|
+
|
|
165
|
+
_selector.initialize(this);
|
|
166
|
+
_selector.update(this, SocketOperationNone, SocketOperationRead);
|
|
167
|
+
#endif
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
IceInternal::ThreadPoolWorkQueue::~ThreadPoolWorkQueue()
|
|
171
|
+
{
|
|
172
|
+
assert(_destroyed);
|
|
173
|
+
|
|
174
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
175
|
+
try
|
|
176
|
+
{
|
|
177
|
+
closeSocket(_fdIntrRead);
|
|
178
|
+
}
|
|
179
|
+
catch(const LocalException& ex)
|
|
180
|
+
{
|
|
181
|
+
Error out(_instance->initializationData().logger);
|
|
182
|
+
out << "exception in selector while calling closeSocket():\n" << ex;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
try
|
|
186
|
+
{
|
|
187
|
+
closeSocket(_fdIntrWrite);
|
|
188
|
+
}
|
|
189
|
+
catch(const LocalException& ex)
|
|
190
|
+
{
|
|
191
|
+
Error out(_instance->initializationData().logger);
|
|
192
|
+
out << "exception in selector while calling closeSocket():\n" << ex;
|
|
193
|
+
}
|
|
194
|
+
#endif
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
void
|
|
198
|
+
IceInternal::ThreadPoolWorkQueue::destroy()
|
|
199
|
+
{
|
|
200
|
+
Lock sync(*this);
|
|
201
|
+
assert(!_destroyed);
|
|
202
|
+
_destroyed = true;
|
|
203
|
+
postMessage();
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
void
|
|
207
|
+
IceInternal::ThreadPoolWorkQueue::queue(const ThreadPoolWorkItemPtr& item)
|
|
208
|
+
{
|
|
209
|
+
Lock sync(*this);
|
|
210
|
+
if(_destroyed)
|
|
211
|
+
{
|
|
212
|
+
throw CommunicatorDestroyedException(__FILE__, __LINE__);
|
|
213
|
+
}
|
|
214
|
+
_workItems.push_back(item);
|
|
215
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
216
|
+
if(_workItems.size() == 1)
|
|
217
|
+
{
|
|
218
|
+
postMessage();
|
|
219
|
+
}
|
|
220
|
+
#else
|
|
221
|
+
postMessage();
|
|
222
|
+
#endif
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
#if defined(ICE_USE_IOCP) || defined(ICE_OS_WINRT)
|
|
226
|
+
bool
|
|
227
|
+
IceInternal::ThreadPoolWorkQueue::startAsync(SocketOperation)
|
|
228
|
+
{
|
|
229
|
+
assert(false);
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
bool
|
|
234
|
+
IceInternal::ThreadPoolWorkQueue::finishAsync(SocketOperation)
|
|
235
|
+
{
|
|
236
|
+
assert(false);
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
#endif
|
|
240
|
+
|
|
241
|
+
void
|
|
242
|
+
IceInternal::ThreadPoolWorkQueue::message(ThreadPoolCurrent& current)
|
|
243
|
+
{
|
|
244
|
+
ThreadPoolWorkItemPtr workItem;
|
|
245
|
+
{
|
|
246
|
+
Lock sync(*this);
|
|
247
|
+
if(!_workItems.empty())
|
|
248
|
+
{
|
|
249
|
+
workItem = _workItems.front();
|
|
250
|
+
_workItems.pop_front();
|
|
251
|
+
|
|
252
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
253
|
+
if(_workItems.empty())
|
|
254
|
+
{
|
|
255
|
+
char c;
|
|
256
|
+
while(true)
|
|
257
|
+
{
|
|
258
|
+
ssize_t ret;
|
|
259
|
+
# ifdef _WIN32
|
|
260
|
+
ret = ::recv(_fdIntrRead, &c, 1, 0);
|
|
261
|
+
# else
|
|
262
|
+
ret = ::read(_fdIntrRead, &c, 1);
|
|
263
|
+
# endif
|
|
264
|
+
if(ret == SOCKET_ERROR)
|
|
265
|
+
{
|
|
266
|
+
if(interrupted())
|
|
267
|
+
{
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
SocketException ex(__FILE__, __LINE__);
|
|
272
|
+
ex.error = getSocketErrno();
|
|
273
|
+
throw ex;
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
#endif
|
|
279
|
+
}
|
|
280
|
+
else
|
|
281
|
+
{
|
|
282
|
+
assert(_destroyed);
|
|
283
|
+
#if defined(ICE_USE_IOCP) || defined(ICE_OS_WINRT)
|
|
284
|
+
postMessage();
|
|
285
|
+
#endif
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if(workItem)
|
|
290
|
+
{
|
|
291
|
+
workItem->execute(current);
|
|
292
|
+
}
|
|
293
|
+
else
|
|
294
|
+
{
|
|
295
|
+
current.ioCompleted();
|
|
296
|
+
throw ThreadPoolDestroyedException();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
void
|
|
301
|
+
IceInternal::ThreadPoolWorkQueue::finished(ThreadPoolCurrent&, bool)
|
|
302
|
+
{
|
|
303
|
+
assert(false);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
string
|
|
307
|
+
IceInternal::ThreadPoolWorkQueue::toString() const
|
|
308
|
+
{
|
|
309
|
+
return "work queue";
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
NativeInfoPtr
|
|
313
|
+
IceInternal::ThreadPoolWorkQueue::getNativeInfo()
|
|
314
|
+
{
|
|
315
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
316
|
+
return new NativeInfo(_fdIntrRead);
|
|
317
|
+
#else
|
|
318
|
+
return 0;
|
|
319
|
+
#endif
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
void
|
|
323
|
+
IceInternal::ThreadPoolWorkQueue::postMessage()
|
|
324
|
+
{
|
|
325
|
+
#if defined(ICE_USE_IOCP)
|
|
326
|
+
if(!PostQueuedCompletionStatus(_selector.getIOCPHandle(), 0, reinterpret_cast<ULONG_PTR>(this), &_info))
|
|
327
|
+
{
|
|
328
|
+
SocketException ex(__FILE__, __LINE__);
|
|
329
|
+
ex.error = GetLastError();
|
|
330
|
+
throw ex;
|
|
331
|
+
}
|
|
332
|
+
#elif defined(ICE_OS_WINRT)
|
|
333
|
+
_selector.completed(this, SocketOperationRead);
|
|
334
|
+
#else
|
|
335
|
+
char c = 0;
|
|
336
|
+
while(true)
|
|
337
|
+
{
|
|
338
|
+
# ifdef _WIN32
|
|
339
|
+
if(::send(_fdIntrWrite, &c, 1, 0) == SOCKET_ERROR)
|
|
340
|
+
# else
|
|
341
|
+
if(::write(_fdIntrWrite, &c, 1) == SOCKET_ERROR)
|
|
342
|
+
# endif
|
|
343
|
+
{
|
|
344
|
+
if(interrupted())
|
|
345
|
+
{
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
SocketException ex(__FILE__, __LINE__);
|
|
350
|
+
ex.error = getSocketErrno();
|
|
351
|
+
throw ex;
|
|
352
|
+
}
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
#endif
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& prefix, int timeout) :
|
|
359
|
+
_instance(instance),
|
|
360
|
+
_dispatcher(_instance->initializationData().dispatcher),
|
|
361
|
+
_destroyed(false),
|
|
362
|
+
_prefix(prefix),
|
|
363
|
+
_selector(instance),
|
|
364
|
+
_nextThreadId(0),
|
|
365
|
+
_size(0),
|
|
366
|
+
_sizeIO(0),
|
|
367
|
+
_sizeMax(0),
|
|
368
|
+
_sizeWarn(0),
|
|
369
|
+
_serialize(_instance->initializationData().properties->getPropertyAsInt(_prefix + ".Serialize") > 0),
|
|
370
|
+
_hasPriority(false),
|
|
371
|
+
_priority(0),
|
|
372
|
+
_serverIdleTime(timeout),
|
|
373
|
+
_threadIdleTime(0),
|
|
374
|
+
_stackSize(0),
|
|
375
|
+
_inUse(0),
|
|
376
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
377
|
+
_inUseIO(0),
|
|
378
|
+
_nextHandler(_handlers.end()),
|
|
379
|
+
#endif
|
|
380
|
+
_promote(true)
|
|
381
|
+
{
|
|
382
|
+
PropertiesPtr properties = _instance->initializationData().properties;
|
|
383
|
+
#ifndef ICE_OS_WINRT
|
|
384
|
+
# ifdef _WIN32
|
|
385
|
+
SYSTEM_INFO sysInfo;
|
|
386
|
+
GetSystemInfo(&sysInfo);
|
|
387
|
+
int nProcessors = sysInfo.dwNumberOfProcessors;
|
|
388
|
+
# else
|
|
389
|
+
int nProcessors = static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN));
|
|
390
|
+
# endif
|
|
391
|
+
#endif
|
|
392
|
+
|
|
393
|
+
//
|
|
394
|
+
// We use just one thread as the default. This is the fastest
|
|
395
|
+
// possible setting, still allows one level of nesting, and
|
|
396
|
+
// doesn't require to make the servants thread safe.
|
|
397
|
+
//
|
|
398
|
+
int size = properties->getPropertyAsIntWithDefault(_prefix + ".Size", 1);
|
|
399
|
+
if(size < 1)
|
|
400
|
+
{
|
|
401
|
+
Warning out(_instance->initializationData().logger);
|
|
402
|
+
out << _prefix << ".Size < 1; Size adjusted to 1";
|
|
403
|
+
size = 1;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
int sizeMax = properties->getPropertyAsIntWithDefault(_prefix + ".SizeMax", size);
|
|
407
|
+
#ifndef ICE_OS_WINRT
|
|
408
|
+
if(sizeMax == -1)
|
|
409
|
+
{
|
|
410
|
+
sizeMax = nProcessors;
|
|
411
|
+
}
|
|
412
|
+
#endif
|
|
413
|
+
if(sizeMax < size)
|
|
414
|
+
{
|
|
415
|
+
Warning out(_instance->initializationData().logger);
|
|
416
|
+
out << _prefix << ".SizeMax < " << _prefix << ".Size; SizeMax adjusted to Size (" << size << ")";
|
|
417
|
+
sizeMax = size;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
int sizeWarn = properties->getPropertyAsInt(_prefix + ".SizeWarn");
|
|
421
|
+
if(sizeWarn != 0 && sizeWarn < size)
|
|
422
|
+
{
|
|
423
|
+
Warning out(_instance->initializationData().logger);
|
|
424
|
+
out << _prefix << ".SizeWarn < " << _prefix << ".Size; adjusted SizeWarn to Size (" << size << ")";
|
|
425
|
+
sizeWarn = size;
|
|
426
|
+
}
|
|
427
|
+
else if(sizeWarn > sizeMax)
|
|
428
|
+
{
|
|
429
|
+
Warning out(_instance->initializationData().logger);
|
|
430
|
+
out << _prefix << ".SizeWarn > " << _prefix << ".SizeMax; adjusted SizeWarn to SizeMax (" << sizeMax << ")";
|
|
431
|
+
sizeWarn = sizeMax;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
int threadIdleTime = properties->getPropertyAsIntWithDefault(_prefix + ".ThreadIdleTime", 60);
|
|
435
|
+
if(threadIdleTime < 0)
|
|
436
|
+
{
|
|
437
|
+
Warning out(_instance->initializationData().logger);
|
|
438
|
+
out << _prefix << ".ThreadIdleTime < 0; ThreadIdleTime adjusted to 0";
|
|
439
|
+
threadIdleTime = 0;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const_cast<int&>(_size) = size;
|
|
443
|
+
const_cast<int&>(_sizeMax) = sizeMax;
|
|
444
|
+
const_cast<int&>(_sizeWarn) = sizeWarn;
|
|
445
|
+
#ifndef ICE_OS_WINRT
|
|
446
|
+
const_cast<int&>(_sizeIO) = min(sizeMax, nProcessors);
|
|
447
|
+
#else
|
|
448
|
+
const_cast<int&>(_sizeIO) = sizeMax;
|
|
449
|
+
#endif
|
|
450
|
+
const_cast<int&>(_threadIdleTime) = threadIdleTime;
|
|
451
|
+
|
|
452
|
+
#ifdef ICE_USE_IOCP
|
|
453
|
+
_selector.setup(_sizeIO);
|
|
454
|
+
#endif
|
|
455
|
+
|
|
456
|
+
int stackSize = properties->getPropertyAsInt(_prefix + ".StackSize");
|
|
457
|
+
if(stackSize < 0)
|
|
458
|
+
{
|
|
459
|
+
Warning out(_instance->initializationData().logger);
|
|
460
|
+
out << _prefix << ".StackSize < 0; Size adjusted to OS default";
|
|
461
|
+
stackSize = 0;
|
|
462
|
+
}
|
|
463
|
+
const_cast<size_t&>(_stackSize) = static_cast<size_t>(stackSize);
|
|
464
|
+
|
|
465
|
+
const_cast<bool&>(_hasPriority) = properties->getProperty(_prefix + ".ThreadPriority") != "";
|
|
466
|
+
const_cast<int&>(_priority) = properties->getPropertyAsInt(_prefix + ".ThreadPriority");
|
|
467
|
+
if(!_hasPriority)
|
|
468
|
+
{
|
|
469
|
+
const_cast<bool&>(_hasPriority) = properties->getProperty("Ice.ThreadPriority") != "";
|
|
470
|
+
const_cast<int&>(_priority) = properties->getPropertyAsInt("Ice.ThreadPriority");
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
_workQueue = new ThreadPoolWorkQueue(_instance, _selector);
|
|
474
|
+
|
|
475
|
+
if(_instance->traceLevels()->threadPool >= 1)
|
|
476
|
+
{
|
|
477
|
+
Trace out(_instance->initializationData().logger, _instance->traceLevels()->threadPoolCat);
|
|
478
|
+
out << "creating " << _prefix << ": Size = " << _size << ", SizeMax = " << _sizeMax << ", SizeWarn = "
|
|
479
|
+
<< _sizeWarn;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
__setNoDelete(true);
|
|
483
|
+
try
|
|
484
|
+
{
|
|
485
|
+
for(int i = 0 ; i < _size ; ++i)
|
|
486
|
+
{
|
|
487
|
+
EventHandlerThreadPtr thread = new EventHandlerThread(this, nextThreadId());
|
|
488
|
+
if(_hasPriority)
|
|
489
|
+
{
|
|
490
|
+
thread->start(_stackSize, _priority);
|
|
491
|
+
}
|
|
492
|
+
else
|
|
493
|
+
{
|
|
494
|
+
thread->start(_stackSize);
|
|
495
|
+
}
|
|
496
|
+
_threads.insert(thread);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
catch(const IceUtil::Exception& ex)
|
|
500
|
+
{
|
|
501
|
+
{
|
|
502
|
+
Error out(_instance->initializationData().logger);
|
|
503
|
+
out << "cannot create thread for `" << _prefix << "':\n" << ex;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
destroy();
|
|
507
|
+
joinWithAllThreads();
|
|
508
|
+
__setNoDelete(false);
|
|
509
|
+
throw;
|
|
510
|
+
}
|
|
511
|
+
catch(...)
|
|
512
|
+
{
|
|
513
|
+
__setNoDelete(false);
|
|
514
|
+
throw;
|
|
515
|
+
}
|
|
516
|
+
__setNoDelete(false);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
IceInternal::ThreadPool::~ThreadPool()
|
|
520
|
+
{
|
|
521
|
+
assert(_destroyed);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
void
|
|
525
|
+
IceInternal::ThreadPool::destroy()
|
|
526
|
+
{
|
|
527
|
+
Lock sync(*this);
|
|
528
|
+
if(_destroyed)
|
|
529
|
+
{
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
_destroyed = true;
|
|
534
|
+
_workQueue->destroy();
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
void
|
|
538
|
+
IceInternal::ThreadPool::updateObservers()
|
|
539
|
+
{
|
|
540
|
+
Lock sync(*this);
|
|
541
|
+
for(set<EventHandlerThreadPtr>::iterator p = _threads.begin(); p != _threads.end(); ++p)
|
|
542
|
+
{
|
|
543
|
+
(*p)->updateObserver();
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
void
|
|
548
|
+
IceInternal::ThreadPool::initialize(const EventHandlerPtr& handler)
|
|
549
|
+
{
|
|
550
|
+
Lock sync(*this);
|
|
551
|
+
assert(!_destroyed);
|
|
552
|
+
_selector.initialize(handler.get());
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
void
|
|
556
|
+
IceInternal::ThreadPool::update(const EventHandlerPtr& handler, SocketOperation remove, SocketOperation add)
|
|
557
|
+
{
|
|
558
|
+
Lock sync(*this);
|
|
559
|
+
assert(!_destroyed);
|
|
560
|
+
|
|
561
|
+
// Don't remove what needs to be added
|
|
562
|
+
remove = static_cast<SocketOperation>(remove & ~add);
|
|
563
|
+
|
|
564
|
+
// Don't remove/add if already un-registered or registered
|
|
565
|
+
remove = static_cast<SocketOperation>(handler->_registered & remove);
|
|
566
|
+
add = static_cast<SocketOperation>(~handler->_registered & add);
|
|
567
|
+
if(remove == add)
|
|
568
|
+
{
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
_selector.update(handler.get(), remove, add);
|
|
573
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
574
|
+
if(add & SocketOperationRead && handler->_hasMoreData && !(handler->_disabled & SocketOperationRead))
|
|
575
|
+
{
|
|
576
|
+
if(_pendingHandlers.empty())
|
|
577
|
+
{
|
|
578
|
+
_workQueue->queue(interruptWorkItem); // Interrupt select()
|
|
579
|
+
}
|
|
580
|
+
_pendingHandlers.insert(handler.get());
|
|
581
|
+
}
|
|
582
|
+
else if(remove & SocketOperationRead)
|
|
583
|
+
{
|
|
584
|
+
_pendingHandlers.erase(handler.get());
|
|
585
|
+
}
|
|
586
|
+
#endif
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
bool
|
|
590
|
+
IceInternal::ThreadPool::finish(const EventHandlerPtr& handler, bool closeNow)
|
|
591
|
+
{
|
|
592
|
+
Lock sync(*this);
|
|
593
|
+
assert(!_destroyed);
|
|
594
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
595
|
+
closeNow = _selector.finish(handler.get(), closeNow); // This must be called before!
|
|
596
|
+
_pendingHandlers.erase(handler.get());
|
|
597
|
+
_workQueue->queue(new FinishedWorkItem(handler, !closeNow));
|
|
598
|
+
return closeNow;
|
|
599
|
+
#else
|
|
600
|
+
// If there are no pending asynchronous operations, we can call finish on the handler now.
|
|
601
|
+
if(!handler->_pending)
|
|
602
|
+
{
|
|
603
|
+
_workQueue->queue(new FinishedWorkItem(handler, false));
|
|
604
|
+
_selector.finish(handler.get());
|
|
605
|
+
}
|
|
606
|
+
else
|
|
607
|
+
{
|
|
608
|
+
handler->_finish = true;
|
|
609
|
+
}
|
|
610
|
+
return true; // Always close now to interrupt the pending call.
|
|
611
|
+
#endif
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
void
|
|
615
|
+
IceInternal::ThreadPool::dispatchFromThisThread(const DispatchWorkItemPtr& workItem)
|
|
616
|
+
{
|
|
617
|
+
if(_dispatcher)
|
|
618
|
+
{
|
|
619
|
+
try
|
|
620
|
+
{
|
|
621
|
+
_dispatcher->dispatch(workItem, workItem->getConnection());
|
|
622
|
+
}
|
|
623
|
+
catch(const std::exception& ex)
|
|
624
|
+
{
|
|
625
|
+
if(_instance->initializationData().properties->getPropertyAsIntWithDefault("Ice.Warn.Dispatch", 1) > 1)
|
|
626
|
+
{
|
|
627
|
+
Warning out(_instance->initializationData().logger);
|
|
628
|
+
out << "dispatch exception:\n" << ex;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
catch(...)
|
|
632
|
+
{
|
|
633
|
+
if(_instance->initializationData().properties->getPropertyAsIntWithDefault("Ice.Warn.Dispatch", 1) > 1)
|
|
634
|
+
{
|
|
635
|
+
Warning out(_instance->initializationData().logger);
|
|
636
|
+
out << "dispatch exception:\nunknown c++ exception";
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
else
|
|
641
|
+
{
|
|
642
|
+
workItem->run();
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
void
|
|
647
|
+
IceInternal::ThreadPool::dispatch(const DispatchWorkItemPtr& workItem)
|
|
648
|
+
{
|
|
649
|
+
_workQueue->queue(workItem);
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
void
|
|
653
|
+
IceInternal::ThreadPool::joinWithAllThreads()
|
|
654
|
+
{
|
|
655
|
+
assert(_destroyed);
|
|
656
|
+
|
|
657
|
+
//
|
|
658
|
+
// _threads is immutable after destroy() has been called,
|
|
659
|
+
// therefore no synchronization is needed. (Synchronization
|
|
660
|
+
// wouldn't be possible here anyway, because otherwise the other
|
|
661
|
+
// threads would never terminate.)
|
|
662
|
+
//
|
|
663
|
+
for(set<EventHandlerThreadPtr>::iterator p = _threads.begin(); p != _threads.end(); ++p)
|
|
664
|
+
{
|
|
665
|
+
(*p)->getThreadControl().join();
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
669
|
+
_selector.finish(_workQueue.get(), true);
|
|
670
|
+
#endif
|
|
671
|
+
_selector.destroy();
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
string
|
|
675
|
+
IceInternal::ThreadPool::prefix() const
|
|
676
|
+
{
|
|
677
|
+
return _prefix;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
void
|
|
681
|
+
IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread)
|
|
682
|
+
{
|
|
683
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
684
|
+
ThreadPoolCurrent current(_instance, this, thread);
|
|
685
|
+
bool select = false;
|
|
686
|
+
vector<pair<EventHandler*, SocketOperation> > handlers;
|
|
687
|
+
while(true)
|
|
688
|
+
{
|
|
689
|
+
if(current._handler)
|
|
690
|
+
{
|
|
691
|
+
try
|
|
692
|
+
{
|
|
693
|
+
current._handler->message(current);
|
|
694
|
+
}
|
|
695
|
+
catch(const ThreadPoolDestroyedException&)
|
|
696
|
+
{
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
catch(const exception& ex)
|
|
700
|
+
{
|
|
701
|
+
Error out(_instance->initializationData().logger);
|
|
702
|
+
out << "exception in `" << _prefix << "':\n" << ex << "\nevent handler: "
|
|
703
|
+
<< current._handler->toString();
|
|
704
|
+
}
|
|
705
|
+
catch(...)
|
|
706
|
+
{
|
|
707
|
+
Error out(_instance->initializationData().logger);
|
|
708
|
+
out << "exception in `" << _prefix << "':\nevent handler: " << current._handler->toString();
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
else if(select)
|
|
712
|
+
{
|
|
713
|
+
try
|
|
714
|
+
{
|
|
715
|
+
_selector.select(handlers, _serverIdleTime);
|
|
716
|
+
}
|
|
717
|
+
catch(const SelectorTimeoutException&)
|
|
718
|
+
{
|
|
719
|
+
Lock sync(*this);
|
|
720
|
+
if(!_destroyed && _inUse == 0)
|
|
721
|
+
{
|
|
722
|
+
_workQueue->queue(new ShutdownWorkItem(_instance)); // Select timed-out.
|
|
723
|
+
}
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
{
|
|
729
|
+
Lock sync(*this);
|
|
730
|
+
if(!current._handler)
|
|
731
|
+
{
|
|
732
|
+
if(select)
|
|
733
|
+
{
|
|
734
|
+
_handlers.swap(handlers);
|
|
735
|
+
if(!_pendingHandlers.empty())
|
|
736
|
+
{
|
|
737
|
+
for(_nextHandler = _handlers.begin(); _nextHandler != _handlers.end(); ++_nextHandler)
|
|
738
|
+
{
|
|
739
|
+
_pendingHandlers.erase(_nextHandler->first);
|
|
740
|
+
}
|
|
741
|
+
set<EventHandler*>::const_iterator p;
|
|
742
|
+
for(p = _pendingHandlers.begin(); p != _pendingHandlers.end(); ++p)
|
|
743
|
+
{
|
|
744
|
+
_handlers.push_back(make_pair(*p, SocketOperationRead));
|
|
745
|
+
}
|
|
746
|
+
_pendingHandlers.clear();
|
|
747
|
+
}
|
|
748
|
+
_nextHandler = _handlers.begin();
|
|
749
|
+
_selector.finishSelect();
|
|
750
|
+
select = false;
|
|
751
|
+
}
|
|
752
|
+
else if(!current._leader && followerWait(current))
|
|
753
|
+
{
|
|
754
|
+
return; // Wait timed-out.
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
else if(_sizeMax > 1)
|
|
758
|
+
{
|
|
759
|
+
if(!current._ioCompleted)
|
|
760
|
+
{
|
|
761
|
+
//
|
|
762
|
+
// The handler didn't call ioCompleted() so we take care of decreasing
|
|
763
|
+
// the IO thread count now.
|
|
764
|
+
//
|
|
765
|
+
--_inUseIO;
|
|
766
|
+
if(current._handler->_hasMoreData && current._handler->_registered & SocketOperationRead)
|
|
767
|
+
{
|
|
768
|
+
if(_pendingHandlers.empty())
|
|
769
|
+
{
|
|
770
|
+
_workQueue->queue(interruptWorkItem); // Interrupt select()
|
|
771
|
+
}
|
|
772
|
+
_pendingHandlers.insert(current._handler.get());
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
else
|
|
776
|
+
{
|
|
777
|
+
//
|
|
778
|
+
// If the handler called ioCompleted(), we re-enable the handler in
|
|
779
|
+
// case it was disabled and we decrease the number of thread in use.
|
|
780
|
+
//
|
|
781
|
+
if(_serialize)
|
|
782
|
+
{
|
|
783
|
+
_selector.enable(current._handler.get(), current.operation);
|
|
784
|
+
if(current._handler->_hasMoreData && current._handler->_registered & SocketOperationRead)
|
|
785
|
+
{
|
|
786
|
+
if(_pendingHandlers.empty())
|
|
787
|
+
{
|
|
788
|
+
_workQueue->queue(interruptWorkItem); // Interrupt select()
|
|
789
|
+
}
|
|
790
|
+
_pendingHandlers.insert(current._handler.get());
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
assert(_inUse > 0);
|
|
794
|
+
--_inUse;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
if(!current._leader && followerWait(current))
|
|
798
|
+
{
|
|
799
|
+
return; // Wait timed-out.
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
else if(current._handler->_hasMoreData && current._handler->_registered & SocketOperationRead)
|
|
803
|
+
{
|
|
804
|
+
if(_pendingHandlers.empty())
|
|
805
|
+
{
|
|
806
|
+
_workQueue->queue(interruptWorkItem); // Interrupt select()
|
|
807
|
+
}
|
|
808
|
+
_pendingHandlers.insert(current._handler.get());
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
//
|
|
812
|
+
// Get the next ready handler.
|
|
813
|
+
//
|
|
814
|
+
while(_nextHandler != _handlers.end() && !(_nextHandler->second & _nextHandler->first->_registered))
|
|
815
|
+
{
|
|
816
|
+
++_nextHandler;
|
|
817
|
+
}
|
|
818
|
+
if(_nextHandler != _handlers.end())
|
|
819
|
+
{
|
|
820
|
+
current._ioCompleted = false;
|
|
821
|
+
current._handler = _nextHandler->first;
|
|
822
|
+
current.operation = _nextHandler->second;
|
|
823
|
+
++_nextHandler;
|
|
824
|
+
thread->setState(ThreadStateInUseForIO);
|
|
825
|
+
}
|
|
826
|
+
else
|
|
827
|
+
{
|
|
828
|
+
current._handler = 0;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
if(!current._handler)
|
|
832
|
+
{
|
|
833
|
+
//
|
|
834
|
+
// If there are no more ready handlers and there are still threads busy performing
|
|
835
|
+
// IO, we give up leadership and promote another follower (which will perform the
|
|
836
|
+
// select() only once all the IOs are completed). Otherwise, if there are no more
|
|
837
|
+
// threads peforming IOs, it's time to do another select().
|
|
838
|
+
//
|
|
839
|
+
if(_inUseIO > 0)
|
|
840
|
+
{
|
|
841
|
+
promoteFollower(current);
|
|
842
|
+
}
|
|
843
|
+
else
|
|
844
|
+
{
|
|
845
|
+
_handlers.clear();
|
|
846
|
+
_selector.startSelect();
|
|
847
|
+
select = true;
|
|
848
|
+
thread->setState(ThreadStateIdle);
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
else if(_sizeMax > 1)
|
|
852
|
+
{
|
|
853
|
+
//
|
|
854
|
+
// Increment the IO thread count and if there are still threads available
|
|
855
|
+
// to perform IO and more handlers ready, we promote a follower.
|
|
856
|
+
//
|
|
857
|
+
++_inUseIO;
|
|
858
|
+
if(_nextHandler != _handlers.end() && _inUseIO < _sizeIO)
|
|
859
|
+
{
|
|
860
|
+
promoteFollower(current);
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
#else
|
|
866
|
+
ThreadPoolCurrent current(_instance, this, thread);
|
|
867
|
+
while(true)
|
|
868
|
+
{
|
|
869
|
+
try
|
|
870
|
+
{
|
|
871
|
+
current._ioCompleted = false;
|
|
872
|
+
#ifdef ICE_OS_WINRT
|
|
873
|
+
current._handler = _selector.getNextHandler(current.operation, _threadIdleTime);
|
|
874
|
+
#else
|
|
875
|
+
current._handler = _selector.getNextHandler(current.operation, current._count, current._error,
|
|
876
|
+
_threadIdleTime);
|
|
877
|
+
#endif
|
|
878
|
+
}
|
|
879
|
+
catch(const SelectorTimeoutException&)
|
|
880
|
+
{
|
|
881
|
+
if(_sizeMax > 1)
|
|
882
|
+
{
|
|
883
|
+
Lock sync(*this);
|
|
884
|
+
|
|
885
|
+
if(_destroyed)
|
|
886
|
+
{
|
|
887
|
+
continue;
|
|
888
|
+
}
|
|
889
|
+
else if(_inUse < static_cast<int>(_threads.size() - 1)) // If not the last idle thread, we can exit.
|
|
890
|
+
{
|
|
891
|
+
#ifndef ICE_OS_WINRT
|
|
892
|
+
BOOL hasIO = false;
|
|
893
|
+
GetThreadIOPendingFlag(GetCurrentThread(), &hasIO);
|
|
894
|
+
if(hasIO)
|
|
895
|
+
{
|
|
896
|
+
continue;
|
|
897
|
+
}
|
|
898
|
+
#endif
|
|
899
|
+
if(_instance->traceLevels()->threadPool >= 1)
|
|
900
|
+
{
|
|
901
|
+
Trace out(_instance->initializationData().logger, _instance->traceLevels()->threadPoolCat);
|
|
902
|
+
out << "shrinking " << _prefix << ": Size = " << (_threads.size() - 1);
|
|
903
|
+
}
|
|
904
|
+
_threads.erase(thread);
|
|
905
|
+
_workQueue->queue(new JoinThreadWorkItem(thread));
|
|
906
|
+
return;
|
|
907
|
+
}
|
|
908
|
+
else if(_inUse > 0)
|
|
909
|
+
{
|
|
910
|
+
//
|
|
911
|
+
// If this is the last idle thread but there are still other threads
|
|
912
|
+
// busy dispatching, we go back waiting with _threadIdleTime. We only
|
|
913
|
+
// wait with _serverIdleTime when there's only one thread left.
|
|
914
|
+
//
|
|
915
|
+
continue;
|
|
916
|
+
}
|
|
917
|
+
assert(_threads.size() == 1);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
try
|
|
921
|
+
{
|
|
922
|
+
#ifdef ICE_OS_WINRT
|
|
923
|
+
current._handler = _selector.getNextHandler(current.operation, _serverIdleTime);
|
|
924
|
+
#else
|
|
925
|
+
current._handler = _selector.getNextHandler(current.operation, current._count, current._error,
|
|
926
|
+
_serverIdleTime);
|
|
927
|
+
#endif
|
|
928
|
+
}
|
|
929
|
+
catch(const SelectorTimeoutException&)
|
|
930
|
+
{
|
|
931
|
+
Lock sync(*this);
|
|
932
|
+
if(!_destroyed)
|
|
933
|
+
{
|
|
934
|
+
_workQueue->queue(new ShutdownWorkItem(_instance));
|
|
935
|
+
}
|
|
936
|
+
continue;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
{
|
|
941
|
+
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
|
|
942
|
+
thread->setState(ThreadStateInUseForIO);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
try
|
|
946
|
+
{
|
|
947
|
+
assert(current._handler);
|
|
948
|
+
current._handler->message(current);
|
|
949
|
+
}
|
|
950
|
+
catch(const ThreadPoolDestroyedException&)
|
|
951
|
+
{
|
|
952
|
+
return;
|
|
953
|
+
}
|
|
954
|
+
catch(const exception& ex)
|
|
955
|
+
{
|
|
956
|
+
Error out(_instance->initializationData().logger);
|
|
957
|
+
out << "exception in `" << _prefix << "':\n" << ex << "\nevent handler: " << current._handler->toString();
|
|
958
|
+
}
|
|
959
|
+
#ifdef ICE_OS_WINRT
|
|
960
|
+
catch(Platform::Exception^ ex)
|
|
961
|
+
{
|
|
962
|
+
//
|
|
963
|
+
// We don't need to pass the wide string converter in the call to wstringToString
|
|
964
|
+
// because the wide string is using the platform default encoding.
|
|
965
|
+
//
|
|
966
|
+
Error out(_instance->initializationData().logger);
|
|
967
|
+
out << "exception in `" << _prefix << "':\n"
|
|
968
|
+
<< IceUtil::wstringToString(ex->Message->Data(), _instance->getStringConverter())
|
|
969
|
+
<< "\nevent handler: " << current._handler->toString();
|
|
970
|
+
}
|
|
971
|
+
#endif
|
|
972
|
+
catch(...)
|
|
973
|
+
{
|
|
974
|
+
Error out(_instance->initializationData().logger);
|
|
975
|
+
out << "exception in `" << _prefix << "':\nevent handler: " << current._handler->toString();
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
{
|
|
979
|
+
Lock sync(*this);
|
|
980
|
+
if(_sizeMax > 1 && current._ioCompleted)
|
|
981
|
+
{
|
|
982
|
+
assert(_inUse > 0);
|
|
983
|
+
--_inUse;
|
|
984
|
+
}
|
|
985
|
+
thread->setState(ThreadStateIdle);
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
#endif
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
bool
|
|
992
|
+
IceInternal::ThreadPool::ioCompleted(ThreadPoolCurrent& current)
|
|
993
|
+
{
|
|
994
|
+
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
|
|
995
|
+
|
|
996
|
+
current._ioCompleted = true; // Set the IO completed flag to specifiy that ioCompleted() has been called.
|
|
997
|
+
|
|
998
|
+
current._thread->setState(ThreadStateInUseForUser);
|
|
999
|
+
|
|
1000
|
+
if(_sizeMax > 1)
|
|
1001
|
+
{
|
|
1002
|
+
|
|
1003
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
1004
|
+
--_inUseIO;
|
|
1005
|
+
|
|
1006
|
+
if(!_destroyed)
|
|
1007
|
+
{
|
|
1008
|
+
if(_serialize)
|
|
1009
|
+
{
|
|
1010
|
+
_selector.disable(current._handler.get(), current.operation);
|
|
1011
|
+
|
|
1012
|
+
// Make sure the handler isn't in the set of pending handlers (this can
|
|
1013
|
+
// for example occur if the handler is has more data and its added by
|
|
1014
|
+
// ThreadPool::update while we were processing IO).
|
|
1015
|
+
_pendingHandlers.erase(current._handler.get());
|
|
1016
|
+
}
|
|
1017
|
+
else if(current._handler->_hasMoreData && current._handler->_registered & SocketOperationRead)
|
|
1018
|
+
{
|
|
1019
|
+
if(_pendingHandlers.empty())
|
|
1020
|
+
{
|
|
1021
|
+
_workQueue->queue(interruptWorkItem); // Interrupt select()
|
|
1022
|
+
}
|
|
1023
|
+
_pendingHandlers.insert(current._handler.get());
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
if(current._leader)
|
|
1028
|
+
{
|
|
1029
|
+
//
|
|
1030
|
+
// If this thread is still the leader, it's time to promote a new leader.
|
|
1031
|
+
//
|
|
1032
|
+
promoteFollower(current);
|
|
1033
|
+
}
|
|
1034
|
+
else if(_promote && (_nextHandler != _handlers.end() || _inUseIO == 0))
|
|
1035
|
+
{
|
|
1036
|
+
notify();
|
|
1037
|
+
}
|
|
1038
|
+
#endif
|
|
1039
|
+
|
|
1040
|
+
assert(_inUse >= 0);
|
|
1041
|
+
++_inUse;
|
|
1042
|
+
|
|
1043
|
+
if(_inUse == _sizeWarn)
|
|
1044
|
+
{
|
|
1045
|
+
Warning out(_instance->initializationData().logger);
|
|
1046
|
+
out << "thread pool `" << _prefix << "' is running low on threads\n"
|
|
1047
|
+
<< "Size=" << _size << ", " << "SizeMax=" << _sizeMax << ", " << "SizeWarn=" << _sizeWarn;
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
if(!_destroyed)
|
|
1051
|
+
{
|
|
1052
|
+
assert(_inUse <= static_cast<int>(_threads.size()));
|
|
1053
|
+
if(_inUse < _sizeMax && _inUse == static_cast<int>(_threads.size()))
|
|
1054
|
+
{
|
|
1055
|
+
if(_instance->traceLevels()->threadPool >= 1)
|
|
1056
|
+
{
|
|
1057
|
+
Trace out(_instance->initializationData().logger, _instance->traceLevels()->threadPoolCat);
|
|
1058
|
+
out << "growing " << _prefix << ": Size=" << _threads.size() + 1;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
try
|
|
1062
|
+
{
|
|
1063
|
+
EventHandlerThreadPtr thread = new EventHandlerThread(this, nextThreadId());
|
|
1064
|
+
if(_hasPriority)
|
|
1065
|
+
{
|
|
1066
|
+
thread->start(_stackSize, _priority);
|
|
1067
|
+
}
|
|
1068
|
+
else
|
|
1069
|
+
{
|
|
1070
|
+
thread->start(_stackSize);
|
|
1071
|
+
}
|
|
1072
|
+
_threads.insert(thread);
|
|
1073
|
+
}
|
|
1074
|
+
catch(const IceUtil::Exception& ex)
|
|
1075
|
+
{
|
|
1076
|
+
Error out(_instance->initializationData().logger);
|
|
1077
|
+
out << "cannot create thread for `" << _prefix << "':\n" << ex;
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
return _serialize;
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
#if defined(ICE_USE_IOCP) || defined(ICE_OS_WINRT)
|
|
1087
|
+
bool
|
|
1088
|
+
IceInternal::ThreadPool::startMessage(ThreadPoolCurrent& current)
|
|
1089
|
+
{
|
|
1090
|
+
assert(current._handler->_pending & current.operation);
|
|
1091
|
+
|
|
1092
|
+
if(current._handler->_started & current.operation)
|
|
1093
|
+
{
|
|
1094
|
+
assert(!(current._handler->_ready & current.operation));
|
|
1095
|
+
current._handler->_ready = static_cast<SocketOperation>(current._handler->_ready | current.operation);
|
|
1096
|
+
current._handler->_started = static_cast<SocketOperation>(current._handler->_started & ~current.operation);
|
|
1097
|
+
|
|
1098
|
+
#ifndef ICE_OS_WINRT
|
|
1099
|
+
AsyncInfo* info = current._handler->getNativeInfo()->getAsyncInfo(current.operation);
|
|
1100
|
+
info->count = current._count;
|
|
1101
|
+
info->error = current._error;
|
|
1102
|
+
#endif
|
|
1103
|
+
|
|
1104
|
+
if(!current._handler->finishAsync(current.operation)) // Returns false if the handler is finished.
|
|
1105
|
+
{
|
|
1106
|
+
current._handler->_pending = static_cast<SocketOperation>(current._handler->_pending & ~current.operation);
|
|
1107
|
+
if(!current._handler->_pending && current._handler->_finish)
|
|
1108
|
+
{
|
|
1109
|
+
_workQueue->queue(new FinishedWorkItem(current._handler, false));
|
|
1110
|
+
_selector.finish(current._handler.get());
|
|
1111
|
+
}
|
|
1112
|
+
return false;
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
else if(!(current._handler->_ready & current.operation) && (current._handler->_registered & current.operation))
|
|
1116
|
+
{
|
|
1117
|
+
assert(!(current._handler->_started & current.operation));
|
|
1118
|
+
if(!current._handler->startAsync(current.operation))
|
|
1119
|
+
{
|
|
1120
|
+
current._handler->_pending = static_cast<SocketOperation>(current._handler->_pending & ~current.operation);
|
|
1121
|
+
if(!current._handler->_pending && current._handler->_finish)
|
|
1122
|
+
{
|
|
1123
|
+
_workQueue->queue(new FinishedWorkItem(current._handler, false));
|
|
1124
|
+
_selector.finish(current._handler.get());
|
|
1125
|
+
}
|
|
1126
|
+
return false;
|
|
1127
|
+
}
|
|
1128
|
+
else
|
|
1129
|
+
{
|
|
1130
|
+
current._handler->_started = static_cast<SocketOperation>(current._handler->_started | current.operation);
|
|
1131
|
+
return false;
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
if(current._handler->_registered & current.operation)
|
|
1136
|
+
{
|
|
1137
|
+
assert(current._handler->_ready & current.operation);
|
|
1138
|
+
current._handler->_ready = static_cast<SocketOperation>(current._handler->_ready & ~current.operation);
|
|
1139
|
+
return true;
|
|
1140
|
+
}
|
|
1141
|
+
else
|
|
1142
|
+
{
|
|
1143
|
+
current._handler->_pending = static_cast<SocketOperation>(current._handler->_pending & ~current.operation);
|
|
1144
|
+
if(!current._handler->_pending && current._handler->_finish)
|
|
1145
|
+
{
|
|
1146
|
+
_workQueue->queue(new FinishedWorkItem(current._handler, false));
|
|
1147
|
+
_selector.finish(current._handler.get());
|
|
1148
|
+
}
|
|
1149
|
+
return false;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
void
|
|
1154
|
+
IceInternal::ThreadPool::finishMessage(ThreadPoolCurrent& current)
|
|
1155
|
+
{
|
|
1156
|
+
if(current._handler->_registered & current.operation)
|
|
1157
|
+
{
|
|
1158
|
+
assert(!(current._handler->_ready & current.operation));
|
|
1159
|
+
if(!current._handler->startAsync(current.operation))
|
|
1160
|
+
{
|
|
1161
|
+
current._handler->_pending = static_cast<SocketOperation>(current._handler->_pending & ~current.operation);
|
|
1162
|
+
}
|
|
1163
|
+
else
|
|
1164
|
+
{
|
|
1165
|
+
assert(current._handler->_pending & current.operation);
|
|
1166
|
+
current._handler->_started = static_cast<SocketOperation>(current._handler->_started | current.operation);
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
else
|
|
1170
|
+
{
|
|
1171
|
+
current._handler->_pending = static_cast<SocketOperation>(current._handler->_pending & ~current.operation);
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
if(!current._handler->_pending && current._handler->_finish)
|
|
1175
|
+
{
|
|
1176
|
+
// There are no more pending async operations, it's time to call finish.
|
|
1177
|
+
_workQueue->queue(new FinishedWorkItem(current._handler, false));
|
|
1178
|
+
_selector.finish(current._handler.get());
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
#else
|
|
1182
|
+
void
|
|
1183
|
+
IceInternal::ThreadPool::promoteFollower(ThreadPoolCurrent& current)
|
|
1184
|
+
{
|
|
1185
|
+
assert(!_promote && current._leader);
|
|
1186
|
+
_promote = true;
|
|
1187
|
+
if(_inUseIO < _sizeIO && (_nextHandler != _handlers.end() || _inUseIO == 0))
|
|
1188
|
+
{
|
|
1189
|
+
notify();
|
|
1190
|
+
}
|
|
1191
|
+
current._leader = false;
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
bool
|
|
1195
|
+
IceInternal::ThreadPool::followerWait(ThreadPoolCurrent& current)
|
|
1196
|
+
{
|
|
1197
|
+
assert(!current._leader);
|
|
1198
|
+
|
|
1199
|
+
current._thread->setState(ThreadStateIdle);
|
|
1200
|
+
|
|
1201
|
+
//
|
|
1202
|
+
// It's important to clear the handler before waiting to make sure that
|
|
1203
|
+
// resources for the handler are released now if it's finished. We also
|
|
1204
|
+
// clear the per-thread stream.
|
|
1205
|
+
//
|
|
1206
|
+
current._handler = 0;
|
|
1207
|
+
current.stream.clear();
|
|
1208
|
+
current.stream.b.clear();
|
|
1209
|
+
|
|
1210
|
+
//
|
|
1211
|
+
// Wait to be promoted and for all the IO threads to be done.
|
|
1212
|
+
//
|
|
1213
|
+
while(!_promote || _inUseIO == _sizeIO || (_nextHandler == _handlers.end() && _inUseIO > 0))
|
|
1214
|
+
{
|
|
1215
|
+
if(_threadIdleTime)
|
|
1216
|
+
{
|
|
1217
|
+
if(!timedWait(IceUtil::Time::seconds(_threadIdleTime)))
|
|
1218
|
+
{
|
|
1219
|
+
if(!_destroyed && (!_promote || _inUseIO == _sizeIO ||
|
|
1220
|
+
(_nextHandler == _handlers.end() && _inUseIO > 0)))
|
|
1221
|
+
{
|
|
1222
|
+
if(_instance->traceLevels()->threadPool >= 1)
|
|
1223
|
+
{
|
|
1224
|
+
Trace out(_instance->initializationData().logger, _instance->traceLevels()->threadPoolCat);
|
|
1225
|
+
out << "shrinking " << _prefix << ": Size=" << (_threads.size() - 1);
|
|
1226
|
+
}
|
|
1227
|
+
assert(_threads.size() > 1); // Can only be called by a waiting follower thread.
|
|
1228
|
+
_threads.erase(current._thread);
|
|
1229
|
+
_workQueue->queue(new JoinThreadWorkItem(current._thread));
|
|
1230
|
+
return true;
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
else
|
|
1235
|
+
{
|
|
1236
|
+
wait();
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
current._leader = true; // The current thread has become the leader.
|
|
1240
|
+
_promote = false;
|
|
1241
|
+
return false;
|
|
1242
|
+
}
|
|
1243
|
+
#endif
|
|
1244
|
+
|
|
1245
|
+
string
|
|
1246
|
+
IceInternal::ThreadPool::nextThreadId()
|
|
1247
|
+
{
|
|
1248
|
+
ostringstream os;
|
|
1249
|
+
os << _prefix << "-" << _nextThreadId++;
|
|
1250
|
+
return os.str();
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
IceInternal::ThreadPool::EventHandlerThread::EventHandlerThread(const ThreadPoolPtr& pool, const string& name) :
|
|
1254
|
+
IceUtil::Thread(name),
|
|
1255
|
+
_pool(pool),
|
|
1256
|
+
_state(Ice::Instrumentation::ThreadStateIdle)
|
|
1257
|
+
{
|
|
1258
|
+
updateObserver();
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
void
|
|
1262
|
+
IceInternal::ThreadPool::EventHandlerThread::updateObserver()
|
|
1263
|
+
{
|
|
1264
|
+
// Must be called with the thread pool mutex locked
|
|
1265
|
+
const CommunicatorObserverPtr& obsv = _pool->_instance->initializationData().observer;
|
|
1266
|
+
if(obsv)
|
|
1267
|
+
{
|
|
1268
|
+
_observer.attach(obsv->getThreadObserver(_pool->_prefix, name(), _state, _observer.get()));
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
void
|
|
1273
|
+
IceInternal::ThreadPool::EventHandlerThread::setState(Ice::Instrumentation::ThreadState s)
|
|
1274
|
+
{
|
|
1275
|
+
// Must be called with the thread pool mutex locked
|
|
1276
|
+
if(_observer)
|
|
1277
|
+
{
|
|
1278
|
+
if(_state != s)
|
|
1279
|
+
{
|
|
1280
|
+
_observer->stateChanged(_state, s);
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
_state = s;
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
void
|
|
1287
|
+
IceInternal::ThreadPool::EventHandlerThread::run()
|
|
1288
|
+
{
|
|
1289
|
+
if(_pool->_instance->initializationData().threadHook)
|
|
1290
|
+
{
|
|
1291
|
+
try
|
|
1292
|
+
{
|
|
1293
|
+
_pool->_instance->initializationData().threadHook->start();
|
|
1294
|
+
}
|
|
1295
|
+
catch(const exception& ex)
|
|
1296
|
+
{
|
|
1297
|
+
Error out(_pool->_instance->initializationData().logger);
|
|
1298
|
+
out << "thread hook start() method raised an unexpected exception in `" << _pool->_prefix << "':\n" << ex;
|
|
1299
|
+
}
|
|
1300
|
+
catch(...)
|
|
1301
|
+
{
|
|
1302
|
+
Error out(_pool->_instance->initializationData().logger);
|
|
1303
|
+
out << "thread hook start() method raised an unexpected exception in `" << _pool->_prefix << "'";
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
try
|
|
1308
|
+
{
|
|
1309
|
+
_pool->run(this);
|
|
1310
|
+
}
|
|
1311
|
+
catch(const exception& ex)
|
|
1312
|
+
{
|
|
1313
|
+
Error out(_pool->_instance->initializationData().logger);
|
|
1314
|
+
out << "exception in `" << _pool->_prefix << "':\n" << ex;
|
|
1315
|
+
}
|
|
1316
|
+
catch(...)
|
|
1317
|
+
{
|
|
1318
|
+
Error out(_pool->_instance->initializationData().logger);
|
|
1319
|
+
out << "unknown exception in `" << _pool->_prefix << "'";
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
_observer.detach();
|
|
1323
|
+
|
|
1324
|
+
if(_pool->_instance->initializationData().threadHook)
|
|
1325
|
+
{
|
|
1326
|
+
try
|
|
1327
|
+
{
|
|
1328
|
+
_pool->_instance->initializationData().threadHook->stop();
|
|
1329
|
+
}
|
|
1330
|
+
catch(const exception& ex)
|
|
1331
|
+
{
|
|
1332
|
+
Error out(_pool->_instance->initializationData().logger);
|
|
1333
|
+
out << "thread hook stop() method raised an unexpected exception in `" << _pool->_prefix << "':\n" << ex;
|
|
1334
|
+
}
|
|
1335
|
+
catch(...)
|
|
1336
|
+
{
|
|
1337
|
+
Error out(_pool->_instance->initializationData().logger);
|
|
1338
|
+
out << "thread hook stop() method raised an unexpected exception in `" << _pool->_prefix << "'";
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
_pool = 0; // Break cyclic dependency.
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
ThreadPoolCurrent::ThreadPoolCurrent(const InstancePtr& instance,
|
|
1346
|
+
const ThreadPoolPtr& threadPool,
|
|
1347
|
+
const ThreadPool::EventHandlerThreadPtr& thread) :
|
|
1348
|
+
operation(SocketOperationNone),
|
|
1349
|
+
stream(instance.get(), Ice::currentProtocolEncoding),
|
|
1350
|
+
_threadPool(threadPool.get()),
|
|
1351
|
+
_thread(thread),
|
|
1352
|
+
_ioCompleted(false)
|
|
1353
|
+
#if !defined(ICE_USE_IOCP) && !defined(ICE_OS_WINRT)
|
|
1354
|
+
, _leader(false)
|
|
1355
|
+
#endif
|
|
1356
|
+
{
|
|
1357
|
+
}
|