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.
Files changed (675) hide show
  1. checksums.yaml +7 -0
  2. data/ICE_LICENSE +54 -0
  3. data/LICENSE +339 -0
  4. data/bin/slice2rb +17 -0
  5. data/ext/Communicator.cpp +596 -0
  6. data/ext/Communicator.h +25 -0
  7. data/ext/Config.h +111 -0
  8. data/ext/Connection.cpp +381 -0
  9. data/ext/Connection.h +26 -0
  10. data/ext/Endpoint.cpp +311 -0
  11. data/ext/Endpoint.h +27 -0
  12. data/ext/ImplicitContext.cpp +152 -0
  13. data/ext/ImplicitContext.h +25 -0
  14. data/ext/Init.cpp +52 -0
  15. data/ext/Logger.cpp +151 -0
  16. data/ext/Logger.h +28 -0
  17. data/ext/ObjectFactory.cpp +140 -0
  18. data/ext/ObjectFactory.h +50 -0
  19. data/ext/Operation.cpp +676 -0
  20. data/ext/Operation.h +36 -0
  21. data/ext/Properties.cpp +369 -0
  22. data/ext/Properties.h +25 -0
  23. data/ext/Proxy.cpp +1354 -0
  24. data/ext/Proxy.h +27 -0
  25. data/ext/Slice.cpp +223 -0
  26. data/ext/Slice.h +22 -0
  27. data/ext/Types.cpp +3160 -0
  28. data/ext/Types.h +545 -0
  29. data/ext/Util.cpp +792 -0
  30. data/ext/Util.h +511 -0
  31. data/ext/extconf.rb +118 -0
  32. data/ext/ice/BZIP_LICENSE +42 -0
  33. data/ext/ice/MCPP_LICENSE +36 -0
  34. data/ext/ice/bzip2/blocksort.c +1094 -0
  35. data/ext/ice/bzip2/bzlib.c +1572 -0
  36. data/ext/ice/bzip2/bzlib.h +282 -0
  37. data/ext/ice/bzip2/bzlib_private.h +509 -0
  38. data/ext/ice/bzip2/compress.c +672 -0
  39. data/ext/ice/bzip2/crctable.c +104 -0
  40. data/ext/ice/bzip2/decompress.c +646 -0
  41. data/ext/ice/bzip2/huffman.c +205 -0
  42. data/ext/ice/bzip2/randtable.c +84 -0
  43. data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
  44. data/ext/ice/cpp/include/Ice/Application.h +156 -0
  45. data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
  46. data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
  47. data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
  48. data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
  49. data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
  50. data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
  51. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
  52. data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
  53. data/ext/ice/cpp/include/Ice/Config.h +97 -0
  54. data/ext/ice/cpp/include/Ice/Connection.h +495 -0
  55. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
  56. data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
  57. data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
  58. data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
  59. data/ext/ice/cpp/include/Ice/Current.h +94 -0
  60. data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
  61. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
  62. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
  63. data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
  64. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
  65. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
  66. data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
  67. data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
  68. data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
  69. data/ext/ice/cpp/include/Ice/Exception.h +114 -0
  70. data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
  71. data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
  72. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
  73. data/ext/ice/cpp/include/Ice/Format.h +39 -0
  74. data/ext/ice/cpp/include/Ice/Functional.h +138 -0
  75. data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
  76. data/ext/ice/cpp/include/Ice/Handle.h +192 -0
  77. data/ext/ice/cpp/include/Ice/Ice.h +54 -0
  78. data/ext/ice/cpp/include/Ice/Identity.h +160 -0
  79. data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
  80. data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
  81. data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
  82. data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
  83. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
  84. data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
  85. data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
  86. data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
  87. data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
  88. data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
  89. data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
  90. data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
  91. data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
  92. data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
  93. data/ext/ice/cpp/include/Ice/Logger.h +94 -0
  94. data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
  95. data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
  96. data/ext/ice/cpp/include/Ice/Makefile +26 -0
  97. data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
  98. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
  99. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
  100. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
  101. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
  102. data/ext/ice/cpp/include/Ice/Object.h +165 -0
  103. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
  104. data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
  105. data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
  106. data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
  107. data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
  108. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
  109. data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
  110. data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
  111. data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
  112. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
  113. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
  114. data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
  115. data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
  116. data/ext/ice/cpp/include/Ice/Process.h +568 -0
  117. data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
  118. data/ext/ice/cpp/include/Ice/Properties.h +130 -0
  119. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
  120. data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
  121. data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
  122. data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
  123. data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
  124. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
  125. data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
  126. data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
  127. data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
  128. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
  129. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
  130. data/ext/ice/cpp/include/Ice/Router.h +1155 -0
  131. data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
  132. data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
  133. data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
  134. data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
  135. data/ext/ice/cpp/include/Ice/Service.h +260 -0
  136. data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
  137. data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
  138. data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
  139. data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
  140. data/ext/ice/cpp/include/Ice/Stream.h +449 -0
  141. data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
  142. data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
  143. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
  144. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
  145. data/ext/ice/cpp/include/Ice/Version.h +254 -0
  146. data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
  147. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
  148. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
  149. data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
  150. data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
  151. data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
  152. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
  153. data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
  154. data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
  155. data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
  156. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
  157. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
  158. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
  159. data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
  160. data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
  161. data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
  162. data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
  163. data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
  164. data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
  165. data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
  166. data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
  167. data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
  168. data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
  169. data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
  170. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
  171. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
  172. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
  173. data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
  174. data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
  175. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
  176. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
  177. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
  178. data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
  179. data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
  180. data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
  181. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
  182. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
  183. data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
  184. data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
  185. data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
  186. data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
  187. data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
  188. data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
  189. data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
  190. data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
  191. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
  192. data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
  193. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
  194. data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
  195. data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
  196. data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
  197. data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
  198. data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
  199. data/ext/ice/cpp/include/Slice/Makefile +26 -0
  200. data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
  201. data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
  202. data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
  203. data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
  204. data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
  205. data/ext/ice/cpp/include/Slice/Util.h +33 -0
  206. data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
  207. data/ext/ice/cpp/src/Ice/ACM.h +117 -0
  208. data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
  209. data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
  210. data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
  211. data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
  212. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
  213. data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
  214. data/ext/ice/cpp/src/Ice/Base64.h +36 -0
  215. data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
  216. data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
  217. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
  218. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
  219. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
  220. data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
  221. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
  222. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
  223. data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
  224. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
  225. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
  226. data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
  227. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
  228. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
  229. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
  230. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
  231. data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
  232. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
  233. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
  234. data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
  235. data/ext/ice/cpp/src/Ice/Connector.h +36 -0
  236. data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
  237. data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
  238. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
  239. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
  240. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
  241. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
  242. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
  243. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
  244. data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
  245. data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
  246. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
  247. data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
  248. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
  249. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
  250. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
  251. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
  252. data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
  253. data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
  254. data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
  255. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
  256. data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
  257. data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
  258. data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
  259. data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
  260. data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
  261. data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
  262. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
  263. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
  264. data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
  265. data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
  266. data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
  267. data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
  268. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
  269. data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
  270. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
  271. data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
  272. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
  273. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
  274. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
  275. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
  276. data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
  277. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
  278. data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
  279. data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
  280. data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
  281. data/ext/ice/cpp/src/Ice/Instance.h +198 -0
  282. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
  283. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
  284. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
  285. data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
  286. data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
  287. data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
  288. data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
  289. data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
  290. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
  291. data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
  292. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
  293. data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
  294. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
  295. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
  296. data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
  297. data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
  298. data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
  299. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
  300. data/ext/ice/cpp/src/Ice/Makefile +190 -0
  301. data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
  302. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
  303. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
  304. data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
  305. data/ext/ice/cpp/src/Ice/Network.h +291 -0
  306. data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
  307. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
  308. data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
  309. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
  310. data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
  311. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
  312. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
  313. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
  314. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
  315. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
  316. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
  317. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
  318. data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
  319. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
  320. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
  321. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
  322. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
  323. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
  324. data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
  325. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
  326. data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
  327. data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
  328. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
  329. data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
  330. data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
  331. data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
  332. data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
  333. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
  334. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
  335. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
  336. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
  337. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
  338. data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
  339. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
  340. data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
  341. data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
  342. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
  343. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
  344. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
  345. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
  346. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
  347. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
  348. data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
  349. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
  350. data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
  351. data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
  352. data/ext/ice/cpp/src/Ice/Reference.h +305 -0
  353. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
  354. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
  355. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
  356. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
  357. data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
  358. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
  359. data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
  360. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
  361. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
  362. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
  363. data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
  364. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
  365. data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
  366. data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
  367. data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
  368. data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
  369. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
  370. data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
  371. data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
  372. data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
  373. data/ext/ice/cpp/src/Ice/Selector.h +231 -0
  374. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
  375. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
  376. data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
  377. data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
  378. data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
  379. data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
  380. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
  381. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
  382. data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
  383. data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
  384. data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
  385. data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
  386. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
  387. data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
  388. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
  389. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
  390. data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
  391. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
  392. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
  393. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
  394. data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
  395. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
  396. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
  397. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
  398. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
  399. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
  400. data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
  401. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
  402. data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
  403. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
  404. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
  405. data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
  406. data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
  407. data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
  408. data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
  409. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
  410. data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
  411. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
  412. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
  413. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
  414. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
  415. data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
  416. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
  417. data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
  418. data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
  419. data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
  420. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
  421. data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
  422. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
  423. data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
  424. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
  425. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
  426. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
  427. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
  428. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
  429. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
  430. data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
  431. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
  432. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
  433. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
  434. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
  435. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
  436. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
  437. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
  438. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
  439. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
  440. data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
  441. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
  442. data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
  443. data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
  444. data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
  445. data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
  446. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
  447. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
  448. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
  449. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
  450. data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
  451. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
  452. data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
  453. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
  454. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
  455. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
  456. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
  457. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
  458. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
  459. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
  460. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
  461. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
  462. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
  463. data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
  464. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
  465. data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
  466. data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
  467. data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
  468. data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
  469. data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
  470. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
  471. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
  472. data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
  473. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
  474. data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
  475. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
  476. data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
  477. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
  478. data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
  479. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
  480. data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
  481. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
  482. data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
  483. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
  484. data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
  485. data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
  486. data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
  487. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
  488. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
  489. data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
  490. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
  491. data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
  492. data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
  493. data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
  494. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
  495. data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
  496. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
  497. data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
  498. data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
  499. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
  500. data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
  501. data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
  502. data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
  503. data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
  504. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
  505. data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
  506. data/ext/ice/cpp/src/Slice/MD5.h +44 -0
  507. data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
  508. data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
  509. data/ext/ice/cpp/src/Slice/Makefile +65 -0
  510. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
  511. data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
  512. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
  513. data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
  514. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
  515. data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
  516. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
  517. data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
  518. data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
  519. data/ext/ice/mcpp/config.h.Darwin +227 -0
  520. data/ext/ice/mcpp/config.h.Linux +227 -0
  521. data/ext/ice/mcpp/config.h.MINGW +7 -0
  522. data/ext/ice/mcpp/configed.H +382 -0
  523. data/ext/ice/mcpp/directive.c +1699 -0
  524. data/ext/ice/mcpp/eval.c +1673 -0
  525. data/ext/ice/mcpp/expand.c +2980 -0
  526. data/ext/ice/mcpp/internal.H +564 -0
  527. data/ext/ice/mcpp/main.c +1131 -0
  528. data/ext/ice/mcpp/mbchar.c +869 -0
  529. data/ext/ice/mcpp/mcpp_lib.h +31 -0
  530. data/ext/ice/mcpp/mcpp_out.h +13 -0
  531. data/ext/ice/mcpp/support.c +2811 -0
  532. data/ext/ice/mcpp/system.H +396 -0
  533. data/ext/ice/mcpp/system.c +4940 -0
  534. data/ice.gemspec +41 -0
  535. data/lib/Glacier2.rb +12 -0
  536. data/lib/Glacier2/Metrics.rb +99 -0
  537. data/lib/Glacier2/PermissionsVerifier.rb +168 -0
  538. data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
  539. data/lib/Glacier2/Router.rb +141 -0
  540. data/lib/Glacier2/RouterF.rb +29 -0
  541. data/lib/Glacier2/SSLInfo.rb +79 -0
  542. data/lib/Glacier2/Session.rb +470 -0
  543. data/lib/Ice.rb +659 -0
  544. data/lib/Ice/BuiltinSequences.rb +64 -0
  545. data/lib/Ice/Communicator.rb +93 -0
  546. data/lib/Ice/CommunicatorF.rb +28 -0
  547. data/lib/Ice/Connection.rb +414 -0
  548. data/lib/Ice/ConnectionF.rb +36 -0
  549. data/lib/Ice/Current.rb +152 -0
  550. data/lib/Ice/Endpoint.rb +265 -0
  551. data/lib/Ice/EndpointF.rb +52 -0
  552. data/lib/Ice/EndpointTypes.rb +77 -0
  553. data/lib/Ice/FacetMap.rb +28 -0
  554. data/lib/Ice/Identity.rb +70 -0
  555. data/lib/Ice/ImplicitContext.rb +59 -0
  556. data/lib/Ice/ImplicitContextF.rb +28 -0
  557. data/lib/Ice/Instrumentation.rb +425 -0
  558. data/lib/Ice/InstrumentationF.rb +35 -0
  559. data/lib/Ice/LocalException.rb +1081 -0
  560. data/lib/Ice/Locator.rb +314 -0
  561. data/lib/Ice/LocatorF.rb +34 -0
  562. data/lib/Ice/Logger.rb +57 -0
  563. data/lib/Ice/LoggerF.rb +28 -0
  564. data/lib/Ice/Metrics.rb +696 -0
  565. data/lib/Ice/ObjectAdapterF.rb +28 -0
  566. data/lib/Ice/ObjectFactory.rb +53 -0
  567. data/lib/Ice/ObjectFactoryF.rb +28 -0
  568. data/lib/Ice/Plugin.rb +87 -0
  569. data/lib/Ice/PluginF.rb +32 -0
  570. data/lib/Ice/Process.rb +93 -0
  571. data/lib/Ice/ProcessF.rb +29 -0
  572. data/lib/Ice/Properties.rb +65 -0
  573. data/lib/Ice/PropertiesAdmin.rb +104 -0
  574. data/lib/Ice/PropertiesF.rb +33 -0
  575. data/lib/Ice/Router.rb +163 -0
  576. data/lib/Ice/RouterF.rb +29 -0
  577. data/lib/Ice/SliceChecksumDict.rb +28 -0
  578. data/lib/Ice/Version.rb +100 -0
  579. data/lib/IceBox.rb +10 -0
  580. data/lib/IceBox/IceBox.rb +272 -0
  581. data/lib/IceGrid.rb +17 -0
  582. data/lib/IceGrid/Admin.rb +1076 -0
  583. data/lib/IceGrid/Descriptor.rb +1505 -0
  584. data/lib/IceGrid/Exception.rb +401 -0
  585. data/lib/IceGrid/FileParser.rb +105 -0
  586. data/lib/IceGrid/Locator.rb +105 -0
  587. data/lib/IceGrid/Observer.rb +571 -0
  588. data/lib/IceGrid/Query.rb +168 -0
  589. data/lib/IceGrid/Registry.rb +120 -0
  590. data/lib/IceGrid/Session.rb +114 -0
  591. data/lib/IceGrid/UserAccountMapper.rb +101 -0
  592. data/lib/IcePatch2.rb +10 -0
  593. data/lib/IcePatch2/FileInfo.rb +75 -0
  594. data/lib/IcePatch2/FileServer.rb +141 -0
  595. data/lib/IceStorm.rb +11 -0
  596. data/lib/IceStorm/IceStorm.rb +463 -0
  597. data/lib/IceStorm/Metrics.rb +155 -0
  598. data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
  599. data/slice/Freeze/CatalogData.ice +49 -0
  600. data/slice/Freeze/Connection.ice +111 -0
  601. data/slice/Freeze/ConnectionF.ice +20 -0
  602. data/slice/Freeze/DB.ice +37 -0
  603. data/slice/Freeze/Evictor.ice +339 -0
  604. data/slice/Freeze/EvictorF.ice +22 -0
  605. data/slice/Freeze/EvictorStorage.ice +72 -0
  606. data/slice/Freeze/Exception.ice +100 -0
  607. data/slice/Freeze/Transaction.ice +57 -0
  608. data/slice/Freeze/TransactionalEvictor.ice +50 -0
  609. data/slice/Glacier2/Metrics.ice +77 -0
  610. data/slice/Glacier2/PermissionsVerifier.ice +105 -0
  611. data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
  612. data/slice/Glacier2/Router.ice +178 -0
  613. data/slice/Glacier2/RouterF.ice +20 -0
  614. data/slice/Glacier2/SSLInfo.ice +50 -0
  615. data/slice/Glacier2/Session.ice +273 -0
  616. data/slice/Ice/BuiltinSequences.ice +48 -0
  617. data/slice/Ice/Communicator.ice +567 -0
  618. data/slice/Ice/CommunicatorF.ice +20 -0
  619. data/slice/Ice/Connection.ice +323 -0
  620. data/slice/Ice/ConnectionF.ice +22 -0
  621. data/slice/Ice/Current.ice +160 -0
  622. data/slice/Ice/Endpoint.ice +227 -0
  623. data/slice/Ice/EndpointF.ice +32 -0
  624. data/slice/Ice/EndpointTypes.ice +38 -0
  625. data/slice/Ice/FacetMap.ice +25 -0
  626. data/slice/Ice/Identity.ice +59 -0
  627. data/slice/Ice/ImplicitContext.ice +109 -0
  628. data/slice/Ice/ImplicitContextF.ice +20 -0
  629. data/slice/Ice/Instrumentation.ice +499 -0
  630. data/slice/Ice/InstrumentationF.ice +26 -0
  631. data/slice/Ice/LocalException.ice +1015 -0
  632. data/slice/Ice/Locator.ice +227 -0
  633. data/slice/Ice/LocatorF.ice +21 -0
  634. data/slice/Ice/Logger.ice +86 -0
  635. data/slice/Ice/LoggerF.ice +20 -0
  636. data/slice/Ice/Metrics.ice +422 -0
  637. data/slice/Ice/ObjectAdapter.ice +673 -0
  638. data/slice/Ice/ObjectAdapterF.ice +20 -0
  639. data/slice/Ice/ObjectFactory.ice +60 -0
  640. data/slice/Ice/ObjectFactoryF.ice +20 -0
  641. data/slice/Ice/Plugin.ice +117 -0
  642. data/slice/Ice/PluginF.ice +21 -0
  643. data/slice/Ice/Process.ice +54 -0
  644. data/slice/Ice/ProcessF.ice +20 -0
  645. data/slice/Ice/Properties.ice +228 -0
  646. data/slice/Ice/PropertiesAdmin.ice +75 -0
  647. data/slice/Ice/PropertiesF.ice +21 -0
  648. data/slice/Ice/RemoteLogger.ice +232 -0
  649. data/slice/Ice/Router.ice +83 -0
  650. data/slice/Ice/RouterF.ice +20 -0
  651. data/slice/Ice/ServantLocator.ice +117 -0
  652. data/slice/Ice/ServantLocatorF.ice +20 -0
  653. data/slice/Ice/SliceChecksumDict.ice +25 -0
  654. data/slice/Ice/Version.ice +39 -0
  655. data/slice/IceBox/IceBox.ice +194 -0
  656. data/slice/IceDiscovery/IceDiscovery.ice +32 -0
  657. data/slice/IceGrid/Admin.ice +1578 -0
  658. data/slice/IceGrid/Descriptor.ice +1079 -0
  659. data/slice/IceGrid/Discovery.ice +73 -0
  660. data/slice/IceGrid/Exception.ice +383 -0
  661. data/slice/IceGrid/FileParser.ice +61 -0
  662. data/slice/IceGrid/Locator.ice +56 -0
  663. data/slice/IceGrid/Observer.ice +394 -0
  664. data/slice/IceGrid/PluginFacade.ice +316 -0
  665. data/slice/IceGrid/Query.ice +130 -0
  666. data/slice/IceGrid/Registry.ice +138 -0
  667. data/slice/IceGrid/Session.ice +124 -0
  668. data/slice/IceGrid/UserAccountMapper.ice +58 -0
  669. data/slice/IcePatch2/FileInfo.ice +49 -0
  670. data/slice/IcePatch2/FileServer.ice +129 -0
  671. data/slice/IceSSL/ConnectionInfo.ice +34 -0
  672. data/slice/IceSSL/EndpointInfo.ice +41 -0
  673. data/slice/IceStorm/IceStorm.ice +405 -0
  674. data/slice/IceStorm/Metrics.ice +71 -0
  675. 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
+ }