zeroc-ice 3.8.2 → 3.8.3

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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/dist/IceRuby/Communicator.cpp +26 -9
  3. data/dist/IceRuby/Config.h +0 -12
  4. data/dist/IceRuby/Connection.cpp +18 -9
  5. data/dist/IceRuby/DefaultSliceLoader.h +1 -1
  6. data/dist/IceRuby/Endpoint.cpp +21 -8
  7. data/dist/IceRuby/Operation.cpp +7 -5
  8. data/dist/IceRuby/Properties.cpp +3 -4
  9. data/dist/IceRuby/Proxy.cpp +11 -19
  10. data/dist/IceRuby/RubySliceLoader.cpp +1 -1
  11. data/dist/IceRuby/RubySliceLoader.h +6 -0
  12. data/dist/IceRuby/Types.cpp +162 -138
  13. data/dist/IceRuby/Types.h +68 -28
  14. data/dist/IceRuby/Util.cpp +14 -78
  15. data/dist/IceRuby/Util.h +7 -17
  16. data/dist/ice/cpp/include/Ice/Communicator.h +31 -8
  17. data/dist/ice/cpp/include/Ice/Config.h +2 -2
  18. data/dist/ice/cpp/include/Ice/Connection.h +24 -8
  19. data/dist/ice/cpp/include/Ice/CtrlCHandler.h +1 -1
  20. data/dist/ice/cpp/include/Ice/Demangle.h +1 -1
  21. data/dist/ice/cpp/include/Ice/Endpoint.h +4 -4
  22. data/dist/ice/cpp/include/Ice/Initialize.h +4 -4
  23. data/dist/ice/cpp/include/Ice/InputStream.h +5 -5
  24. data/dist/ice/cpp/include/Ice/Instrumentation.h +13 -7
  25. data/dist/ice/cpp/include/Ice/LocalExceptions.h +5 -5
  26. data/dist/ice/cpp/include/Ice/Logger.h +7 -0
  27. data/dist/ice/cpp/include/Ice/LoggerUtil.h +1 -1
  28. data/dist/ice/cpp/include/Ice/Object.h +10 -8
  29. data/dist/ice/cpp/include/Ice/ObjectAdapter.h +1 -1
  30. data/dist/ice/cpp/include/Ice/OutgoingAsync.h +5 -2
  31. data/dist/ice/cpp/include/Ice/OutgoingResponse.h +2 -1
  32. data/dist/ice/cpp/include/Ice/OutputStream.h +7 -6
  33. data/dist/ice/cpp/include/Ice/PluginFactory.h +1 -1
  34. data/dist/ice/cpp/include/Ice/Properties.h +3 -3
  35. data/dist/ice/cpp/include/Ice/Proxy.h +192 -50
  36. data/dist/ice/cpp/include/Ice/SSL/ClientAuthenticationOptions.h +3 -3
  37. data/dist/ice/cpp/include/Ice/SSL/EndpointInfo.h +1 -1
  38. data/dist/ice/cpp/include/Ice/SSL/ServerAuthenticationOptions.h +5 -5
  39. data/dist/ice/cpp/include/Ice/ServantLocator.h +1 -1
  40. data/dist/ice/cpp/include/Ice/Service.h +2 -5
  41. data/dist/ice/cpp/include/Ice/SliceLoader.h +1 -1
  42. data/dist/ice/cpp/include/Ice/SlicedData.h +5 -3
  43. data/dist/ice/cpp/include/Ice/StreamHelpers.h +1 -1
  44. data/dist/ice/cpp/include/Ice/StreamableTraits.h +2 -2
  45. data/dist/ice/cpp/include/Ice/StringConverter.h +2 -3
  46. data/dist/ice/cpp/include/Ice/StringUtil.h +2 -7
  47. data/dist/ice/cpp/include/Ice/UUID.h +1 -0
  48. data/dist/ice/cpp/include/Ice/Value.h +2 -2
  49. data/dist/ice/cpp/include/generated/Ice/BuiltinSequences.h +2 -2
  50. data/dist/ice/cpp/include/generated/Ice/Context.h +2 -2
  51. data/dist/ice/cpp/include/generated/Ice/EndpointTypes.h +2 -2
  52. data/dist/ice/cpp/include/generated/Ice/Identity.h +2 -2
  53. data/dist/ice/cpp/include/generated/Ice/Locator.h +50 -14
  54. data/dist/ice/cpp/include/generated/Ice/LocatorRegistry.h +38 -11
  55. data/dist/ice/cpp/include/generated/Ice/Metrics.h +94 -39
  56. data/dist/ice/cpp/include/generated/Ice/OperationMode.h +2 -2
  57. data/dist/ice/cpp/include/generated/Ice/Process.h +34 -8
  58. data/dist/ice/cpp/include/generated/Ice/PropertiesAdmin.h +42 -11
  59. data/dist/ice/cpp/include/generated/Ice/PropertyDict.h +2 -2
  60. data/dist/ice/cpp/include/generated/Ice/RemoteLogger.h +93 -40
  61. data/dist/ice/cpp/include/generated/Ice/ReplyStatus.h +2 -2
  62. data/dist/ice/cpp/include/generated/Ice/Router.h +50 -14
  63. data/dist/ice/cpp/include/generated/Ice/SliceChecksumDict.h +2 -2
  64. data/dist/ice/cpp/include/generated/Ice/Version.h +2 -2
  65. data/dist/ice/cpp/include/generated/IceDiscovery/Lookup.h +66 -14
  66. data/dist/ice/cpp/include/generated/IceLocatorDiscovery/Lookup.h +34 -8
  67. data/dist/ice/cpp/src/Ice/AddDefaultPluginFactories_all.cpp +1 -1
  68. data/dist/ice/cpp/src/Ice/Base64.cpp +47 -137
  69. data/dist/ice/cpp/src/Ice/Base64.h +2 -2
  70. data/dist/ice/cpp/src/Ice/BatchRequestQueue.cpp +28 -13
  71. data/dist/ice/cpp/src/Ice/BatchRequestQueue.h +5 -1
  72. data/dist/ice/cpp/src/Ice/Buffer.cpp +1 -1
  73. data/dist/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +1 -1
  74. data/dist/ice/cpp/src/Ice/CollocatedRequestHandler.h +1 -1
  75. data/dist/ice/cpp/src/Ice/Communicator.cpp +4 -3
  76. data/dist/ice/cpp/src/Ice/CommunicatorFlushBatchAsync.cpp +8 -0
  77. data/dist/ice/cpp/src/Ice/ConnectRequestHandler.cpp +5 -15
  78. data/dist/ice/cpp/src/Ice/ConnectRequestHandler.h +1 -1
  79. data/dist/ice/cpp/src/Ice/ConnectionFactory.cpp +6 -8
  80. data/dist/ice/cpp/src/Ice/ConnectionFactory.h +0 -3
  81. data/dist/ice/cpp/src/Ice/ConnectionI.cpp +94 -99
  82. data/dist/ice/cpp/src/Ice/ConnectionI.h +11 -8
  83. data/dist/ice/cpp/src/Ice/ConsoleUtil.cpp +1 -1
  84. data/dist/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +10 -14
  85. data/dist/ice/cpp/src/Ice/EndpointI.h +1 -1
  86. data/dist/ice/cpp/src/Ice/FileUtil.cpp +12 -12
  87. data/dist/ice/cpp/src/Ice/FixedRequestHandler.cpp +1 -1
  88. data/dist/ice/cpp/src/Ice/FixedRequestHandler.h +1 -1
  89. data/dist/ice/cpp/src/Ice/HttpParser.h +0 -2
  90. data/dist/ice/cpp/src/Ice/IdleTimeoutTransceiverDecorator.cpp +6 -3
  91. data/dist/ice/cpp/src/Ice/IncomingRequest.cpp +1 -3
  92. data/dist/ice/cpp/src/Ice/InputStream.cpp +23 -19
  93. data/dist/ice/cpp/src/Ice/Instance.cpp +73 -50
  94. data/dist/ice/cpp/src/Ice/Instance.h +1 -6
  95. data/dist/ice/cpp/src/Ice/LocalExceptions.cpp +1 -1
  96. data/dist/ice/cpp/src/Ice/LocatorInfo.cpp +2 -2
  97. data/dist/ice/cpp/src/Ice/LoggerAdminI.cpp +13 -18
  98. data/dist/ice/cpp/src/Ice/LoggerI.cpp +1 -1
  99. data/dist/ice/cpp/src/Ice/LoggerI.h +2 -2
  100. data/dist/ice/cpp/src/Ice/MetricsAdminI.h +6 -1
  101. data/dist/ice/cpp/src/Ice/MetricsObserverI.h +22 -18
  102. data/dist/ice/cpp/src/Ice/NativePropertiesAdmin.cpp +5 -2
  103. data/dist/ice/cpp/src/Ice/Network.cpp +168 -103
  104. data/dist/ice/cpp/src/Ice/Network.h +12 -7
  105. data/dist/ice/cpp/src/Ice/NetworkProxy.cpp +17 -6
  106. data/dist/ice/cpp/src/Ice/NetworkProxy.h +2 -1
  107. data/dist/ice/cpp/src/Ice/Object.cpp +1 -1
  108. data/dist/ice/cpp/src/Ice/ObjectAdapterI.cpp +56 -19
  109. data/dist/ice/cpp/src/Ice/OpaqueEndpointI.cpp +10 -10
  110. data/dist/ice/cpp/src/Ice/Options.cpp +7 -2
  111. data/dist/ice/cpp/src/Ice/OutgoingAsync.cpp +1 -1
  112. data/dist/ice/cpp/src/Ice/OutputStream.cpp +4 -4
  113. data/dist/ice/cpp/src/Ice/PluginManagerI.cpp +7 -1
  114. data/dist/ice/cpp/src/Ice/Properties.cpp +26 -16
  115. data/dist/ice/cpp/src/Ice/PropertyUtil.cpp +1 -1
  116. data/dist/ice/cpp/src/Ice/ProtocolInstance.cpp +0 -11
  117. data/dist/ice/cpp/src/Ice/ProtocolInstance.h +1 -2
  118. data/dist/ice/cpp/src/Ice/Proxy.cpp +9 -1
  119. data/dist/ice/cpp/src/Ice/ProxyAsync.cpp +110 -13
  120. data/dist/ice/cpp/src/Ice/Random.cpp +68 -7
  121. data/dist/ice/cpp/src/Ice/Random.h +6 -2
  122. data/dist/ice/cpp/src/Ice/Reference.cpp +22 -11
  123. data/dist/ice/cpp/src/Ice/Reference.h +3 -0
  124. data/dist/ice/cpp/src/Ice/ReferenceFactory.cpp +10 -0
  125. data/dist/ice/cpp/src/Ice/RequestHandler.h +3 -1
  126. data/dist/ice/cpp/src/Ice/RequestHandlerCache.cpp +1 -1
  127. data/dist/ice/cpp/src/Ice/RequestHandlerCache.h +1 -1
  128. data/dist/ice/cpp/src/Ice/ResourceConfig.h +3 -3
  129. data/dist/ice/cpp/src/Ice/RetryQueue.cpp +8 -12
  130. data/dist/ice/cpp/src/Ice/SHA1.cpp +11 -11
  131. data/dist/ice/cpp/src/Ice/SSL/DistinguishedName.cpp +0 -6
  132. data/dist/ice/cpp/src/Ice/SSL/DistinguishedName.h +0 -6
  133. data/dist/ice/cpp/src/Ice/SSL/OpenSSLEngine.cpp +15 -1
  134. data/dist/ice/cpp/src/Ice/SSL/OpenSSLTransceiverI.cpp +77 -27
  135. data/dist/ice/cpp/src/Ice/SSL/OpenSSLTransceiverI.h +2 -1
  136. data/dist/ice/cpp/src/Ice/SSL/RFC2253.cpp +2 -2
  137. data/dist/ice/cpp/src/Ice/SSL/SSLUtil.cpp +39 -34
  138. data/dist/ice/cpp/src/Ice/SSL/SchannelEngine.cpp +130 -52
  139. data/dist/ice/cpp/src/Ice/SSL/SchannelTransceiverI.cpp +64 -33
  140. data/dist/ice/cpp/src/Ice/SSL/SchannelTransceiverI.h +0 -1
  141. data/dist/ice/cpp/src/Ice/SSL/SecureTransportEngine.cpp +3 -3
  142. data/dist/ice/cpp/src/Ice/SSL/SecureTransportTransceiverI.cpp +9 -3
  143. data/dist/ice/cpp/src/Ice/SSL/SecureTransportUtil.cpp +73 -51
  144. data/dist/ice/cpp/src/Ice/SSL/SecureTransportUtil.h +0 -8
  145. data/dist/ice/cpp/src/Ice/Selector.cpp +13 -11
  146. data/dist/ice/cpp/src/Ice/ServantManager.cpp +3 -3
  147. data/dist/ice/cpp/src/Ice/Service.cpp +33 -115
  148. data/dist/ice/cpp/src/Ice/StreamSocket.cpp +33 -40
  149. data/dist/ice/cpp/src/Ice/StreamSocket.h +4 -4
  150. data/dist/ice/cpp/src/Ice/StringConverter.cpp +1 -1
  151. data/dist/ice/cpp/src/Ice/StringUtil.cpp +12 -21
  152. data/dist/ice/cpp/src/Ice/SysLoggerI.cpp +136 -100
  153. data/dist/ice/cpp/src/Ice/SysLoggerI.h +7 -3
  154. data/dist/ice/cpp/src/Ice/SystemdJournalI.cpp +1 -1
  155. data/dist/ice/cpp/src/Ice/TcpAcceptor.cpp +7 -7
  156. data/dist/ice/cpp/src/Ice/TcpAcceptor.h +2 -1
  157. data/dist/ice/cpp/src/Ice/TcpBufSize.h +40 -0
  158. data/dist/ice/cpp/src/Ice/TcpConnector.cpp +5 -2
  159. data/dist/ice/cpp/src/Ice/TcpConnector.h +2 -0
  160. data/dist/ice/cpp/src/Ice/TcpTransceiver.cpp +6 -2
  161. data/dist/ice/cpp/src/Ice/ThreadPool.cpp +2 -8
  162. data/dist/ice/cpp/src/Ice/ThreadPool.h +0 -2
  163. data/dist/ice/cpp/src/Ice/Timer.cpp +7 -3
  164. data/dist/ice/cpp/src/Ice/UUID.cpp +1 -2
  165. data/dist/ice/cpp/src/Ice/UdpEndpointI.cpp +4 -1
  166. data/dist/ice/cpp/src/Ice/UdpTransceiver.cpp +136 -123
  167. data/dist/ice/cpp/src/Ice/UdpTransceiver.h +3 -4
  168. data/dist/ice/cpp/src/Ice/WSTransceiver.cpp +96 -27
  169. data/dist/ice/cpp/src/Ice/WSTransceiver.h +1 -1
  170. data/dist/ice/cpp/src/Ice/generated/BuiltinSequences.cpp +2 -2
  171. data/dist/ice/cpp/src/Ice/generated/Context.cpp +2 -2
  172. data/dist/ice/cpp/src/Ice/generated/EndpointTypes.cpp +2 -2
  173. data/dist/ice/cpp/src/Ice/generated/Identity.cpp +2 -2
  174. data/dist/ice/cpp/src/Ice/generated/Locator.cpp +2 -2
  175. data/dist/ice/cpp/src/Ice/generated/LocatorRegistry.cpp +2 -2
  176. data/dist/ice/cpp/src/Ice/generated/Metrics.cpp +2 -2
  177. data/dist/ice/cpp/src/Ice/generated/OperationMode.cpp +2 -2
  178. data/dist/ice/cpp/src/Ice/generated/Process.cpp +2 -2
  179. data/dist/ice/cpp/src/Ice/generated/PropertiesAdmin.cpp +2 -2
  180. data/dist/ice/cpp/src/Ice/generated/PropertyDict.cpp +2 -2
  181. data/dist/ice/cpp/src/Ice/generated/RemoteLogger.cpp +2 -2
  182. data/dist/ice/cpp/src/Ice/generated/ReplyStatus.cpp +2 -2
  183. data/dist/ice/cpp/src/Ice/generated/Router.cpp +2 -2
  184. data/dist/ice/cpp/src/Ice/generated/SliceChecksumDict.cpp +2 -2
  185. data/dist/ice/cpp/src/Ice/generated/Version.cpp +2 -2
  186. data/dist/ice/cpp/src/IceDiscovery/LookupI.cpp +47 -9
  187. data/dist/ice/cpp/src/IceDiscovery/LookupI.h +8 -3
  188. data/dist/ice/cpp/src/IceDiscovery/generated/Lookup.cpp +2 -2
  189. data/dist/ice/cpp/src/IceLocatorDiscovery/PluginI.cpp +43 -14
  190. data/dist/ice/cpp/src/IceLocatorDiscovery/generated/Lookup.cpp +2 -2
  191. data/dist/ice/cpp/src/Slice/DocCommentParser.cpp +26 -20
  192. data/dist/ice/cpp/src/Slice/DocCommentParser.h +2 -2
  193. data/dist/ice/cpp/src/Slice/FileTracker.cpp +3 -11
  194. data/dist/ice/cpp/src/Slice/FileTracker.h +0 -2
  195. data/dist/ice/cpp/src/Slice/Grammar.cpp +211 -210
  196. data/dist/ice/cpp/src/Slice/MetadataValidation.cpp +10 -9
  197. data/dist/ice/cpp/src/Slice/Parser.cpp +28 -20
  198. data/dist/ice/cpp/src/Slice/Parser.h +3 -4
  199. data/dist/ice/cpp/src/Slice/Preprocessor.cpp +3 -11
  200. data/dist/ice/cpp/src/Slice/Preprocessor.h +0 -2
  201. data/dist/ice/cpp/src/Slice/Scanner.cpp +3 -3
  202. data/dist/ice/cpp/src/Slice/SliceUtil.cpp +197 -114
  203. data/dist/ice/cpp/src/Slice/StringLiteralUtil.cpp +0 -2
  204. data/dist/ice/cpp/src/Slice/Util.h +21 -9
  205. data/dist/ice/cpp/src/slice2rb/Ruby.cpp +7 -3
  206. data/dist/ice/cpp/src/slice2rb/RubyUtil.cpp +16 -12
  207. data/dist/ice/cpp/src/slice2rb/RubyUtil.h +3 -3
  208. data/dist/ice/slice/Glacier2/Router.ice +3 -3
  209. data/dist/ice/slice/Ice/Metrics.ice +6 -5
  210. data/dist/ice/slice/Ice/RemoteLogger.ice +5 -5
  211. data/dist/ice/slice/IceGrid/Admin.ice +9 -9
  212. data/dist/ice/slice/IceGrid/Descriptor.ice +5 -5
  213. data/dist/ice/slice/IceStorm/Metrics.ice +1 -1
  214. data/dist/lib/Glacier2/Metrics.rb +1 -1
  215. data/dist/lib/Glacier2/PermissionsVerifier.rb +1 -1
  216. data/dist/lib/Glacier2/Router.rb +2 -2
  217. data/dist/lib/Glacier2/SSLInfo.rb +1 -1
  218. data/dist/lib/Glacier2/Session.rb +1 -1
  219. data/dist/lib/Ice/BuiltinSequences.rb +1 -1
  220. data/dist/lib/Ice/CompressBatch.rb +1 -2
  221. data/dist/lib/Ice/Context.rb +1 -1
  222. data/dist/lib/Ice/EndpointSelectionType.rb +1 -2
  223. data/dist/lib/Ice/EndpointTypes.rb +1 -1
  224. data/dist/lib/Ice/Identity.rb +1 -1
  225. data/dist/lib/Ice/IdentitySpaceship.rb +1 -0
  226. data/dist/lib/Ice/Locator.rb +1 -1
  227. data/dist/lib/Ice/LocatorRegistry.rb +1 -1
  228. data/dist/lib/Ice/Metrics.rb +1 -1
  229. data/dist/lib/Ice/OperationMode.rb +2 -3
  230. data/dist/lib/Ice/Process.rb +1 -1
  231. data/dist/lib/Ice/PropertiesAdmin.rb +1 -1
  232. data/dist/lib/Ice/PropertyDict.rb +1 -1
  233. data/dist/lib/Ice/RemoteLogger.rb +2 -3
  234. data/dist/lib/Ice/ReplyStatus.rb +2 -3
  235. data/dist/lib/Ice/Router.rb +1 -1
  236. data/dist/lib/Ice/SliceChecksumDict.rb +1 -1
  237. data/dist/lib/Ice/SliceUtil.rb +2 -2
  238. data/dist/lib/Ice/Struct.rb +1 -0
  239. data/dist/lib/Ice/ToStringMode.rb +1 -2
  240. data/dist/lib/Ice/Value.rb +2 -2
  241. data/dist/lib/Ice/Version.rb +1 -1
  242. data/dist/lib/IceBox/ServiceManager.rb +1 -1
  243. data/dist/lib/IceGrid/Admin.rb +3 -4
  244. data/dist/lib/IceGrid/Descriptor.rb +1 -1
  245. data/dist/lib/IceGrid/Exception.rb +1 -1
  246. data/dist/lib/IceGrid/FileParser.rb +1 -1
  247. data/dist/lib/IceGrid/Registry.rb +2 -3
  248. data/dist/lib/IceGrid/Session.rb +2 -2
  249. data/dist/lib/IceGrid/UserAccountMapper.rb +1 -1
  250. data/dist/lib/IceStorm/IceStorm.rb +1 -1
  251. data/dist/lib/IceStorm/Metrics.rb +1 -1
  252. data/extconf.rb +1 -1
  253. data/ice.gemspec +3 -3
  254. metadata +4 -5
  255. data/dist/ice/cpp/src/Ice/DLLMain.cpp +0 -40
  256. data/dist/ice/cpp/src/Ice/UndefSysMacros.h +0 -37
@@ -1,6 +1,6 @@
1
1
  // Copyright (c) ZeroC, Inc.
2
2
 
3
- // slice2cpp version 3.8.2
3
+ // slice2cpp version 3.8.3
4
4
  // <auto-generated>Generated from Slice file 'Lookup.ice'.</auto-generated>
5
5
  // clang-format off
6
6
 
@@ -18,7 +18,7 @@
18
18
  # if ICE_INT_VERSION % 100 >= 50
19
19
  # error Beta header file detected
20
20
  # endif
21
- # if ICE_INT_VERSION % 100 < 2
21
+ # if ICE_INT_VERSION % 100 < 3
22
22
  # error Ice patch level mismatch!
23
23
  # endif
24
24
  #endif
@@ -94,11 +94,24 @@ namespace IceLocatorDiscovery
94
94
 
95
95
  /// Provides a reply to a ::IceLocatorDiscovery::LookupPrx::findLocator request.
96
96
  /// @param prx The proxy of the locator.
97
- /// @param response The response callback.
98
- /// @param exception The exception callback.
99
- /// @param sent The sent callback.
97
+ /// @param response The response callback. The Ice runtime calls this function from an Ice thread pool
98
+ /// thread. If you set Ice::InitializationData::executor, the executor determines the thread that executes this
99
+ /// function.
100
+ /// @param exception The exception callback. The Ice runtime calls this function from an Ice thread pool
101
+ /// thread. If you set Ice::InitializationData::executor, the executor determines the thread that executes this
102
+ /// function.
103
+ /// @param sent The sent callback. The Ice runtime calls this function when the request is accepted by the
104
+ /// transport. When the request is accepted synchronously, the Ice runtime calls this function from the current
105
+ /// thread and passes `true` as argument. When the request is accepted asynchronously, the Ice runtime calls
106
+ /// this function from an Ice thread pool thread and passes `false` as argument. If you set
107
+ /// Ice::InitializationData::executor, the executor determines the thread that executes this function in the
108
+ /// asynchronous case.
100
109
  /// @param context The request context.
101
110
  /// @return A function that can be called to cancel the invocation locally.
111
+ /// @remark When this proxy is a oneway or datagram proxy, the Ice runtime does not call the response
112
+ /// callback: a successful invocation completes with the sent callback. When this proxy is a batch
113
+ /// proxy, this function only adds the request to the batch: the Ice runtime calls none of the
114
+ /// callbacks, and the request is sent later, by a flush.
102
115
  // NOLINTNEXTLINE(modernize-use-nodiscard)
103
116
  std::function<void()> foundLocatorAsync(const std::optional<::Ice::LocatorPrx>& prx, std::function<void()> response, std::function<void(std::exception_ptr)> exception = nullptr, std::function<void(bool)> sent = nullptr, const Ice::Context& context = Ice::noExplicitContext) const;
104
117
 
@@ -190,11 +203,24 @@ namespace IceLocatorDiscovery
190
203
  /// @param instanceName Restrict the search to Ice registries configured with the given instance name. If
191
204
  /// empty, all the available registries will reply.
192
205
  /// @param reply The reply object to use to send the reply.
193
- /// @param response The response callback.
194
- /// @param exception The exception callback.
195
- /// @param sent The sent callback.
206
+ /// @param response The response callback. The Ice runtime calls this function from an Ice thread pool
207
+ /// thread. If you set Ice::InitializationData::executor, the executor determines the thread that executes this
208
+ /// function.
209
+ /// @param exception The exception callback. The Ice runtime calls this function from an Ice thread pool
210
+ /// thread. If you set Ice::InitializationData::executor, the executor determines the thread that executes this
211
+ /// function.
212
+ /// @param sent The sent callback. The Ice runtime calls this function when the request is accepted by the
213
+ /// transport. When the request is accepted synchronously, the Ice runtime calls this function from the current
214
+ /// thread and passes `true` as argument. When the request is accepted asynchronously, the Ice runtime calls
215
+ /// this function from an Ice thread pool thread and passes `false` as argument. If you set
216
+ /// Ice::InitializationData::executor, the executor determines the thread that executes this function in the
217
+ /// asynchronous case.
196
218
  /// @param context The request context.
197
219
  /// @return A function that can be called to cancel the invocation locally.
220
+ /// @remark When this proxy is a oneway or datagram proxy, the Ice runtime does not call the response
221
+ /// callback: a successful invocation completes with the sent callback. When this proxy is a batch
222
+ /// proxy, this function only adds the request to the batch: the Ice runtime calls none of the
223
+ /// callbacks, and the request is sent later, by a flush.
198
224
  // NOLINTNEXTLINE(modernize-use-nodiscard)
199
225
  std::function<void()> findLocatorAsync(std::string_view instanceName, const std::optional<LookupReplyPrx>& reply, std::function<void()> response, std::function<void(std::exception_ptr)> exception = nullptr, std::function<void(bool)> sent = nullptr, const Ice::Context& context = Ice::noExplicitContext) const;
200
226
 
@@ -9,7 +9,7 @@ using namespace std;
9
9
  void
10
10
  IceInternal::addDefaultPluginFactories(vector<Ice::PluginFactory>& pluginFactories)
11
11
  {
12
- // These built-in plug-ins are always available and not returned by a Ice::namePluginFactory function.
12
+ // These built-in plug-ins are always available and not returned by an Ice::namePluginFactory function.
13
13
  vector<Ice::PluginFactory> defaultPluginFactories{{Ice::tcpPluginFactory(), Ice::sslPluginFactory()}};
14
14
 
15
15
  Ice::PluginFactory udpPluginFactory{Ice::udpPluginFactory()};
@@ -2,72 +2,48 @@
2
2
 
3
3
  #include "Base64.h"
4
4
 
5
+ #include <algorithm>
6
+ #include <cctype>
5
7
  #include <cstddef>
6
8
  #include <iterator>
9
+ #include <sstream>
7
10
 
8
11
  using namespace std;
9
12
 
10
13
  string
11
14
  IceInternal::Base64::encode(const vector<byte>& plainSeq)
12
15
  {
16
+ // Reserve the exact amount of space needed for the returned base64 string.
13
17
  string retval;
14
-
15
- if (plainSeq.size() == 0)
16
- {
17
- return retval;
18
- }
19
-
20
- // Reserve enough space for the returned base64 string
21
- size_t base64Bytes = (((plainSeq.size() * 4) / 3) + 1);
22
- size_t newlineBytes = (((base64Bytes * 2) / 76) + 1);
23
- size_t totalBytes = base64Bytes + newlineBytes;
24
-
25
- retval.reserve(totalBytes);
26
-
27
- byte by1 = byte{0};
28
- byte by2 = byte{0};
29
- byte by3 = byte{0};
30
- byte by4 = byte{0};
31
- byte by5 = byte{0};
32
- byte by6 = byte{0};
33
- byte by7 = byte{0};
18
+ retval.reserve(((plainSeq.size() + 2) / 3) * 4);
34
19
 
35
20
  for (size_t i = 0; i < plainSeq.size(); i += 3)
36
21
  {
37
- by1 = plainSeq[i];
38
- by2 = byte{0};
39
- by3 = byte{0};
40
-
22
+ byte by1 = plainSeq[i];
23
+ byte by2 = byte{0};
24
+ byte by3 = byte{0};
41
25
  if ((i + 1) < plainSeq.size())
42
26
  {
43
27
  by2 = plainSeq[i + 1];
44
28
  }
45
-
46
29
  if ((i + 2) < plainSeq.size())
47
30
  {
48
31
  by3 = plainSeq[i + 2];
49
32
  }
50
33
 
51
- by4 = by1 >> 2;
52
- by5 = (by1 & byte{0x3}) << 4 | (by2 >> 4);
53
- by6 = (by2 & byte{0xf}) << 2 | (by3 >> 6);
54
- by7 = by3 & byte{0x3f};
55
-
56
- retval += encode(by4);
57
- retval += encode(by5);
58
-
34
+ retval += encode(by1 >> 2);
35
+ retval += encode((by1 & byte{0x3}) << 4 | (by2 >> 4));
59
36
  if ((i + 1) < plainSeq.size())
60
37
  {
61
- retval += encode(by6);
38
+ retval += encode((by2 & byte{0xf}) << 2 | (by3 >> 6));
62
39
  }
63
40
  else
64
41
  {
65
42
  retval += "=";
66
43
  }
67
-
68
44
  if ((i + 2) < plainSeq.size())
69
45
  {
70
- retval += encode(by7);
46
+ retval += encode(by3 & byte{0x3f});
71
47
  }
72
48
  else
73
49
  {
@@ -75,96 +51,60 @@ IceInternal::Base64::encode(const vector<byte>& plainSeq)
75
51
  }
76
52
  }
77
53
 
78
- string outString;
79
- outString.reserve(totalBytes);
80
- string::iterator iter = retval.begin();
81
-
82
- while ((retval.end() - iter) > 76)
83
- {
84
- copy(iter, iter + 76, back_inserter(outString));
85
- outString += "\r\n";
86
- iter += 76;
87
- }
88
-
89
- copy(iter, retval.end(), back_inserter(outString));
90
-
91
- return outString;
54
+ return retval;
92
55
  }
93
56
 
94
57
  vector<byte>
95
- IceInternal::Base64::decode(const string& str)
58
+ IceInternal::Base64::decode(string str)
96
59
  {
97
- string newStr;
98
-
99
- newStr.reserve(str.length());
60
+ // First, remove any whitespace from the string.
61
+ auto it = std::remove_if(str.begin(), str.end(), [](unsigned char c) { return std::isspace(c); });
62
+ str.erase(it, str.end());
100
63
 
101
- for (size_t j = 0; j < str.length(); j++)
64
+ // Reject any non-base64 characters.
65
+ auto paddingStart = str.begin() + static_cast<ptrdiff_t>(str.find_last_not_of('=') + 1);
66
+ it = std::find_if_not(str.begin(), paddingStart, isBase64);
67
+ if (it != paddingStart)
102
68
  {
103
- if (isBase64(str[j]))
104
- {
105
- newStr += str[j];
106
- }
69
+ ostringstream os;
70
+ os << "invalid base64 character '" << *it << "' (ordinal " << +static_cast<unsigned char>(*it) << ")";
71
+ throw std::invalid_argument(os.str());
107
72
  }
108
-
109
- vector<byte> retval;
110
-
111
- if (newStr.length() == 0)
73
+ // Reject bad padding. There can be at most 2 padding characters, and it must make the total length a multiple of 4.
74
+ if (paddingStart != str.end() && (str.end() - paddingStart > 2 || (str.size() % 4) != 0))
112
75
  {
113
- return retval;
76
+ throw std::invalid_argument("invalid base64 padding");
114
77
  }
78
+ // Drop any padding characters at this point.
79
+ str.erase(paddingStart, str.end());
115
80
 
116
- // Note: This is how we were previously computing the size of the return
117
- // sequence. The method below is more efficient (and correct).
118
- // size_t lines = str.size() / 78;
119
- // size_t totalBytes = (lines * 76) + (((str.size() - (lines * 78)) * 3) / 4);
120
-
121
- // Figure out how long the final sequence is going to be.
122
- size_t totalBytes = (newStr.size() * 3 / 4) + 1;
123
-
124
- retval.reserve(totalBytes);
125
-
126
- byte by1{0};
127
- byte by2{0};
128
- byte by3{0};
129
- byte by4{0};
130
-
131
- char c1, c2, c3, c4;
132
-
133
- for (size_t i = 0; i < newStr.length(); i += 4)
81
+ // Reject any base64 strings with only 1 out of 4 characters in the final sequence.
82
+ // The final sequence may have 2, 3, or 4 characters, but 1 can't encode a full byte.
83
+ if (str.length() % 4 == 1)
134
84
  {
135
- c2 = 'A';
136
- c3 = 'A';
137
- c4 = 'A';
138
-
139
- c1 = newStr[i];
140
-
141
- if ((i + 1) < newStr.length())
142
- {
143
- c2 = newStr[i + 1];
144
- }
85
+ throw std::invalid_argument("invalid base64 string length");
86
+ }
145
87
 
146
- if ((i + 2) < newStr.length())
147
- {
148
- c3 = newStr[i + 2];
149
- }
88
+ vector<byte> retval;
89
+ retval.reserve((str.length() * 3) / 4);
150
90
 
151
- if ((i + 3) < newStr.length())
152
- {
153
- c4 = newStr[i + 3];
154
- }
91
+ for (size_t i = 0; i < str.length(); i += 4)
92
+ {
93
+ const char c1 = str[i];
94
+ const char c2 = str[i + 1]; // Guaranteed okay because of the 'str.length() % 4 == 1' check above.
95
+ const char c3 = ((i + 2) < str.length()) ? str[i + 2] : '=';
96
+ const char c4 = ((i + 3) < str.length()) ? str[i + 3] : '=';
155
97
 
156
- by1 = decode(c1);
157
- by2 = decode(c2);
158
- by3 = decode(c3);
159
- by4 = decode(c4);
98
+ const byte by1 = decode(c1);
99
+ const byte by2 = decode(c2);
100
+ const byte by3 = decode(c3);
101
+ const byte by4 = decode(c4);
160
102
 
161
103
  retval.push_back((by1 << 2) | by2 >> 4);
162
-
163
104
  if (c3 != '=')
164
105
  {
165
106
  retval.push_back(((by2 & byte{0xf}) << 4) | (by3 >> 2));
166
107
  }
167
-
168
108
  if (c4 != '=')
169
109
  {
170
110
  retval.push_back(((by3 & byte{0x3}) << 6) | by4);
@@ -177,37 +117,7 @@ IceInternal::Base64::decode(const string& str)
177
117
  bool
178
118
  IceInternal::Base64::isBase64(char c)
179
119
  {
180
- if (c >= 'A' && c <= 'Z')
181
- {
182
- return true;
183
- }
184
-
185
- if (c >= 'a' && c <= 'z')
186
- {
187
- return true;
188
- }
189
-
190
- if (c >= '0' && c <= '9')
191
- {
192
- return true;
193
- }
194
-
195
- if (c == '+')
196
- {
197
- return true;
198
- }
199
-
200
- if (c == '/')
201
- {
202
- return true;
203
- }
204
-
205
- if (c == '=')
206
- {
207
- return true;
208
- }
209
-
210
- return false;
120
+ return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/';
211
121
  }
212
122
 
213
123
  char
@@ -14,10 +14,10 @@ namespace IceInternal
14
14
  {
15
15
  public:
16
16
  static std::string encode(const std::vector<std::byte>&);
17
- static std::vector<std::byte> decode(const std::string&);
18
- static bool isBase64(char);
17
+ static std::vector<std::byte> decode(std::string);
19
18
 
20
19
  private:
20
+ static bool isBase64(char);
21
21
  static char encode(std::byte);
22
22
  static std::byte decode(char);
23
23
  };
@@ -79,17 +79,19 @@ BatchRequestQueue::prepareBatchRequest(OutputStream* os)
79
79
  void
80
80
  BatchRequestQueue::finishBatchRequest(OutputStream* os, const Ice::ObjectPrx& proxy, string_view operation)
81
81
  {
82
- //
83
- // No need for synchronization, no other threads are supposed
84
- // to modify the queue since we set _batchStreamInUse to true.
85
- //
86
- assert(_batchStreamInUse);
87
- _batchStream.swap(*os);
82
+ {
83
+ // Bring the request stream back and become the owner so this thread's own auto-flush below can
84
+ // re-enter swap(). swap() lets only _batchStreamOwnerId through while the stream is in use, and only
85
+ // after passing that gate does it read the queue's bookkeeping; no other thread can touch the queue,
86
+ // so the mutations below need no further synchronization.
87
+ lock_guard lock(_mutex);
88
+ assert(_batchStreamInUse);
89
+ _batchStream.swap(*os);
90
+ _batchStreamOwnerId = std::this_thread::get_id();
91
+ }
88
92
 
89
93
  try
90
94
  {
91
- _batchStreamCanFlush = true; // Allow flush to proceed even if the stream is marked in use.
92
-
93
95
  if (_maxSize > 0 && _batchStream.b.size() >= static_cast<size_t>(_maxSize))
94
96
  {
95
97
  proxy->ice_flushBatchRequestsAsync(nullptr); // auto-flush, don't wait for response
@@ -115,15 +117,18 @@ BatchRequestQueue::finishBatchRequest(OutputStream* os, const Ice::ObjectPrx& pr
115
117
  lock_guard lock(_mutex);
116
118
  _batchStream.resize(_batchMarker);
117
119
  _batchStreamInUse = false;
118
- _batchStreamCanFlush = false;
120
+ _batchStreamOwnerId = std::thread::id{};
119
121
  _conditionVariable.notify_all();
120
122
  }
121
- catch (const std::exception&)
123
+ catch (...)
122
124
  {
125
+ // Restore the queue to a usable state on any exception, including a non-std::exception escaping the
126
+ // interceptor. Otherwise _batchStreamInUse would stay set and wedge the queue (all future
127
+ // prepareBatchRequest/swap calls would block forever).
123
128
  lock_guard lock(_mutex);
124
129
  _batchStream.resize(_batchMarker);
125
130
  _batchStreamInUse = false;
126
- _batchStreamCanFlush = false;
131
+ _batchStreamOwnerId = std::thread::id{};
127
132
  _conditionVariable.notify_all();
128
133
  throw;
129
134
  }
@@ -146,13 +151,23 @@ int
146
151
  BatchRequestQueue::swap(OutputStream* os, bool& compress) noexcept
147
152
  {
148
153
  unique_lock lock(_mutex);
154
+
155
+ // Only the thread that currently owns the in-use stream may bypass the wait, to run its own auto-flush;
156
+ // every other caller waits for the in-progress batch request to finish. (The owner can't change while we
157
+ // block here: a thread becomes the owner only inside finishBatchRequest, never while parked in this wait.)
158
+ if (_batchStreamOwnerId != std::this_thread::get_id())
159
+ {
160
+ _conditionVariable.wait(lock, [this] { return !_batchStreamInUse; });
161
+ }
162
+
163
+ // Read the bookkeeping only after passing the gate above: finishBatchRequest mutates these scalars
164
+ // without the lock while it owns the in-use stream, so reading _batchRequestNum before the wait would
165
+ // race those writes.
149
166
  if (_batchRequestNum == 0)
150
167
  {
151
168
  return 0;
152
169
  }
153
170
 
154
- _conditionVariable.wait(lock, [this] { return !_batchStreamInUse || _batchStreamCanFlush; });
155
-
156
171
  vector<byte> lastRequest;
157
172
  if (_batchMarker < _batchStream.b.size())
158
173
  {
@@ -11,6 +11,7 @@
11
11
  #include <condition_variable>
12
12
  #include <functional>
13
13
  #include <mutex>
14
+ #include <thread>
14
15
 
15
16
  namespace IceInternal
16
17
  {
@@ -33,7 +34,10 @@ namespace IceInternal
33
34
  std::function<void(const Ice::BatchRequest&, int, int)> _interceptor;
34
35
  Ice::OutputStream _batchStream;
35
36
  bool _batchStreamInUse{false};
36
- bool _batchStreamCanFlush{false};
37
+ // While finishBatchRequest holds the in-use stream, this is its thread: the only thread allowed to
38
+ // re-enter swap() (for its own auto-flush). A default-constructed id means no thread may flush the
39
+ // in-use stream, so other threads wait for _batchStreamInUse to clear.
40
+ std::thread::id _batchStreamOwnerId{};
37
41
  bool _batchCompress{false};
38
42
  int _batchRequestNum{0};
39
43
  size_t _batchMarker;
@@ -37,7 +37,7 @@ IceInternal::Buffer::Container::Container(const vector<value_type>& v) noexcept
37
37
  }
38
38
  else
39
39
  {
40
- _buf = const_cast<value_type*>(&v[0]);
40
+ _buf = const_cast<value_type*>(v.data());
41
41
  _size = v.size();
42
42
  _capacity = _size;
43
43
  _owned = false;
@@ -211,7 +211,7 @@ CollocatedRequestHandler::dispatchException(int32_t requestId, exception_ptr ex)
211
211
  }
212
212
 
213
213
  ConnectionIPtr
214
- CollocatedRequestHandler::getConnection()
214
+ CollocatedRequestHandler::getConnection() noexcept
215
215
  {
216
216
  return nullptr;
217
217
  }
@@ -34,7 +34,7 @@ namespace IceInternal
34
34
 
35
35
  void asyncRequestCanceled(const OutgoingAsyncBasePtr&, std::exception_ptr) final;
36
36
 
37
- Ice::ConnectionIPtr getConnection() final;
37
+ Ice::ConnectionIPtr getConnection() noexcept final;
38
38
 
39
39
  AsyncStatus invokeAsyncRequest(OutgoingAsyncBase*, int, bool);
40
40
 
@@ -48,11 +48,12 @@ Ice::Communicator::destroy() noexcept
48
48
  void
49
49
  Ice::Communicator::destroyAsync(function<void()> completed) noexcept
50
50
  {
51
- if (completed)
51
+ if (!completed)
52
52
  {
53
- _instance->destroyAsync(std::move(completed));
53
+ // we tolerate null callbacks
54
+ completed = [] {};
54
55
  }
55
- // we tolerate null callbacks, they do nothing
56
+ _instance->destroyAsync(std::move(completed));
56
57
  }
57
58
 
58
59
  void
@@ -6,6 +6,7 @@
6
6
  #include "ConnectionI.h"
7
7
  #include "Instance.h"
8
8
  #include "ObjectAdapterFactory.h"
9
+ #include "RequestHandler.h" // For RetryException
9
10
 
10
11
  using namespace std;
11
12
  using namespace Ice;
@@ -97,6 +98,13 @@ CommunicatorFlushBatchAsync::flushConnection(const ConnectionIPtr& con, Ice::Com
97
98
  con->sendAsyncRequest(flushBatch, compress, false, batchRequestNum);
98
99
  }
99
100
  }
101
+ catch (const RetryException& ex)
102
+ {
103
+ // If the connection is closed and sendAsyncRequest throws a RetryException, we rethrow the underlying exception
104
+ // to the caller.
105
+ check(false);
106
+ rethrow_exception(ex.get());
107
+ }
100
108
  catch (const LocalException&)
101
109
  {
102
110
  check(false);
@@ -59,23 +59,13 @@ ConnectRequestHandler::asyncRequestCanceled(const OutgoingAsyncBasePtr& outAsync
59
59
  }
60
60
 
61
61
  Ice::ConnectionIPtr
62
- ConnectRequestHandler::getConnection()
62
+ ConnectRequestHandler::getConnection() noexcept
63
63
  {
64
64
  lock_guard lock(_mutex);
65
- //
66
- // First check for the connection, it's important otherwise the user could first get a connection
67
- // and then the exception if he tries to obtain the proxy cached connection mutiple times (the
68
- // exception can be set after the connection is set if the flush of pending requests fails).
69
- //
70
- if (_connection)
71
- {
72
- return _connection;
73
- }
74
- else if (_exception)
75
- {
76
- rethrow_exception(_exception);
77
- }
78
- return nullptr;
65
+ // Return the connection in whatever state it is; if the connection establishment failed, return null. Like all
66
+ // getConnection implementations, this function never throws: a null return is how the absence of a connection is
67
+ // reported.
68
+ return _connection;
79
69
  }
80
70
 
81
71
  void
@@ -25,7 +25,7 @@ namespace IceInternal
25
25
 
26
26
  void asyncRequestCanceled(const OutgoingAsyncBasePtr&, std::exception_ptr) final;
27
27
 
28
- Ice::ConnectionIPtr getConnection() final;
28
+ Ice::ConnectionIPtr getConnection() noexcept final;
29
29
 
30
30
  // setConnection and setException are the response and exception for RoutableReference::getConnectionAsync.
31
31
  void setConnection(Ice::ConnectionIPtr, bool);
@@ -205,7 +205,7 @@ IceInternal::OutgoingConnectionFactory::setRouterInfo(const RouterInfoPtr& route
205
205
  // endpoints that differ in the value of the compression flag
206
206
  // only, we always set the compression flag to false here in
207
207
  // this connection factory. We also clear the timeout as it is
208
- // no longer used for Ice 3.8.
208
+ // no longer used for Ice 3.8 or greater.
209
209
  //
210
210
  endpoint = endpoint->compress(false)->timeout(-1);
211
211
 
@@ -387,7 +387,7 @@ IceInternal::OutgoingConnectionFactory::incPendingConnectCount()
387
387
  //
388
388
  // Keep track of the number of pending connects. The outgoing connection factory
389
389
  // waitUntilFinished() method waits for all the pending connects to terminate before
390
- // to return. This ensures that the communicator client thread pool isn't destroyed
390
+ // returning. This ensures that the communicator client thread pool isn't destroyed
391
391
  // too soon and will still be available to execute the ice_exception() callbacks for
392
392
  // the asynchronous requests waiting on a connection to be established.
393
393
  //
@@ -426,7 +426,7 @@ IceInternal::OutgoingConnectionFactory::getConnection(
426
426
  throw Ice::CommunicatorDestroyedException(__FILE__, __LINE__);
427
427
  }
428
428
 
429
- // Search for an existing connections matching one of the given endpoints.
429
+ // Search for an existing connection matching one of the given endpoints.
430
430
  Ice::ConnectionIPtr connection = findConnection(connectors, compress);
431
431
  if (connection)
432
432
  {
@@ -695,7 +695,7 @@ IceInternal::OutgoingConnectionFactory::handleException(exception_ptr ex, bool h
695
695
  {
696
696
  Trace out(_instance->initializationData().logger, traceLevels->networkCat);
697
697
 
698
- out << "couldn't resolve endpoint host";
698
+ out << "could not resolve endpoint host";
699
699
 
700
700
  try
701
701
  {
@@ -903,9 +903,9 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::getConnection()
903
903
  {
904
904
  //
905
905
  // A null return value from getConnection indicates that the connection
906
- // is being established and that everthing has been done to ensure that
906
+ // is being established and that everything has been done to ensure that
907
907
  // the callback will be notified when the connection establishment is
908
- // done or that the callback already obtain the connection.
908
+ // done or that the callback already obtained the connection.
909
909
  //
910
910
  return;
911
911
  }
@@ -1510,7 +1510,6 @@ IceInternal::IncomingConnectionFactory::startAcceptor()
1510
1510
  return;
1511
1511
  }
1512
1512
 
1513
- _acceptorStopped = false;
1514
1513
  createAcceptor();
1515
1514
  }
1516
1515
 
@@ -1523,7 +1522,6 @@ IceInternal::IncomingConnectionFactory::stopAcceptor()
1523
1522
  return;
1524
1523
  }
1525
1524
 
1526
- _acceptorStopped = true;
1527
1525
  _acceptorStarted = false;
1528
1526
  if (_adapter->getThreadPool()->finish(shared_from_this(), true))
1529
1527
  {
@@ -241,9 +241,6 @@ namespace IceInternal
241
241
  EndpointIPtr _endpoint;
242
242
 
243
243
  bool _acceptorStarted{false};
244
- #if defined(__APPLE__) && TARGET_OS_IPHONE != 0
245
- bool _acceptorStopped{false};
246
- #endif
247
244
 
248
245
  std::shared_ptr<Ice::ObjectAdapterI> _adapter;
249
246
  const bool _warn;