couchbase 3.0.0-universal-darwin-19 → 3.0.1-universal-darwin-19

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 (902) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/CMakeLists.txt +86 -169
  4. data/ext/build_version.hxx.in +3 -2
  5. data/ext/cmake/Backtrace.cmake +35 -0
  6. data/ext/cmake/BuildTracing.cmake +6 -0
  7. data/ext/cmake/Cache.cmake +29 -0
  8. data/ext/cmake/CompilerWarnings.cmake +78 -0
  9. data/ext/cmake/PreventInSourceBuilds.cmake +18 -0
  10. data/ext/cmake/Sanitizers.cmake +66 -0
  11. data/ext/cmake/StandardProjectSettings.cmake +40 -0
  12. data/ext/cmake/StaticAnalyzers.cmake +37 -0
  13. data/ext/cmake/Testing.cmake +52 -0
  14. data/ext/cmake/ThirdPartyDependencies.cmake +20 -0
  15. data/ext/cmake/VersionInfo.cmake +37 -0
  16. data/ext/couchbase/bucket.hxx +37 -12
  17. data/ext/couchbase/capabilities.hxx +117 -0
  18. data/ext/couchbase/cbcrypto/cbcrypto.cc +15 -15
  19. data/ext/couchbase/cluster.hxx +34 -2
  20. data/ext/couchbase/cluster_options.hxx +1 -0
  21. data/ext/couchbase/configuration.hxx +228 -52
  22. data/ext/couchbase/couchbase.cxx +914 -35
  23. data/ext/couchbase/diagnostics.hxx +251 -0
  24. data/ext/couchbase/document_id.hxx +3 -1
  25. data/ext/couchbase/errors.hxx +10 -1
  26. data/ext/couchbase/io/http_command.hxx +11 -7
  27. data/ext/couchbase/io/http_context.hxx +37 -0
  28. data/ext/couchbase/io/http_message.hxx +9 -0
  29. data/ext/couchbase/io/http_parser.hxx +2 -0
  30. data/ext/couchbase/io/http_session.hxx +100 -14
  31. data/ext/couchbase/io/http_session_manager.hxx +65 -5
  32. data/ext/couchbase/io/mcbp_command.hxx +16 -7
  33. data/ext/couchbase/io/mcbp_session.hxx +193 -51
  34. data/ext/couchbase/io/query_cache.hxx +61 -0
  35. data/ext/couchbase/io/retry_context.hxx +1 -2
  36. data/ext/couchbase/io/retry_orchestrator.hxx +16 -0
  37. data/ext/couchbase/io/retry_strategy.hxx +1 -1
  38. data/ext/couchbase/io/streams.hxx +61 -10
  39. data/ext/couchbase/operations.hxx +13 -0
  40. data/ext/couchbase/operations/analytics_dataset_create.hxx +1 -1
  41. data/ext/couchbase/operations/analytics_dataset_drop.hxx +1 -1
  42. data/ext/couchbase/operations/analytics_dataset_get_all.hxx +1 -1
  43. data/ext/couchbase/operations/analytics_dataverse_create.hxx +1 -1
  44. data/ext/couchbase/operations/analytics_dataverse_drop.hxx +1 -1
  45. data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +1 -1
  46. data/ext/couchbase/operations/analytics_index_create.hxx +1 -1
  47. data/ext/couchbase/operations/analytics_index_drop.hxx +1 -1
  48. data/ext/couchbase/operations/analytics_index_get_all.hxx +1 -1
  49. data/ext/couchbase/operations/analytics_link_connect.hxx +1 -1
  50. data/ext/couchbase/operations/analytics_link_disconnect.hxx +1 -1
  51. data/ext/couchbase/operations/bucket_create.hxx +11 -5
  52. data/ext/couchbase/operations/bucket_drop.hxx +1 -1
  53. data/ext/couchbase/operations/bucket_flush.hxx +1 -1
  54. data/ext/couchbase/operations/bucket_get.hxx +1 -1
  55. data/ext/couchbase/operations/bucket_get_all.hxx +1 -1
  56. data/ext/couchbase/operations/bucket_settings.hxx +43 -4
  57. data/ext/couchbase/operations/bucket_update.hxx +11 -5
  58. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +1 -1
  59. data/ext/couchbase/operations/collection_create.hxx +3 -1
  60. data/ext/couchbase/operations/collection_drop.hxx +1 -1
  61. data/ext/couchbase/operations/collections_manifest_get.hxx +70 -0
  62. data/ext/couchbase/operations/document_analytics.hxx +6 -1
  63. data/ext/couchbase/operations/document_get_projected.hxx +1 -1
  64. data/ext/couchbase/operations/document_query.hxx +85 -8
  65. data/ext/couchbase/operations/document_search.hxx +14 -4
  66. data/ext/couchbase/operations/document_view.hxx +1 -1
  67. data/ext/couchbase/operations/group_drop.hxx +71 -0
  68. data/ext/couchbase/operations/group_get.hxx +75 -0
  69. data/ext/couchbase/operations/group_get_all.hxx +70 -0
  70. data/ext/couchbase/operations/group_upsert.hxx +118 -0
  71. data/ext/couchbase/operations/query_index_build_deferred.hxx +1 -1
  72. data/ext/couchbase/operations/query_index_create.hxx +1 -1
  73. data/ext/couchbase/operations/query_index_drop.hxx +1 -1
  74. data/ext/couchbase/operations/query_index_get_all.hxx +3 -2
  75. data/ext/couchbase/operations/rbac.hxx +276 -0
  76. data/ext/couchbase/operations/role_get_all.hxx +70 -0
  77. data/ext/couchbase/operations/scope_create.hxx +6 -2
  78. data/ext/couchbase/operations/scope_drop.hxx +1 -1
  79. data/ext/couchbase/operations/scope_get_all.hxx +1 -1
  80. data/ext/couchbase/operations/search_get_stats.hxx +59 -0
  81. data/ext/couchbase/operations/search_index_analyze_document.hxx +1 -1
  82. data/ext/couchbase/operations/search_index_control_ingest.hxx +1 -1
  83. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +1 -1
  84. data/ext/couchbase/operations/search_index_control_query.hxx +1 -1
  85. data/ext/couchbase/operations/search_index_drop.hxx +1 -1
  86. data/ext/couchbase/operations/search_index_get.hxx +1 -1
  87. data/ext/couchbase/operations/search_index_get_all.hxx +1 -1
  88. data/ext/couchbase/operations/search_index_get_documents_count.hxx +24 -16
  89. data/ext/couchbase/operations/search_index_get_stats.hxx +81 -0
  90. data/ext/couchbase/operations/search_index_upsert.hxx +1 -1
  91. data/ext/couchbase/operations/user_drop.hxx +72 -0
  92. data/ext/couchbase/operations/user_get.hxx +76 -0
  93. data/ext/couchbase/operations/user_get_all.hxx +71 -0
  94. data/ext/couchbase/operations/user_upsert.hxx +125 -0
  95. data/ext/couchbase/operations/view_index_drop.hxx +1 -1
  96. data/ext/couchbase/operations/view_index_get.hxx +1 -1
  97. data/ext/couchbase/operations/view_index_get_all.hxx +1 -1
  98. data/ext/couchbase/operations/view_index_upsert.hxx +1 -1
  99. data/ext/couchbase/origin.hxx +4 -4
  100. data/ext/couchbase/platform/terminate_handler.cc +5 -4
  101. data/ext/couchbase/protocol/client_opcode.hxx +38 -38
  102. data/ext/couchbase/protocol/client_response.hxx +2 -2
  103. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +6 -3
  104. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +3 -1
  105. data/ext/couchbase/protocol/magic.hxx +6 -6
  106. data/ext/couchbase/protocol/server_opcode.hxx +2 -2
  107. data/ext/couchbase/protocol/status.hxx +57 -57
  108. data/ext/couchbase/service_type.hxx +1 -1
  109. data/ext/couchbase/utils/connection_string.hxx +12 -3
  110. data/ext/couchbase/version.hxx +1 -1
  111. data/ext/extconf.rb +21 -9
  112. data/ext/test/test_helper.hxx +141 -0
  113. data/ext/test/test_helper_native.hxx +59 -0
  114. data/ext/test/test_helper_ruby.hxx +72 -0
  115. data/ext/test/test_native_diagnostics.cxx +385 -0
  116. data/ext/test/test_native_trivial_crud.cxx +83 -0
  117. data/ext/test/test_ruby_trivial_crud.cxx +35 -0
  118. data/ext/test/test_ruby_trivial_query.cxx +34 -0
  119. data/ext/third_party/asio/asio/include/asio.hpp +35 -0
  120. data/ext/third_party/asio/asio/include/asio/any_io_executor.hpp +71 -0
  121. data/ext/third_party/asio/asio/include/asio/associated_allocator.hpp +1 -7
  122. data/ext/third_party/asio/asio/include/asio/associated_executor.hpp +36 -19
  123. data/ext/third_party/asio/asio/include/asio/async_result.hpp +1 -8
  124. data/ext/third_party/asio/asio/include/asio/awaitable.hpp +14 -4
  125. data/ext/third_party/asio/asio/include/asio/basic_datagram_socket.hpp +12 -7
  126. data/ext/third_party/asio/asio/include/asio/basic_deadline_timer.hpp +4 -4
  127. data/ext/third_party/asio/asio/include/asio/basic_raw_socket.hpp +11 -7
  128. data/ext/third_party/asio/asio/include/asio/basic_seq_packet_socket.hpp +9 -4
  129. data/ext/third_party/asio/asio/include/asio/basic_serial_port.hpp +6 -6
  130. data/ext/third_party/asio/asio/include/asio/basic_signal_set.hpp +4 -4
  131. data/ext/third_party/asio/asio/include/asio/basic_socket.hpp +5 -5
  132. data/ext/third_party/asio/asio/include/asio/basic_socket_acceptor.hpp +13 -7
  133. data/ext/third_party/asio/asio/include/asio/basic_stream_socket.hpp +7 -3
  134. data/ext/third_party/asio/asio/include/asio/basic_waitable_timer.hpp +52 -4
  135. data/ext/third_party/asio/asio/include/asio/bind_executor.hpp +10 -15
  136. data/ext/third_party/asio/asio/include/asio/buffer.hpp +6 -4
  137. data/ext/third_party/asio/asio/include/asio/co_spawn.hpp +380 -9
  138. data/ext/third_party/asio/asio/include/asio/defer.hpp +4 -1
  139. data/ext/third_party/asio/asio/include/asio/detached.hpp +50 -0
  140. data/ext/third_party/asio/asio/include/asio/detail/atomic_count.hpp +19 -0
  141. data/ext/third_party/asio/asio/include/asio/detail/bind_handler.hpp +144 -26
  142. data/ext/third_party/asio/asio/include/asio/detail/blocking_executor_op.hpp +107 -0
  143. data/ext/third_party/asio/asio/include/asio/detail/buffer_sequence_adapter.hpp +106 -0
  144. data/ext/third_party/asio/asio/include/asio/detail/bulk_executor_op.hpp +88 -0
  145. data/ext/third_party/asio/asio/include/asio/detail/completion_handler.hpp +10 -5
  146. data/ext/third_party/asio/asio/include/asio/detail/conditionally_enabled_event.hpp +8 -0
  147. data/ext/third_party/asio/asio/include/asio/detail/config.hpp +360 -37
  148. data/ext/third_party/asio/asio/include/asio/detail/deadline_timer_service.hpp +17 -2
  149. data/ext/third_party/asio/asio/include/asio/detail/descriptor_ops.hpp +24 -6
  150. data/ext/third_party/asio/asio/include/asio/detail/descriptor_read_op.hpp +32 -14
  151. data/ext/third_party/asio/asio/include/asio/detail/descriptor_write_op.hpp +32 -14
  152. data/ext/third_party/asio/asio/include/asio/detail/executor_function.hpp +133 -34
  153. data/ext/third_party/asio/asio/include/asio/detail/handler_alloc_helpers.hpp +42 -0
  154. data/ext/third_party/asio/asio/include/asio/detail/handler_invoke_helpers.hpp +23 -0
  155. data/ext/third_party/asio/asio/include/asio/detail/handler_tracking.hpp +26 -0
  156. data/ext/third_party/asio/asio/include/asio/detail/handler_work.hpp +370 -45
  157. data/ext/third_party/asio/asio/include/asio/detail/impl/descriptor_ops.ipp +208 -74
  158. data/ext/third_party/asio/asio/include/asio/detail/impl/handler_tracking.ipp +39 -1
  159. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_serial_port_service.ipp +12 -15
  160. data/ext/third_party/asio/asio/include/asio/detail/impl/scheduler.ipp +37 -0
  161. data/ext/third_party/asio/asio/include/asio/detail/impl/signal_set_service.ipp +2 -1
  162. data/ext/third_party/asio/asio/include/asio/detail/impl/socket_ops.ipp +661 -274
  163. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_executor_service.hpp +210 -4
  164. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.hpp +8 -9
  165. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.ipp +5 -4
  166. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_io_context.ipp +15 -6
  167. data/ext/third_party/asio/asio/include/asio/detail/io_object_impl.hpp +32 -50
  168. data/ext/third_party/asio/asio/include/asio/detail/memory.hpp +3 -0
  169. data/ext/third_party/asio/asio/include/asio/detail/null_event.hpp +6 -0
  170. data/ext/third_party/asio/asio/include/asio/detail/pop_options.hpp +1 -1
  171. data/ext/third_party/asio/asio/include/asio/detail/posix_event.hpp +13 -0
  172. data/ext/third_party/asio/asio/include/asio/detail/push_options.hpp +1 -1
  173. data/ext/third_party/asio/asio/include/asio/detail/reactive_descriptor_service.hpp +38 -13
  174. data/ext/third_party/asio/asio/include/asio/detail/reactive_null_buffers_op.hpp +12 -6
  175. data/ext/third_party/asio/asio/include/asio/detail/reactive_serial_port_service.hpp +2 -3
  176. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_accept_op.hpp +36 -24
  177. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_connect_op.hpp +17 -10
  178. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recv_op.hpp +38 -16
  179. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp +36 -14
  180. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp +21 -11
  181. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_send_op.hpp +43 -17
  182. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_sendto_op.hpp +39 -17
  183. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service.hpp +44 -21
  184. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service_base.hpp +41 -18
  185. data/ext/third_party/asio/asio/include/asio/detail/reactive_wait_op.hpp +12 -6
  186. data/ext/third_party/asio/asio/include/asio/detail/reactor_op.hpp +3 -1
  187. data/ext/third_party/asio/asio/include/asio/detail/resolve_endpoint_op.hpp +10 -8
  188. data/ext/third_party/asio/asio/include/asio/detail/resolve_query_op.hpp +11 -9
  189. data/ext/third_party/asio/asio/include/asio/detail/scheduler.hpp +8 -0
  190. data/ext/third_party/asio/asio/include/asio/detail/signal_handler.hpp +7 -5
  191. data/ext/third_party/asio/asio/include/asio/detail/socket_ops.hpp +46 -0
  192. data/ext/third_party/asio/asio/include/asio/detail/source_location.hpp +45 -0
  193. data/ext/third_party/asio/asio/include/asio/detail/std_event.hpp +12 -0
  194. data/ext/third_party/asio/asio/include/asio/detail/strand_executor_service.hpp +25 -1
  195. data/ext/third_party/asio/asio/include/asio/detail/strand_service.hpp +4 -1
  196. data/ext/third_party/asio/asio/include/asio/detail/thread_info_base.hpp +58 -0
  197. data/ext/third_party/asio/asio/include/asio/detail/type_traits.hpp +59 -0
  198. data/ext/third_party/asio/asio/include/asio/detail/variadic_templates.hpp +144 -1
  199. data/ext/third_party/asio/asio/include/asio/detail/wait_handler.hpp +9 -6
  200. data/ext/third_party/asio/asio/include/asio/detail/win_event.hpp +13 -0
  201. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_read_op.hpp +9 -5
  202. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_write_op.hpp +9 -5
  203. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_io_context.hpp +5 -1
  204. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_null_buffers_op.hpp +10 -6
  205. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_op.hpp +9 -5
  206. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp +18 -6
  207. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_accept_op.hpp +15 -11
  208. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_connect_op.hpp +10 -5
  209. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recv_op.hpp +8 -4
  210. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp +8 -4
  211. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp +8 -4
  212. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_send_op.hpp +8 -4
  213. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_wait_op.hpp +10 -5
  214. data/ext/third_party/asio/asio/include/asio/detail/winrt_resolve_op.hpp +8 -4
  215. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_connect_op.hpp +8 -4
  216. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_recv_op.hpp +8 -4
  217. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_send_op.hpp +8 -4
  218. data/ext/third_party/asio/asio/include/asio/detail/work_dispatcher.hpp +81 -6
  219. data/ext/third_party/asio/asio/include/asio/detail/wrapped_handler.hpp +45 -9
  220. data/ext/third_party/asio/asio/include/asio/dispatch.hpp +4 -1
  221. data/ext/third_party/asio/asio/include/asio/execution.hpp +48 -0
  222. data/ext/third_party/asio/asio/include/asio/execution/allocator.hpp +249 -0
  223. data/ext/third_party/asio/asio/include/asio/execution/any_executor.hpp +2264 -0
  224. data/ext/third_party/asio/asio/include/asio/execution/bad_executor.hpp +47 -0
  225. data/ext/third_party/asio/asio/include/asio/execution/blocking.hpp +1351 -0
  226. data/ext/third_party/asio/asio/include/asio/execution/blocking_adaptation.hpp +1064 -0
  227. data/ext/third_party/asio/asio/include/asio/execution/bulk_execute.hpp +390 -0
  228. data/ext/third_party/asio/asio/include/asio/execution/bulk_guarantee.hpp +1018 -0
  229. data/ext/third_party/asio/asio/include/asio/execution/connect.hpp +486 -0
  230. data/ext/third_party/asio/asio/include/asio/execution/context.hpp +185 -0
  231. data/ext/third_party/asio/asio/include/asio/execution/context_as.hpp +201 -0
  232. data/ext/third_party/asio/asio/include/asio/execution/detail/as_invocable.hpp +152 -0
  233. data/ext/third_party/asio/asio/include/asio/execution/detail/as_operation.hpp +105 -0
  234. data/ext/third_party/asio/asio/include/asio/execution/detail/as_receiver.hpp +128 -0
  235. data/ext/third_party/asio/asio/include/asio/execution/detail/bulk_sender.hpp +261 -0
  236. data/ext/third_party/asio/asio/include/asio/execution/detail/submit_receiver.hpp +233 -0
  237. data/ext/third_party/asio/asio/include/asio/execution/detail/void_receiver.hpp +90 -0
  238. data/ext/third_party/asio/asio/include/asio/execution/execute.hpp +264 -0
  239. data/ext/third_party/asio/asio/include/asio/execution/executor.hpp +238 -0
  240. data/ext/third_party/asio/asio/include/asio/execution/impl/bad_executor.ipp +40 -0
  241. data/ext/third_party/asio/asio/include/asio/execution/impl/receiver_invocation_error.ipp +36 -0
  242. data/ext/third_party/asio/asio/include/asio/execution/invocable_archetype.hpp +71 -0
  243. data/ext/third_party/asio/asio/include/asio/execution/mapping.hpp +917 -0
  244. data/ext/third_party/asio/asio/include/asio/execution/occupancy.hpp +178 -0
  245. data/ext/third_party/asio/asio/include/asio/execution/operation_state.hpp +94 -0
  246. data/ext/third_party/asio/asio/include/asio/execution/outstanding_work.hpp +721 -0
  247. data/ext/third_party/asio/asio/include/asio/execution/prefer_only.hpp +327 -0
  248. data/ext/third_party/asio/asio/include/asio/execution/receiver.hpp +280 -0
  249. data/ext/third_party/asio/asio/include/asio/execution/receiver_invocation_error.hpp +48 -0
  250. data/ext/third_party/asio/asio/include/asio/execution/relationship.hpp +720 -0
  251. data/ext/third_party/asio/asio/include/asio/execution/schedule.hpp +290 -0
  252. data/ext/third_party/asio/asio/include/asio/execution/scheduler.hpp +86 -0
  253. data/ext/third_party/asio/asio/include/asio/execution/sender.hpp +311 -0
  254. data/ext/third_party/asio/asio/include/asio/execution/set_done.hpp +253 -0
  255. data/ext/third_party/asio/asio/include/asio/execution/set_error.hpp +253 -0
  256. data/ext/third_party/asio/asio/include/asio/execution/set_value.hpp +486 -0
  257. data/ext/third_party/asio/asio/include/asio/execution/start.hpp +250 -0
  258. data/ext/third_party/asio/asio/include/asio/execution/submit.hpp +450 -0
  259. data/ext/third_party/asio/asio/include/asio/executor.hpp +7 -1
  260. data/ext/third_party/asio/asio/include/asio/executor_work_guard.hpp +126 -9
  261. data/ext/third_party/asio/asio/include/asio/handler_alloc_hook.hpp +28 -5
  262. data/ext/third_party/asio/asio/include/asio/handler_invoke_hook.hpp +29 -3
  263. data/ext/third_party/asio/asio/include/asio/impl/awaitable.hpp +14 -0
  264. data/ext/third_party/asio/asio/include/asio/impl/buffered_read_stream.hpp +44 -8
  265. data/ext/third_party/asio/asio/include/asio/impl/buffered_write_stream.hpp +44 -8
  266. data/ext/third_party/asio/asio/include/asio/impl/co_spawn.hpp +145 -7
  267. data/ext/third_party/asio/asio/include/asio/impl/compose.hpp +124 -22
  268. data/ext/third_party/asio/asio/include/asio/impl/connect.hpp +52 -8
  269. data/ext/third_party/asio/asio/include/asio/impl/defer.hpp +147 -12
  270. data/ext/third_party/asio/asio/include/asio/impl/dispatch.hpp +142 -12
  271. data/ext/third_party/asio/asio/include/asio/impl/executor.hpp +15 -101
  272. data/ext/third_party/asio/asio/include/asio/impl/executor.ipp +5 -0
  273. data/ext/third_party/asio/asio/include/asio/impl/handler_alloc_hook.ipp +13 -4
  274. data/ext/third_party/asio/asio/include/asio/impl/io_context.hpp +144 -57
  275. data/ext/third_party/asio/asio/include/asio/impl/multiple_exceptions.ipp +49 -0
  276. data/ext/third_party/asio/asio/include/asio/impl/post.hpp +147 -12
  277. data/ext/third_party/asio/asio/include/asio/impl/read.hpp +85 -18
  278. data/ext/third_party/asio/asio/include/asio/impl/read_at.hpp +59 -14
  279. data/ext/third_party/asio/asio/include/asio/impl/read_until.hpp +241 -56
  280. data/ext/third_party/asio/asio/include/asio/impl/redirect_error.hpp +22 -4
  281. data/ext/third_party/asio/asio/include/asio/impl/spawn.hpp +58 -22
  282. data/ext/third_party/asio/asio/include/asio/impl/src.hpp +3 -0
  283. data/ext/third_party/asio/asio/include/asio/impl/system_context.ipp +16 -4
  284. data/ext/third_party/asio/asio/include/asio/impl/system_executor.hpp +113 -12
  285. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.hpp +260 -37
  286. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.ipp +61 -7
  287. data/ext/third_party/asio/asio/include/asio/impl/use_awaitable.hpp +5 -2
  288. data/ext/third_party/asio/asio/include/asio/impl/use_future.hpp +147 -6
  289. data/ext/third_party/asio/asio/include/asio/impl/write.hpp +75 -14
  290. data/ext/third_party/asio/asio/include/asio/impl/write_at.hpp +53 -11
  291. data/ext/third_party/asio/asio/include/asio/io_context.hpp +706 -48
  292. data/ext/third_party/asio/asio/include/asio/io_context_strand.hpp +3 -1
  293. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver.hpp +4 -4
  294. data/ext/third_party/asio/asio/include/asio/is_applicable_property.hpp +61 -0
  295. data/ext/third_party/asio/asio/include/asio/multiple_exceptions.hpp +58 -0
  296. data/ext/third_party/asio/asio/include/asio/posix/basic_descriptor.hpp +4 -4
  297. data/ext/third_party/asio/asio/include/asio/posix/basic_stream_descriptor.hpp +5 -5
  298. data/ext/third_party/asio/asio/include/asio/post.hpp +4 -1
  299. data/ext/third_party/asio/asio/include/asio/prefer.hpp +656 -0
  300. data/ext/third_party/asio/asio/include/asio/query.hpp +296 -0
  301. data/ext/third_party/asio/asio/include/asio/read_until.hpp +6 -6
  302. data/ext/third_party/asio/asio/include/asio/require.hpp +524 -0
  303. data/ext/third_party/asio/asio/include/asio/require_concept.hpp +310 -0
  304. data/ext/third_party/asio/asio/include/asio/spawn.hpp +12 -4
  305. data/ext/third_party/asio/asio/include/asio/ssl/detail/buffered_handshake_op.hpp +5 -0
  306. data/ext/third_party/asio/asio/include/asio/ssl/detail/engine.hpp +5 -0
  307. data/ext/third_party/asio/asio/include/asio/ssl/detail/handshake_op.hpp +5 -0
  308. data/ext/third_party/asio/asio/include/asio/ssl/detail/impl/engine.ipp +16 -3
  309. data/ext/third_party/asio/asio/include/asio/ssl/detail/io.hpp +38 -4
  310. data/ext/third_party/asio/asio/include/asio/ssl/detail/read_op.hpp +5 -0
  311. data/ext/third_party/asio/asio/include/asio/ssl/detail/shutdown_op.hpp +5 -0
  312. data/ext/third_party/asio/asio/include/asio/ssl/detail/stream_core.hpp +36 -2
  313. data/ext/third_party/asio/asio/include/asio/ssl/detail/write_op.hpp +10 -1
  314. data/ext/third_party/asio/asio/include/asio/ssl/stream.hpp +15 -0
  315. data/ext/third_party/asio/asio/include/asio/static_thread_pool.hpp +31 -0
  316. data/ext/third_party/asio/asio/include/asio/strand.hpp +232 -9
  317. data/ext/third_party/asio/asio/include/asio/system_context.hpp +12 -3
  318. data/ext/third_party/asio/asio/include/asio/system_executor.hpp +557 -24
  319. data/ext/third_party/asio/asio/include/asio/thread_pool.hpp +913 -37
  320. data/ext/third_party/asio/asio/include/asio/traits/bulk_execute_free.hpp +114 -0
  321. data/ext/third_party/asio/asio/include/asio/traits/bulk_execute_member.hpp +114 -0
  322. data/ext/third_party/asio/asio/include/asio/traits/connect_free.hpp +112 -0
  323. data/ext/third_party/asio/asio/include/asio/traits/connect_member.hpp +112 -0
  324. data/ext/third_party/asio/asio/include/asio/traits/equality_comparable.hpp +100 -0
  325. data/ext/third_party/asio/asio/include/asio/traits/execute_free.hpp +108 -0
  326. data/ext/third_party/asio/asio/include/asio/traits/execute_member.hpp +108 -0
  327. data/ext/third_party/asio/asio/include/asio/traits/prefer_free.hpp +108 -0
  328. data/ext/third_party/asio/asio/include/asio/traits/prefer_member.hpp +108 -0
  329. data/ext/third_party/asio/asio/include/asio/traits/query_free.hpp +108 -0
  330. data/ext/third_party/asio/asio/include/asio/traits/query_member.hpp +108 -0
  331. data/ext/third_party/asio/asio/include/asio/traits/query_static_constexpr_member.hpp +108 -0
  332. data/ext/third_party/asio/asio/include/asio/traits/require_concept_free.hpp +108 -0
  333. data/ext/third_party/asio/asio/include/asio/traits/require_concept_member.hpp +108 -0
  334. data/ext/third_party/asio/asio/include/asio/traits/require_free.hpp +108 -0
  335. data/ext/third_party/asio/asio/include/asio/traits/require_member.hpp +108 -0
  336. data/ext/third_party/asio/asio/include/asio/traits/schedule_free.hpp +108 -0
  337. data/ext/third_party/asio/asio/include/asio/traits/schedule_member.hpp +108 -0
  338. data/ext/third_party/asio/asio/include/asio/traits/set_done_free.hpp +108 -0
  339. data/ext/third_party/asio/asio/include/asio/traits/set_done_member.hpp +108 -0
  340. data/ext/third_party/asio/asio/include/asio/traits/set_error_free.hpp +112 -0
  341. data/ext/third_party/asio/asio/include/asio/traits/set_error_member.hpp +112 -0
  342. data/ext/third_party/asio/asio/include/asio/traits/set_value_free.hpp +234 -0
  343. data/ext/third_party/asio/asio/include/asio/traits/set_value_member.hpp +234 -0
  344. data/ext/third_party/asio/asio/include/asio/traits/start_free.hpp +108 -0
  345. data/ext/third_party/asio/asio/include/asio/traits/start_member.hpp +108 -0
  346. data/ext/third_party/asio/asio/include/asio/traits/static_query.hpp +108 -0
  347. data/ext/third_party/asio/asio/include/asio/traits/static_require.hpp +123 -0
  348. data/ext/third_party/asio/asio/include/asio/traits/static_require_concept.hpp +123 -0
  349. data/ext/third_party/asio/asio/include/asio/traits/submit_free.hpp +112 -0
  350. data/ext/third_party/asio/asio/include/asio/traits/submit_member.hpp +112 -0
  351. data/ext/third_party/asio/asio/include/asio/ts/executor.hpp +1 -0
  352. data/ext/third_party/asio/asio/include/asio/ts/netfwd.hpp +67 -8
  353. data/ext/third_party/asio/asio/include/asio/use_awaitable.hpp +63 -4
  354. data/ext/third_party/asio/asio/include/asio/version.hpp +1 -1
  355. data/ext/third_party/asio/asio/include/asio/windows/basic_object_handle.hpp +4 -4
  356. data/ext/third_party/asio/asio/include/asio/windows/basic_overlapped_handle.hpp +2 -2
  357. data/ext/third_party/asio/asio/include/asio/windows/basic_random_access_handle.hpp +5 -5
  358. data/ext/third_party/asio/asio/include/asio/windows/basic_stream_handle.hpp +5 -5
  359. data/ext/third_party/asio/asio/include/asio/windows/overlapped_ptr.hpp +4 -2
  360. data/ext/third_party/gsl/CMakeLists.txt +13 -5
  361. data/ext/third_party/gsl/include/gsl/gsl_assert +1 -1
  362. data/ext/third_party/gsl/include/gsl/gsl_byte +3 -3
  363. data/ext/third_party/gsl/include/gsl/gsl_narrow +52 -0
  364. data/ext/third_party/gsl/include/gsl/gsl_util +8 -50
  365. data/ext/third_party/gsl/include/gsl/multi_span +0 -10
  366. data/ext/third_party/gsl/include/gsl/pointers +14 -28
  367. data/ext/third_party/gsl/include/gsl/span +98 -46
  368. data/ext/third_party/gsl/include/gsl/string_span +37 -47
  369. data/ext/third_party/http_parser/http_parser.c +17 -10
  370. data/ext/third_party/http_parser/http_parser.h +4 -2
  371. data/ext/third_party/json/include/tao/json/basic_value.hpp +3 -2
  372. data/ext/third_party/json/include/tao/json/binary.hpp +4 -4
  373. data/ext/third_party/json/include/tao/json/binary_view.hpp +2 -2
  374. data/ext/third_party/json/include/tao/json/binding.hpp +2 -2
  375. data/ext/third_party/json/include/tao/json/binding/factory.hpp +8 -7
  376. data/ext/third_party/json/include/tao/json/binding/internal/array.hpp +2 -1
  377. data/ext/third_party/json/include/tao/json/binding/internal/object.hpp +6 -5
  378. data/ext/third_party/json/include/tao/json/binding/versions.hpp +3 -1
  379. data/ext/third_party/json/include/tao/json/cbor.hpp +1 -0
  380. data/ext/third_party/json/include/tao/json/cbor/consume_file.hpp +7 -7
  381. data/ext/third_party/json/include/tao/json/cbor/events/from_binary.hpp +43 -0
  382. data/ext/third_party/json/include/tao/json/cbor/events/from_file.hpp +4 -4
  383. data/ext/third_party/json/include/tao/json/cbor/events/from_string.hpp +3 -3
  384. data/ext/third_party/json/include/tao/json/cbor/from_binary.hpp +32 -0
  385. data/ext/third_party/json/include/tao/json/cbor/from_file.hpp +5 -5
  386. data/ext/third_party/json/include/tao/json/cbor/internal/grammar.hpp +2 -1
  387. data/ext/third_party/json/include/tao/json/consume_file.hpp +7 -7
  388. data/ext/third_party/json/include/tao/json/contrib/internal/indirect_traits.hpp +13 -6
  389. data/ext/third_party/json/include/tao/json/contrib/position.hpp +15 -15
  390. data/ext/third_party/json/include/tao/json/contrib/reference.hpp +5 -7
  391. data/ext/third_party/json/include/tao/json/contrib/schema.hpp +58 -35
  392. data/ext/third_party/json/include/tao/json/contrib/shared_ptr_traits.hpp +12 -4
  393. data/ext/third_party/json/include/tao/json/contrib/unique_ptr_traits.hpp +12 -4
  394. data/ext/third_party/json/include/tao/json/contrib/unordered_map_traits.hpp +1 -1
  395. data/ext/third_party/json/include/tao/json/contrib/unordered_set_traits.hpp +2 -2
  396. data/ext/third_party/json/include/tao/json/events/compare.hpp +2 -12
  397. data/ext/third_party/json/include/tao/json/events/from_file.hpp +4 -4
  398. data/ext/third_party/json/include/tao/json/events/from_string.hpp +2 -2
  399. data/ext/third_party/json/include/tao/json/events/invalid_string_to_binary.hpp +1 -1
  400. data/ext/third_party/json/include/tao/json/events/key_camel_case_to_snake_case.hpp +3 -3
  401. data/ext/third_party/json/include/tao/json/events/key_snake_case_to_camel_case.hpp +1 -1
  402. data/ext/third_party/json/include/tao/json/events/tee.hpp +2 -2
  403. data/ext/third_party/json/include/tao/json/events/to_pretty_stream.hpp +1 -1
  404. data/ext/third_party/json/include/tao/json/events/to_stream.hpp +1 -1
  405. data/ext/third_party/json/include/tao/json/events/transformer.hpp +3 -3
  406. data/ext/third_party/json/include/tao/json/events/validate_event_order.hpp +3 -3
  407. data/ext/third_party/json/include/tao/json/events/virtual_ref.hpp +6 -0
  408. data/ext/third_party/json/include/tao/json/external/pegtl.hpp +4 -13
  409. data/ext/third_party/json/include/tao/json/external/pegtl/argv_input.hpp +3 -5
  410. data/ext/third_party/json/include/tao/json/external/pegtl/ascii.hpp +5 -18
  411. data/ext/third_party/json/include/tao/json/external/pegtl/buffer_input.hpp +3 -3
  412. data/ext/third_party/json/include/tao/json/external/pegtl/change_action.hpp +2 -2
  413. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_state.hpp +6 -6
  414. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_states.hpp +5 -5
  415. data/ext/third_party/json/include/tao/json/external/pegtl/change_control.hpp +2 -2
  416. data/ext/third_party/json/include/tao/json/external/pegtl/change_state.hpp +6 -6
  417. data/ext/third_party/json/include/tao/json/external/pegtl/change_states.hpp +5 -5
  418. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/alphabet.hpp +52 -52
  419. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/analyze.hpp +176 -0
  420. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/analyze_traits.hpp +275 -0
  421. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/control_action.hpp +77 -0
  422. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/coverage.hpp +151 -0
  423. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/forward.hpp +16 -0
  424. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/http.hpp +37 -18
  425. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/internal.hpp +20 -22
  426. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf16.hpp +6 -10
  427. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf32.hpp +6 -10
  428. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf8.hpp +2 -4
  429. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/if_then.hpp +11 -10
  430. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/integer.hpp +116 -131
  431. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/endian.hpp +4 -4
  432. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/endian_gcc.hpp +2 -2
  433. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/endian_win.hpp +2 -2
  434. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_mask_uint.hpp +9 -9
  435. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_mask_uint8.hpp +9 -10
  436. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_uint.hpp +9 -9
  437. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_uint8.hpp +9 -10
  438. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_utf16.hpp +10 -10
  439. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_utf32.hpp +9 -9
  440. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/read_uint.hpp +3 -3
  441. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/internal/set_stack_guard.hpp +52 -0
  442. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree.hpp +80 -201
  443. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree_to_dot.hpp +11 -10
  444. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/print.hpp +75 -0
  445. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/print_coverage.hpp +53 -0
  446. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/raw_string.hpp +45 -36
  447. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/remove_first_state.hpp +33 -50
  448. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/remove_last_states.hpp +117 -0
  449. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_one_min_max.hpp +43 -11
  450. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_string.hpp +1 -2
  451. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/shuffle_states.hpp +193 -0
  452. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/state_control.hpp +118 -0
  453. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/trace.hpp +227 -0
  454. data/ext/third_party/json/include/tao/json/external/pegtl/{uint16.hpp → contrib/uint16.hpp} +5 -5
  455. data/ext/third_party/json/include/tao/json/external/pegtl/{uint32.hpp → contrib/uint32.hpp} +5 -5
  456. data/ext/third_party/json/include/tao/json/external/pegtl/{uint64.hpp → contrib/uint64.hpp} +5 -5
  457. data/ext/third_party/json/include/tao/json/external/pegtl/{uint8.hpp → contrib/uint8.hpp} +5 -5
  458. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/unescape.hpp +14 -14
  459. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/uri.hpp +1 -1
  460. data/ext/third_party/json/include/tao/json/external/pegtl/{utf16.hpp → contrib/utf16.hpp} +5 -5
  461. data/ext/third_party/json/include/tao/json/external/pegtl/{utf32.hpp → contrib/utf32.hpp} +5 -5
  462. data/ext/third_party/json/include/tao/json/external/pegtl/cstream_input.hpp +2 -3
  463. data/ext/third_party/json/include/tao/json/external/pegtl/{internal/demangle.hpp → demangle.hpp} +12 -14
  464. data/ext/third_party/json/include/tao/json/external/pegtl/disable_action.hpp +2 -2
  465. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input.hpp +2 -2
  466. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_failure.hpp +2 -2
  467. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_success.hpp +2 -2
  468. data/ext/third_party/json/include/tao/json/external/pegtl/enable_action.hpp +2 -2
  469. data/ext/third_party/json/include/tao/json/external/pegtl/file_input.hpp +1 -1
  470. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action.hpp +19 -9
  471. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action_input.hpp +7 -8
  472. data/ext/third_party/json/include/tao/json/external/pegtl/internal/any.hpp +14 -14
  473. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply.hpp +9 -9
  474. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply0.hpp +8 -7
  475. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply_single.hpp +4 -4
  476. data/ext/third_party/json/include/tao/json/external/pegtl/internal/at.hpp +17 -15
  477. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bof.hpp +7 -6
  478. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bol.hpp +8 -8
  479. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump.hpp +4 -4
  480. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump_help.hpp +3 -3
  481. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bytes.hpp +17 -10
  482. data/ext/third_party/json/include/tao/json/external/pegtl/internal/control.hpp +19 -9
  483. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_crlf_eol.hpp +2 -2
  484. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_eol.hpp +2 -2
  485. data/ext/third_party/json/include/tao/json/external/pegtl/internal/crlf_eol.hpp +2 -2
  486. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cstream_reader.hpp +1 -1
  487. data/ext/third_party/json/include/tao/json/external/pegtl/internal/{always_false.hpp → dependent_false.hpp} +3 -8
  488. data/ext/third_party/json/include/tao/json/external/pegtl/internal/disable.hpp +19 -9
  489. data/ext/third_party/json/include/tao/json/external/pegtl/internal/discard.hpp +7 -6
  490. data/ext/third_party/json/include/tao/json/external/pegtl/internal/enable.hpp +19 -9
  491. data/ext/third_party/json/include/tao/json/external/pegtl/internal/{skip_control.hpp → enable_control.hpp} +5 -5
  492. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eof.hpp +7 -6
  493. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eol.hpp +8 -7
  494. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eolf.hpp +8 -7
  495. data/ext/third_party/json/include/tao/json/external/pegtl/internal/failure.hpp +32 -0
  496. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_posix.hpp +61 -10
  497. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_win32.hpp +27 -33
  498. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_reader.hpp +29 -26
  499. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply.hpp +3 -7
  500. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply0.hpp +3 -7
  501. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_match.hpp +4 -20
  502. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_unwind.hpp +21 -0
  503. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_apply.hpp +8 -7
  504. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must.hpp +8 -9
  505. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must_else.hpp +2 -0
  506. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_then_else.hpp +7 -7
  507. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istream_reader.hpp +1 -2
  508. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istring.hpp +11 -11
  509. data/ext/third_party/json/include/tao/json/external/pegtl/internal/iterator.hpp +7 -10
  510. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_crlf_eol.hpp +2 -2
  511. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_eol.hpp +2 -2
  512. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail.hpp +4 -2
  513. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail_pad.hpp +1 -1
  514. data/ext/third_party/json/include/tao/json/external/pegtl/internal/marker.hpp +3 -5
  515. data/ext/third_party/json/include/tao/json/external/pegtl/internal/minus.hpp +21 -0
  516. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply.hpp +5 -2
  517. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply0.hpp +5 -2
  518. data/ext/third_party/json/include/tao/json/external/pegtl/internal/must.hpp +16 -24
  519. data/ext/third_party/json/include/tao/json/external/pegtl/internal/not_at.hpp +17 -15
  520. data/ext/third_party/json/include/tao/json/external/pegtl/internal/one.hpp +23 -12
  521. data/ext/third_party/json/include/tao/json/external/pegtl/internal/opt.hpp +16 -16
  522. data/ext/third_party/json/include/tao/json/external/pegtl/internal/path_to_string.hpp +26 -0
  523. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_char.hpp +5 -5
  524. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf8.hpp +12 -13
  525. data/ext/third_party/json/include/tao/json/external/pegtl/internal/plus.hpp +18 -11
  526. data/ext/third_party/json/include/tao/json/external/pegtl/internal/raise.hpp +8 -17
  527. data/ext/third_party/json/include/tao/json/external/pegtl/internal/range.hpp +22 -17
  528. data/ext/third_party/json/include/tao/json/external/pegtl/internal/ranges.hpp +28 -18
  529. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rematch.hpp +12 -9
  530. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep.hpp +26 -25
  531. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_min_max.hpp +23 -21
  532. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_opt.hpp +24 -9
  533. data/ext/third_party/json/include/tao/json/external/pegtl/internal/require.hpp +10 -10
  534. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rules.hpp +4 -4
  535. data/ext/third_party/json/include/tao/json/external/pegtl/internal/seq.hpp +18 -33
  536. data/ext/third_party/json/include/tao/json/external/pegtl/internal/sor.hpp +24 -17
  537. data/ext/third_party/json/include/tao/json/external/pegtl/internal/star.hpp +13 -8
  538. data/ext/third_party/json/include/tao/json/external/pegtl/internal/state.hpp +21 -11
  539. data/ext/third_party/json/include/tao/json/external/pegtl/internal/string.hpp +11 -11
  540. data/ext/third_party/json/include/tao/json/external/pegtl/internal/success.hpp +32 -0
  541. data/ext/third_party/json/include/tao/json/external/pegtl/internal/try_catch_type.hpp +16 -16
  542. data/ext/third_party/json/include/tao/json/external/pegtl/internal/until.hpp +18 -14
  543. data/ext/third_party/json/include/tao/json/external/pegtl/istream_input.hpp +2 -3
  544. data/ext/third_party/json/include/tao/json/external/pegtl/match.hpp +125 -29
  545. data/ext/third_party/json/include/tao/json/external/pegtl/memory_input.hpp +32 -48
  546. data/ext/third_party/json/include/tao/json/external/pegtl/mmap_input.hpp +16 -16
  547. data/ext/third_party/json/include/tao/json/external/pegtl/must_if.hpp +64 -0
  548. data/ext/third_party/json/include/tao/json/external/pegtl/normal.hpp +25 -25
  549. data/ext/third_party/json/include/tao/json/external/pegtl/nothing.hpp +1 -2
  550. data/ext/third_party/json/include/tao/json/external/pegtl/parse.hpp +6 -8
  551. data/ext/third_party/json/include/tao/json/external/pegtl/parse_error.hpp +80 -35
  552. data/ext/third_party/json/include/tao/json/external/pegtl/position.hpp +18 -10
  553. data/ext/third_party/json/include/tao/json/external/pegtl/read_input.hpp +18 -38
  554. data/ext/third_party/json/include/tao/json/external/pegtl/rules.hpp +6 -5
  555. data/ext/third_party/json/include/tao/json/external/pegtl/string_input.hpp +3 -5
  556. data/ext/third_party/json/include/tao/json/external/pegtl/type_list.hpp +46 -0
  557. data/ext/third_party/json/include/tao/json/external/pegtl/visit.hpp +66 -0
  558. data/ext/third_party/json/include/tao/json/from_file.hpp +5 -5
  559. data/ext/third_party/json/include/tao/json/internal/action.hpp +3 -3
  560. data/ext/third_party/json/include/tao/json/internal/dependent_false.hpp +14 -0
  561. data/ext/third_party/json/include/tao/json/internal/errors.hpp +17 -17
  562. data/ext/third_party/json/include/tao/json/internal/format.hpp +0 -2
  563. data/ext/third_party/json/include/tao/json/internal/grammar.hpp +17 -17
  564. data/ext/third_party/json/include/tao/json/internal/pair.hpp +1 -1
  565. data/ext/third_party/json/include/tao/json/internal/sha256.hpp +8 -8
  566. data/ext/third_party/json/include/tao/json/internal/single.hpp +1 -1
  567. data/ext/third_party/json/include/tao/json/internal/type_traits.hpp +12 -29
  568. data/ext/third_party/json/include/tao/json/jaxn/consume_file.hpp +7 -7
  569. data/ext/third_party/json/include/tao/json/jaxn/events/from_file.hpp +4 -4
  570. data/ext/third_party/json/include/tao/json/jaxn/events/from_string.hpp +2 -2
  571. data/ext/third_party/json/include/tao/json/jaxn/from_file.hpp +5 -5
  572. data/ext/third_party/json/include/tao/json/jaxn/internal/action.hpp +6 -6
  573. data/ext/third_party/json/include/tao/json/jaxn/internal/bunescape_action.hpp +2 -2
  574. data/ext/third_party/json/include/tao/json/jaxn/internal/errors.hpp +43 -43
  575. data/ext/third_party/json/include/tao/json/jaxn/internal/grammar.hpp +36 -36
  576. data/ext/third_party/json/include/tao/json/jaxn/internal/integer.hpp +10 -11
  577. data/ext/third_party/json/include/tao/json/jaxn/is_identifier.hpp +2 -2
  578. data/ext/third_party/json/include/tao/json/jaxn/parts_parser.hpp +1 -3
  579. data/ext/third_party/json/include/tao/json/message_extension.hpp +2 -2
  580. data/ext/third_party/json/include/tao/json/msgpack.hpp +1 -0
  581. data/ext/third_party/json/include/tao/json/msgpack/consume_file.hpp +7 -7
  582. data/ext/third_party/json/include/tao/json/msgpack/events/from_binary.hpp +43 -0
  583. data/ext/third_party/json/include/tao/json/msgpack/events/from_file.hpp +4 -4
  584. data/ext/third_party/json/include/tao/json/msgpack/events/from_string.hpp +4 -4
  585. data/ext/third_party/json/include/tao/json/msgpack/events/to_stream.hpp +4 -4
  586. data/ext/third_party/json/include/tao/json/msgpack/from_binary.hpp +32 -0
  587. data/ext/third_party/json/include/tao/json/msgpack/from_file.hpp +5 -5
  588. data/ext/third_party/json/include/tao/json/msgpack/internal/grammar.hpp +2 -1
  589. data/ext/third_party/json/include/tao/json/operators.hpp +0 -4
  590. data/ext/third_party/json/include/tao/json/parts_parser.hpp +3 -7
  591. data/ext/third_party/json/include/tao/json/self_contained.hpp +6 -18
  592. data/ext/third_party/json/include/tao/json/span.hpp +94 -166
  593. data/ext/third_party/json/include/tao/json/ubjson.hpp +1 -0
  594. data/ext/third_party/json/include/tao/json/ubjson/consume_file.hpp +7 -7
  595. data/ext/third_party/json/include/tao/json/ubjson/events/from_binary.hpp +43 -0
  596. data/ext/third_party/json/include/tao/json/ubjson/events/from_file.hpp +4 -4
  597. data/ext/third_party/json/include/tao/json/ubjson/events/from_string.hpp +3 -3
  598. data/ext/third_party/json/include/tao/json/ubjson/from_binary.hpp +32 -0
  599. data/ext/third_party/json/include/tao/json/ubjson/from_file.hpp +5 -5
  600. data/ext/third_party/json/include/tao/json/ubjson/internal/grammar.hpp +5 -3
  601. data/ext/third_party/json/include/tao/json/utf8.hpp +1 -1
  602. data/ext/third_party/snappy/snappy.cc +6 -2
  603. data/ext/third_party/spdlog/CMakeLists.txt +24 -57
  604. data/ext/third_party/spdlog/cmake/version.rc.in +1 -1
  605. data/ext/third_party/spdlog/include/spdlog/async.h +3 -3
  606. data/ext/third_party/spdlog/include/spdlog/cfg/argv.h +3 -4
  607. data/ext/third_party/spdlog/include/spdlog/cfg/env.h +6 -4
  608. data/ext/third_party/spdlog/include/spdlog/cfg/helpers-inl.h +22 -6
  609. data/ext/third_party/spdlog/include/spdlog/cfg/helpers.h +3 -2
  610. data/ext/third_party/spdlog/include/spdlog/common.h +1 -2
  611. data/ext/third_party/spdlog/include/spdlog/details/fmt_helper.h +9 -1
  612. data/ext/third_party/spdlog/include/spdlog/details/os.h +1 -1
  613. data/ext/third_party/spdlog/include/spdlog/details/registry-inl.h +21 -7
  614. data/ext/third_party/spdlog/include/spdlog/details/registry.h +6 -3
  615. data/ext/third_party/spdlog/include/spdlog/details/synchronous_factory.h +1 -1
  616. data/ext/third_party/spdlog/include/spdlog/details/tcp_client-windows.h +1 -1
  617. data/ext/third_party/spdlog/include/spdlog/details/tcp_client.h +8 -7
  618. data/ext/third_party/spdlog/include/spdlog/fmt/bin_to_hex.h +2 -2
  619. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/chrono.h +66 -62
  620. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/color.h +35 -37
  621. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/compile.h +173 -103
  622. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/core.h +538 -445
  623. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format-inl.h +114 -64
  624. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format.h +1152 -1071
  625. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/locale.h +16 -16
  626. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/os.h +450 -0
  627. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ostream.h +37 -13
  628. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/posix.h +1 -1
  629. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/printf.h +93 -63
  630. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ranges.h +35 -36
  631. data/ext/third_party/spdlog/include/spdlog/fmt/chrono.h +20 -0
  632. data/ext/third_party/spdlog/include/spdlog/fmt/fmt.h +2 -0
  633. data/ext/third_party/spdlog/include/spdlog/logger-inl.h +5 -1
  634. data/ext/third_party/spdlog/include/spdlog/logger.h +50 -76
  635. data/ext/third_party/spdlog/include/spdlog/pattern_formatter-inl.h +23 -8
  636. data/ext/third_party/spdlog/include/spdlog/pattern_formatter.h +3 -3
  637. data/ext/third_party/spdlog/include/spdlog/sinks/daily_file_sink.h +1 -1
  638. data/ext/third_party/spdlog/include/spdlog/sinks/msvc_sink.h +5 -5
  639. data/ext/third_party/spdlog/include/spdlog/sinks/ringbuffer_sink.h +6 -4
  640. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks-inl.h +32 -3
  641. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks.h +7 -0
  642. data/ext/third_party/spdlog/include/spdlog/sinks/wincolor_sink-inl.h +4 -14
  643. data/ext/third_party/spdlog/include/spdlog/spdlog-inl.h +11 -1
  644. data/ext/third_party/spdlog/include/spdlog/spdlog.h +23 -68
  645. data/ext/third_party/spdlog/include/spdlog/stopwatch.h +61 -0
  646. data/ext/third_party/spdlog/include/spdlog/version.h +2 -2
  647. data/ext/third_party/spdlog/src/fmt.cpp +21 -147
  648. data/lib/couchbase/cluster.rb +111 -1
  649. data/lib/couchbase/collection_options.rb +18 -1
  650. data/lib/couchbase/errors.rb +3 -0
  651. data/lib/couchbase/libcouchbase.bundle +0 -0
  652. data/lib/couchbase/management/bucket_manager.rb +36 -3
  653. data/lib/couchbase/management/search_index_manager.rb +42 -1
  654. data/lib/couchbase/management/user_manager.rb +155 -48
  655. data/lib/couchbase/query_options.rb +7 -0
  656. data/lib/couchbase/scope.rb +1 -0
  657. data/lib/couchbase/search_options.rb +69 -1
  658. data/lib/couchbase/version.rb +1 -1
  659. metadata +171 -267
  660. data/.rubocop.yml +0 -227
  661. data/.rubocop_todo.yml +0 -47
  662. data/.yardopts +0 -1
  663. data/CONTRIBUTING.md +0 -110
  664. data/Gemfile +0 -37
  665. data/Rakefile +0 -51
  666. data/couchbase.gemspec +0 -79
  667. data/examples/analytics.rb +0 -236
  668. data/examples/auth.rb +0 -33
  669. data/examples/crud.rb +0 -34
  670. data/examples/managing_analytics_indexes.rb +0 -86
  671. data/examples/managing_buckets.rb +0 -61
  672. data/examples/managing_collections.rb +0 -71
  673. data/examples/managing_query_indexes.rb +0 -83
  674. data/examples/managing_search_indexes.rb +0 -77
  675. data/examples/managing_view_indexes.rb +0 -68
  676. data/examples/query.rb +0 -32
  677. data/examples/query_with_consistency.rb +0 -86
  678. data/examples/search.rb +0 -202
  679. data/examples/search_with_consistency.rb +0 -97
  680. data/examples/subdocument.rb +0 -63
  681. data/examples/view.rb +0 -59
  682. data/ext/.clang-format +0 -15
  683. data/ext/.clang-tidy +0 -22
  684. data/ext/.cmake-format.yaml +0 -8
  685. data/ext/.gitignore +0 -2
  686. data/ext/.idea/.name +0 -1
  687. data/ext/.idea/dictionaries/couchbase_terms.xml +0 -14
  688. data/ext/.idea/ext.iml +0 -2
  689. data/ext/.idea/misc.xml +0 -16
  690. data/ext/.idea/modules.xml +0 -8
  691. data/ext/.idea/vcs.xml +0 -12
  692. data/ext/test/main.cxx +0 -184
  693. data/ext/third_party/asio/.appveyor.yml +0 -107
  694. data/ext/third_party/asio/.cirrus.yml +0 -16
  695. data/ext/third_party/asio/.gitignore +0 -3
  696. data/ext/third_party/asio/.travis.yml +0 -323
  697. data/ext/third_party/asio/asio/.gitignore +0 -23
  698. data/ext/third_party/asio/asio/COPYING +0 -4
  699. data/ext/third_party/asio/asio/INSTALL +0 -5
  700. data/ext/third_party/asio/asio/LICENSE_1_0.txt +0 -23
  701. data/ext/third_party/asio/asio/Makefile.am +0 -19
  702. data/ext/third_party/asio/asio/README +0 -4
  703. data/ext/third_party/asio/asio/asio.manifest +0 -4865
  704. data/ext/third_party/asio/asio/autogen.sh +0 -55
  705. data/ext/third_party/asio/asio/boost_asio.manifest +0 -5193
  706. data/ext/third_party/asio/asio/boostify.pl +0 -603
  707. data/ext/third_party/asio/asio/configure.ac +0 -182
  708. data/ext/third_party/asio/asio/include/.gitignore +0 -2
  709. data/ext/third_party/asio/asio/include/Makefile.am +0 -484
  710. data/ext/third_party/asio/asio/include/asio/detail/io_object_executor.hpp +0 -167
  711. data/ext/third_party/asio/asio/include/asio/impl/src.cpp +0 -25
  712. data/ext/third_party/asio/asio/release.pl +0 -440
  713. data/ext/third_party/asio/asio/src/.gitignore +0 -11
  714. data/ext/third_party/asio/asio/src/Makefile.am +0 -23
  715. data/ext/third_party/asio/asio/src/Makefile.mgw +0 -204
  716. data/ext/third_party/asio/asio/src/Makefile.msc +0 -497
  717. data/ext/third_party/asio/asio/src/asio.cpp +0 -11
  718. data/ext/third_party/asio/asio/src/asio_ssl.cpp +0 -11
  719. data/ext/third_party/asio/asio/src/doc/.gitignore +0 -5
  720. data/ext/third_party/asio/asio/src/doc/Jamfile.v2 +0 -62
  721. data/ext/third_party/asio/asio/src/doc/asio.png +0 -0
  722. data/ext/third_party/asio/asio/src/doc/asio.qbk +0 -127
  723. data/ext/third_party/asio/asio/src/doc/asioref.sty +0 -90
  724. data/ext/third_party/asio/asio/src/doc/asioref.xsl +0 -94
  725. data/ext/third_party/asio/asio/src/doc/boost_bind_dox.txt +0 -5
  726. data/ext/third_party/asio/asio/src/doc/doxy2qbk.pl +0 -22
  727. data/ext/third_party/asio/asio/src/doc/examples.qbk +0 -564
  728. data/ext/third_party/asio/asio/src/doc/history.qbk +0 -1794
  729. data/ext/third_party/asio/asio/src/doc/index.xml +0 -13
  730. data/ext/third_party/asio/asio/src/doc/makepdf.pl +0 -26
  731. data/ext/third_party/asio/asio/src/doc/net_ts.qbk +0 -479
  732. data/ext/third_party/asio/asio/src/doc/noncopyable_dox.txt +0 -3
  733. data/ext/third_party/asio/asio/src/doc/overview.qbk +0 -103
  734. data/ext/third_party/asio/asio/src/doc/overview/allocation.qbk +0 -89
  735. data/ext/third_party/asio/asio/src/doc/overview/async.qbk +0 -185
  736. data/ext/third_party/asio/asio/src/doc/overview/async_op1.dot +0 -78
  737. data/ext/third_party/asio/asio/src/doc/overview/async_op1.png +0 -0
  738. data/ext/third_party/asio/asio/src/doc/overview/async_op2.dot +0 -78
  739. data/ext/third_party/asio/asio/src/doc/overview/async_op2.png +0 -0
  740. data/ext/third_party/asio/asio/src/doc/overview/basics.qbk +0 -106
  741. data/ext/third_party/asio/asio/src/doc/overview/bsd_sockets.qbk +0 -270
  742. data/ext/third_party/asio/asio/src/doc/overview/buffers.qbk +0 -163
  743. data/ext/third_party/asio/asio/src/doc/overview/concurrency_hint.qbk +0 -88
  744. data/ext/third_party/asio/asio/src/doc/overview/coroutine.qbk +0 -51
  745. data/ext/third_party/asio/asio/src/doc/overview/coroutines_ts.qbk +0 -97
  746. data/ext/third_party/asio/asio/src/doc/overview/cpp2011.qbk +0 -271
  747. data/ext/third_party/asio/asio/src/doc/overview/handler_tracking.qbk +0 -220
  748. data/ext/third_party/asio/asio/src/doc/overview/implementation.qbk +0 -305
  749. data/ext/third_party/asio/asio/src/doc/overview/iostreams.qbk +0 -72
  750. data/ext/third_party/asio/asio/src/doc/overview/line_based.qbk +0 -118
  751. data/ext/third_party/asio/asio/src/doc/overview/other_protocols.qbk +0 -94
  752. data/ext/third_party/asio/asio/src/doc/overview/posix.qbk +0 -152
  753. data/ext/third_party/asio/asio/src/doc/overview/proactor.dot +0 -100
  754. data/ext/third_party/asio/asio/src/doc/overview/proactor.png +0 -0
  755. data/ext/third_party/asio/asio/src/doc/overview/protocols.qbk +0 -149
  756. data/ext/third_party/asio/asio/src/doc/overview/rationale.qbk +0 -54
  757. data/ext/third_party/asio/asio/src/doc/overview/reactor.qbk +0 -44
  758. data/ext/third_party/asio/asio/src/doc/overview/serial_ports.qbk +0 -45
  759. data/ext/third_party/asio/asio/src/doc/overview/signals.qbk +0 -44
  760. data/ext/third_party/asio/asio/src/doc/overview/spawn.qbk +0 -102
  761. data/ext/third_party/asio/asio/src/doc/overview/ssl.qbk +0 -124
  762. data/ext/third_party/asio/asio/src/doc/overview/strands.qbk +0 -114
  763. data/ext/third_party/asio/asio/src/doc/overview/streams.qbk +0 -62
  764. data/ext/third_party/asio/asio/src/doc/overview/sync_op.dot +0 -67
  765. data/ext/third_party/asio/asio/src/doc/overview/sync_op.png +0 -0
  766. data/ext/third_party/asio/asio/src/doc/overview/threads.qbk +0 -67
  767. data/ext/third_party/asio/asio/src/doc/overview/timers.qbk +0 -52
  768. data/ext/third_party/asio/asio/src/doc/overview/windows.qbk +0 -126
  769. data/ext/third_party/asio/asio/src/doc/project-root.jam +0 -1
  770. data/ext/third_party/asio/asio/src/doc/quickref.xml +0 -561
  771. data/ext/third_party/asio/asio/src/doc/reference.dox +0 -264
  772. data/ext/third_party/asio/asio/src/doc/reference.qbk +0 -125973
  773. data/ext/third_party/asio/asio/src/doc/reference.xsl +0 -1831
  774. data/ext/third_party/asio/asio/src/doc/release_checklist.htm +0 -68
  775. data/ext/third_party/asio/asio/src/doc/requirements/AcceptHandler.qbk +0 -72
  776. data/ext/third_party/asio/asio/src/doc/requirements/AcceptableProtocol.qbk +0 -25
  777. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessReadDevice.qbk +0 -56
  778. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessWriteDevice.qbk +0 -57
  779. data/ext/third_party/asio/asio/src/doc/requirements/AsyncReadStream.qbk +0 -50
  780. data/ext/third_party/asio/asio/src/doc/requirements/AsyncWriteStream.qbk +0 -48
  781. data/ext/third_party/asio/asio/src/doc/requirements/BufferedHandshakeHandler.qbk +0 -55
  782. data/ext/third_party/asio/asio/src/doc/requirements/CompletionCondition.qbk +0 -42
  783. data/ext/third_party/asio/asio/src/doc/requirements/CompletionHandler.qbk +0 -63
  784. data/ext/third_party/asio/asio/src/doc/requirements/ConnectCondition.qbk +0 -34
  785. data/ext/third_party/asio/asio/src/doc/requirements/ConnectHandler.qbk +0 -72
  786. data/ext/third_party/asio/asio/src/doc/requirements/ConstBufferSequence.qbk +0 -53
  787. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer.qbk +0 -16
  788. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v1.qbk +0 -93
  789. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v2.qbk +0 -94
  790. data/ext/third_party/asio/asio/src/doc/requirements/Endpoint.qbk +0 -97
  791. data/ext/third_party/asio/asio/src/doc/requirements/EndpointSequence.qbk +0 -30
  792. data/ext/third_party/asio/asio/src/doc/requirements/ExecutionContext.qbk +0 -36
  793. data/ext/third_party/asio/asio/src/doc/requirements/Executor.qbk +0 -141
  794. data/ext/third_party/asio/asio/src/doc/requirements/GettableSerialPortOption.qbk +0 -33
  795. data/ext/third_party/asio/asio/src/doc/requirements/GettableSocketOption.qbk +0 -67
  796. data/ext/third_party/asio/asio/src/doc/requirements/Handler.qbk +0 -64
  797. data/ext/third_party/asio/asio/src/doc/requirements/HandshakeHandler.qbk +0 -72
  798. data/ext/third_party/asio/asio/src/doc/requirements/InternetProtocol.qbk +0 -47
  799. data/ext/third_party/asio/asio/src/doc/requirements/IoControlCommand.qbk +0 -34
  800. data/ext/third_party/asio/asio/src/doc/requirements/IoObjectService.qbk +0 -62
  801. data/ext/third_party/asio/asio/src/doc/requirements/IteratorConnectHandler.qbk +0 -81
  802. data/ext/third_party/asio/asio/src/doc/requirements/LegacyCompletionHandler.qbk +0 -65
  803. data/ext/third_party/asio/asio/src/doc/requirements/MoveAcceptHandler.qbk +0 -61
  804. data/ext/third_party/asio/asio/src/doc/requirements/MutableBufferSequence.qbk +0 -54
  805. data/ext/third_party/asio/asio/src/doc/requirements/ProtoAllocator.qbk +0 -19
  806. data/ext/third_party/asio/asio/src/doc/requirements/Protocol.qbk +0 -56
  807. data/ext/third_party/asio/asio/src/doc/requirements/RangeConnectHandler.qbk +0 -82
  808. data/ext/third_party/asio/asio/src/doc/requirements/ReadHandler.qbk +0 -79
  809. data/ext/third_party/asio/asio/src/doc/requirements/ResolveHandler.qbk +0 -82
  810. data/ext/third_party/asio/asio/src/doc/requirements/Service.qbk +0 -40
  811. data/ext/third_party/asio/asio/src/doc/requirements/SettableSerialPortOption.qbk +0 -33
  812. data/ext/third_party/asio/asio/src/doc/requirements/SettableSocketOption.qbk +0 -54
  813. data/ext/third_party/asio/asio/src/doc/requirements/ShutdownHandler.qbk +0 -72
  814. data/ext/third_party/asio/asio/src/doc/requirements/SignalHandler.qbk +0 -79
  815. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessReadDevice.qbk +0 -49
  816. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessWriteDevice.qbk +0 -49
  817. data/ext/third_party/asio/asio/src/doc/requirements/SyncReadStream.qbk +0 -41
  818. data/ext/third_party/asio/asio/src/doc/requirements/SyncWriteStream.qbk +0 -39
  819. data/ext/third_party/asio/asio/src/doc/requirements/TimeTraits.qbk +0 -72
  820. data/ext/third_party/asio/asio/src/doc/requirements/WaitHandler.qbk +0 -72
  821. data/ext/third_party/asio/asio/src/doc/requirements/WaitTraits.qbk +0 -52
  822. data/ext/third_party/asio/asio/src/doc/requirements/WriteHandler.qbk +0 -79
  823. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_operations.qbk +0 -300
  824. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_socket_operations.qbk +0 -39
  825. data/ext/third_party/asio/asio/src/doc/requirements/read_write_operations.qbk +0 -34
  826. data/ext/third_party/asio/asio/src/doc/requirements/synchronous_socket_operations.qbk +0 -37
  827. data/ext/third_party/asio/asio/src/doc/std_exception_dox.txt +0 -7
  828. data/ext/third_party/asio/asio/src/doc/tutorial.dox +0 -226
  829. data/ext/third_party/asio/asio/src/doc/tutorial.qbk +0 -2387
  830. data/ext/third_party/asio/asio/src/doc/tutorial.xsl +0 -437
  831. data/ext/third_party/asio/asio/src/doc/using.qbk +0 -309
  832. data/ext/third_party/asio/asio/tsify.pl +0 -574
  833. data/ext/third_party/gsl/.clang-format +0 -34
  834. data/ext/third_party/gsl/.github/workflows/main.yml +0 -94
  835. data/ext/third_party/gsl/.gitignore +0 -16
  836. data/ext/third_party/gsl/.travis.yml +0 -551
  837. data/ext/third_party/gsl/CMakeSettings.json +0 -18
  838. data/ext/third_party/gsl/CONTRIBUTING.md +0 -29
  839. data/ext/third_party/gsl/GSL.natvis +0 -98
  840. data/ext/third_party/gsl/README.md +0 -124
  841. data/ext/third_party/gsl/appveyor.yml +0 -128
  842. data/ext/third_party/http_parser/.gitignore +0 -30
  843. data/ext/third_party/http_parser/.mailmap +0 -8
  844. data/ext/third_party/http_parser/.travis.yml +0 -13
  845. data/ext/third_party/http_parser/AUTHORS +0 -68
  846. data/ext/third_party/http_parser/Makefile +0 -160
  847. data/ext/third_party/http_parser/README.md +0 -246
  848. data/ext/third_party/http_parser/bench.c +0 -128
  849. data/ext/third_party/http_parser/http_parser.gyp +0 -111
  850. data/ext/third_party/http_parser/test.c +0 -4600
  851. data/ext/third_party/json/.appveyor.yml +0 -44
  852. data/ext/third_party/json/.clang-format +0 -84
  853. data/ext/third_party/json/.conan/build.py +0 -80
  854. data/ext/third_party/json/.conan/test_package/CMakeLists.txt +0 -12
  855. data/ext/third_party/json/.conan/test_package/conanfile.py +0 -24
  856. data/ext/third_party/json/.conan/test_package/test_package.cpp +0 -16
  857. data/ext/third_party/json/.gitignore +0 -3
  858. data/ext/third_party/json/.travis.yml +0 -173
  859. data/ext/third_party/json/Makefile +0 -77
  860. data/ext/third_party/json/README.md +0 -149
  861. data/ext/third_party/json/conanfile.py +0 -28
  862. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/analyze_cycles.hpp +0 -127
  863. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/counted.hpp +0 -23
  864. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/generic.hpp +0 -31
  865. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/grammar_info.hpp +0 -32
  866. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_guard.hpp +0 -51
  867. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_rules.hpp +0 -25
  868. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_info.hpp +0 -29
  869. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_type.hpp +0 -21
  870. data/ext/third_party/json/include/tao/json/external/pegtl/analyze.hpp +0 -21
  871. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/counter.hpp +0 -54
  872. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/tracer.hpp +0 -158
  873. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alnum.hpp +0 -18
  874. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alpha.hpp +0 -18
  875. data/ext/third_party/json/include/tao/json/external/pegtl/internal/dusel_mode.hpp +0 -23
  876. data/ext/third_party/json/include/tao/json/external/pegtl/internal/duseltronik.hpp +0 -187
  877. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_opener.hpp +0 -72
  878. data/ext/third_party/json/include/tao/json/external/pegtl/internal/trivial.hpp +0 -32
  879. data/ext/third_party/snappy/.appveyor.yml +0 -36
  880. data/ext/third_party/snappy/.gitignore +0 -8
  881. data/ext/third_party/snappy/.travis.yml +0 -98
  882. data/ext/third_party/snappy/AUTHORS +0 -1
  883. data/ext/third_party/snappy/CONTRIBUTING.md +0 -26
  884. data/ext/third_party/snappy/NEWS +0 -188
  885. data/ext/third_party/snappy/README.md +0 -148
  886. data/ext/third_party/snappy/docs/README.md +0 -72
  887. data/ext/third_party/snappy/format_description.txt +0 -110
  888. data/ext/third_party/snappy/framing_format.txt +0 -135
  889. data/ext/third_party/snappy/snappy-test.cc +0 -613
  890. data/ext/third_party/snappy/snappy-test.h +0 -526
  891. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +0 -60
  892. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +0 -58
  893. data/ext/third_party/snappy/snappy_unittest.cc +0 -1512
  894. data/ext/third_party/spdlog/.clang-format +0 -108
  895. data/ext/third_party/spdlog/.clang-tidy +0 -54
  896. data/ext/third_party/spdlog/.gitattributes +0 -1
  897. data/ext/third_party/spdlog/.gitignore +0 -83
  898. data/ext/third_party/spdlog/.travis.yml +0 -112
  899. data/ext/third_party/spdlog/INSTALL +0 -24
  900. data/ext/third_party/spdlog/README.md +0 -423
  901. data/ext/third_party/spdlog/appveyor.yml +0 -51
  902. data/ext/third_party/spdlog/include/spdlog/cfg/log_levels.h +0 -47
@@ -73,11 +73,12 @@ struct handler_tracking::tracking_state
73
73
  static_mutex mutex_;
74
74
  uint64_t next_id_;
75
75
  tss_ptr<completion>* current_completion_;
76
+ tss_ptr<location>* current_location_;
76
77
  };
77
78
 
78
79
  handler_tracking::tracking_state* handler_tracking::get_state()
79
80
  {
80
- static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0 };
81
+ static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0, 0 };
81
82
  return &state;
82
83
  }
83
84
 
@@ -90,6 +91,25 @@ void handler_tracking::init()
90
91
  static_mutex::scoped_lock lock(state->mutex_);
91
92
  if (state->current_completion_ == 0)
92
93
  state->current_completion_ = new tss_ptr<completion>;
94
+ if (state->current_location_ == 0)
95
+ state->current_location_ = new tss_ptr<location>;
96
+ }
97
+
98
+ handler_tracking::location::location(
99
+ const char* file, int line, const char* func)
100
+ : file_(file),
101
+ line_(line),
102
+ func_(func),
103
+ next_(*get_state()->current_location_)
104
+ {
105
+ if (file_)
106
+ *get_state()->current_location_ = this;
107
+ }
108
+
109
+ handler_tracking::location::~location()
110
+ {
111
+ if (file_)
112
+ *get_state()->current_location_ = next_;
93
113
  }
94
114
 
95
115
  void handler_tracking::creation(execution_context&,
@@ -109,6 +129,24 @@ void handler_tracking::creation(execution_context&,
109
129
  if (completion* current_completion = *state->current_completion_)
110
130
  current_id = current_completion->id_;
111
131
 
132
+ for (location* current_location = *state->current_location_;
133
+ current_location; current_location = current_location->next_)
134
+ {
135
+ write_line(
136
+ #if defined(ASIO_WINDOWS)
137
+ "@asio|%I64u.%06I64u|%I64u^%I64u|%s%s%.80s%s(%.80s:%d)\n",
138
+ #else // defined(ASIO_WINDOWS)
139
+ "@asio|%llu.%06llu|%llu^%llu|%s%s%.80s%s(%.80s:%d)\n",
140
+ #endif // defined(ASIO_WINDOWS)
141
+ timestamp.seconds, timestamp.microseconds,
142
+ current_id, h.id_,
143
+ current_location == *state->current_location_ ? "in " : "called from ",
144
+ current_location->func_ ? "'" : "",
145
+ current_location->func_ ? current_location->func_ : "",
146
+ current_location->func_ ? "' " : "",
147
+ current_location->file_, current_location->line_);
148
+ }
149
+
112
150
  write_line(
113
151
  #if defined(ASIO_WINDOWS)
114
152
  "@asio|%I64u.%06I64u|%I64u*%I64u|%.20s@%p.%.50s\n",
@@ -69,8 +69,8 @@ asio::error_code reactive_serial_port_service::open(
69
69
 
70
70
  // Set up default serial port options.
71
71
  termios ios;
72
- errno = 0;
73
- s = descriptor_ops::error_wrapper(::tcgetattr(fd, &ios), ec);
72
+ s = ::tcgetattr(fd, &ios);
73
+ descriptor_ops::get_last_error(ec, s < 0);
74
74
  if (s >= 0)
75
75
  {
76
76
  #if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE)
@@ -85,8 +85,8 @@ asio::error_code reactive_serial_port_service::open(
85
85
  #endif
86
86
  ios.c_iflag |= IGNPAR;
87
87
  ios.c_cflag |= CREAD | CLOCAL;
88
- errno = 0;
89
- s = descriptor_ops::error_wrapper(::tcsetattr(fd, TCSANOW, &ios), ec);
88
+ s = ::tcsetattr(fd, TCSANOW, &ios);
89
+ descriptor_ops::get_last_error(ec, s < 0);
90
90
  }
91
91
  if (s < 0)
92
92
  {
@@ -111,18 +111,16 @@ asio::error_code reactive_serial_port_service::do_set_option(
111
111
  const void* option, asio::error_code& ec)
112
112
  {
113
113
  termios ios;
114
- errno = 0;
115
- descriptor_ops::error_wrapper(::tcgetattr(
116
- descriptor_service_.native_handle(impl), &ios), ec);
117
- if (ec)
114
+ int s = ::tcgetattr(descriptor_service_.native_handle(impl), &ios);
115
+ descriptor_ops::get_last_error(ec, s < 0);
116
+ if (s < 0)
118
117
  return ec;
119
118
 
120
119
  if (store(option, ios, ec))
121
120
  return ec;
122
121
 
123
- errno = 0;
124
- descriptor_ops::error_wrapper(::tcsetattr(
125
- descriptor_service_.native_handle(impl), TCSANOW, &ios), ec);
122
+ s = ::tcsetattr(descriptor_service_.native_handle(impl), TCSANOW, &ios);
123
+ descriptor_ops::get_last_error(ec, s < 0);
126
124
  return ec;
127
125
  }
128
126
 
@@ -132,10 +130,9 @@ asio::error_code reactive_serial_port_service::do_get_option(
132
130
  void* option, asio::error_code& ec) const
133
131
  {
134
132
  termios ios;
135
- errno = 0;
136
- descriptor_ops::error_wrapper(::tcgetattr(
137
- descriptor_service_.native_handle(impl), &ios), ec);
138
- if (ec)
133
+ int s = ::tcgetattr(descriptor_service_.native_handle(impl), &ios);
134
+ descriptor_ops::get_last_error(ec, s < 0);
135
+ if (s < 0)
139
136
  return ec;
140
137
 
141
138
  return load(option, ios, ec);
@@ -135,6 +135,10 @@ scheduler::~scheduler()
135
135
  {
136
136
  if (thread_)
137
137
  {
138
+ mutex::scoped_lock lock(mutex_);
139
+ shutdown_ = true;
140
+ stop_all_threads(lock);
141
+ lock.unlock();
138
142
  thread_->join();
139
143
  delete thread_;
140
144
  }
@@ -320,6 +324,12 @@ void scheduler::compensating_work_started()
320
324
  ++static_cast<thread_info*>(this_thread)->private_outstanding_work;
321
325
  }
322
326
 
327
+ void scheduler::capture_current_exception()
328
+ {
329
+ if (thread_info_base* this_thread = thread_call_stack::contains(this))
330
+ this_thread->capture_current_exception();
331
+ }
332
+
323
333
  void scheduler::post_immediate_completion(
324
334
  scheduler::operation* op, bool is_continuation)
325
335
  {
@@ -343,6 +353,30 @@ void scheduler::post_immediate_completion(
343
353
  wake_one_thread_and_unlock(lock);
344
354
  }
345
355
 
356
+ void scheduler::post_immediate_completions(std::size_t n,
357
+ op_queue<scheduler::operation>& ops, bool is_continuation)
358
+ {
359
+ #if defined(ASIO_HAS_THREADS)
360
+ if (one_thread_ || is_continuation)
361
+ {
362
+ if (thread_info_base* this_thread = thread_call_stack::contains(this))
363
+ {
364
+ static_cast<thread_info*>(this_thread)->private_outstanding_work
365
+ += static_cast<long>(n);
366
+ static_cast<thread_info*>(this_thread)->private_op_queue.push(ops);
367
+ return;
368
+ }
369
+ }
370
+ #else // defined(ASIO_HAS_THREADS)
371
+ (void)is_continuation;
372
+ #endif // defined(ASIO_HAS_THREADS)
373
+
374
+ increment(outstanding_work_, static_cast<long>(n));
375
+ mutex::scoped_lock lock(mutex_);
376
+ op_queue_.push(ops);
377
+ wake_one_thread_and_unlock(lock);
378
+ }
379
+
346
380
  void scheduler::post_deferred_completion(scheduler::operation* op)
347
381
  {
348
382
  #if defined(ASIO_HAS_THREADS)
@@ -444,6 +478,7 @@ std::size_t scheduler::do_run_one(mutex::scoped_lock& lock,
444
478
 
445
479
  // Complete the operation. May throw an exception. Deletes the object.
446
480
  o->complete(this, ec, task_result);
481
+ this_thread.rethrow_pending_exception();
447
482
 
448
483
  return 1;
449
484
  }
@@ -524,6 +559,7 @@ std::size_t scheduler::do_wait_one(mutex::scoped_lock& lock,
524
559
 
525
560
  // Complete the operation. May throw an exception. Deletes the object.
526
561
  o->complete(this, ec, task_result);
562
+ this_thread.rethrow_pending_exception();
527
563
 
528
564
  return 1;
529
565
  }
@@ -578,6 +614,7 @@ std::size_t scheduler::do_poll_one(mutex::scoped_lock& lock,
578
614
 
579
615
  // Complete the operation. May throw an exception. Deletes the object.
580
616
  o->complete(this, ec, task_result);
617
+ this_thread.rethrow_pending_exception();
581
618
 
582
619
  return 1;
583
620
  }
@@ -89,7 +89,8 @@ class signal_set_service::pipe_read_op : public reactor_op
89
89
  {
90
90
  public:
91
91
  pipe_read_op()
92
- : reactor_op(&pipe_read_op::do_perform, pipe_read_op::do_complete)
92
+ : reactor_op(asio::error_code(),
93
+ &pipe_read_op::do_perform, pipe_read_op::do_complete)
93
94
  {
94
95
  }
95
96
 
@@ -73,18 +73,23 @@ inline void clear_last_error()
73
73
 
74
74
  #if !defined(ASIO_WINDOWS_RUNTIME)
75
75
 
76
- template <typename ReturnType>
77
- inline ReturnType error_wrapper(ReturnType return_value,
78
- asio::error_code& ec)
76
+ inline void get_last_error(
77
+ asio::error_code& ec, bool is_error_condition)
79
78
  {
79
+ if (!is_error_condition)
80
+ {
81
+ ec.assign(0, ec.category());
82
+ }
83
+ else
84
+ {
80
85
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
81
- ec = asio::error_code(WSAGetLastError(),
82
- asio::error::get_system_category());
86
+ ec = asio::error_code(WSAGetLastError(),
87
+ asio::error::get_system_category());
83
88
  #else
84
- ec = asio::error_code(errno,
85
- asio::error::get_system_category());
89
+ ec = asio::error_code(errno,
90
+ asio::error::get_system_category());
86
91
  #endif
87
- return return_value;
92
+ }
88
93
  }
89
94
 
90
95
  template <typename SockLenType>
@@ -107,17 +112,16 @@ socket_type accept(socket_type s, socket_addr_type* addr,
107
112
  return invalid_socket;
108
113
  }
109
114
 
110
- clear_last_error();
111
-
112
- socket_type new_s = error_wrapper(call_accept(
113
- &msghdr::msg_namelen, s, addr, addrlen), ec);
115
+ socket_type new_s = call_accept(&msghdr::msg_namelen, s, addr, addrlen);
116
+ get_last_error(ec, new_s == invalid_socket);
114
117
  if (new_s == invalid_socket)
115
118
  return new_s;
116
119
 
117
120
  #if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
118
121
  int optval = 1;
119
- int result = error_wrapper(::setsockopt(new_s,
120
- SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec);
122
+ int result = ::setsockopt(new_s, SOL_SOCKET,
123
+ SO_NOSIGPIPE, &optval, sizeof(optval));
124
+ get_last_error(ec, result != 0);
121
125
  if (result != 0)
122
126
  {
123
127
  ::close(new_s);
@@ -125,7 +129,7 @@ socket_type accept(socket_type s, socket_addr_type* addr,
125
129
  }
126
130
  #endif
127
131
 
128
- ec = asio::error_code();
132
+ ec.assign(0, ec.category());
129
133
  return new_s;
130
134
  }
131
135
 
@@ -282,11 +286,8 @@ int bind(socket_type s, const socket_addr_type* addr,
282
286
  return socket_error_retval;
283
287
  }
284
288
 
285
- clear_last_error();
286
- int result = error_wrapper(call_bind(
287
- &msghdr::msg_namelen, s, addr, addrlen), ec);
288
- if (result == 0)
289
- ec = asio::error_code();
289
+ int result = call_bind(&msghdr::msg_namelen, s, addr, addrlen);
290
+ get_last_error(ec, result != 0);
290
291
  return result;
291
292
  }
292
293
 
@@ -309,12 +310,12 @@ int close(socket_type s, state_type& state,
309
310
  SO_LINGER, &opt, sizeof(opt), ignored_ec);
310
311
  }
311
312
 
312
- clear_last_error();
313
313
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
314
- result = error_wrapper(::closesocket(s), ec);
314
+ result = ::closesocket(s);
315
315
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
316
- result = error_wrapper(::close(s), ec);
316
+ result = ::close(s);
317
317
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
318
+ get_last_error(ec, result != 0);
318
319
 
319
320
  if (result != 0
320
321
  && (ec == asio::error::would_block
@@ -341,17 +342,15 @@ int close(socket_type s, state_type& state,
341
342
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
342
343
  state &= ~non_blocking;
343
344
 
344
- clear_last_error();
345
345
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
346
- result = error_wrapper(::closesocket(s), ec);
346
+ result = ::closesocket(s);
347
347
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
348
- result = error_wrapper(::close(s), ec);
348
+ result = ::close(s);
349
349
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
350
+ get_last_error(ec, result != 0);
350
351
  }
351
352
  }
352
353
 
353
- if (result == 0)
354
- ec = asio::error_code();
355
354
  return result;
356
355
  }
357
356
 
@@ -364,26 +363,27 @@ bool set_user_non_blocking(socket_type s,
364
363
  return false;
365
364
  }
366
365
 
367
- clear_last_error();
368
366
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
369
367
  ioctl_arg_type arg = (value ? 1 : 0);
370
- int result = error_wrapper(::ioctlsocket(s, FIONBIO, &arg), ec);
368
+ int result = ::ioctlsocket(s, FIONBIO, &arg);
369
+ get_last_error(ec, result < 0);
371
370
  #elif defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
372
- int result = error_wrapper(::fcntl(s, F_GETFL, 0), ec);
371
+ int result = ::fcntl(s, F_GETFL, 0);
372
+ get_last_error(ec, result < 0);
373
373
  if (result >= 0)
374
374
  {
375
- clear_last_error();
376
375
  int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
377
- result = error_wrapper(::fcntl(s, F_SETFL, flag), ec);
376
+ result = ::fcntl(s, F_SETFL, flag);
377
+ get_last_error(ec, result < 0);
378
378
  }
379
379
  #else
380
380
  ioctl_arg_type arg = (value ? 1 : 0);
381
- int result = error_wrapper(::ioctl(s, FIONBIO, &arg), ec);
381
+ int result = ::ioctl(s, FIONBIO, &arg);
382
+ get_last_error(ec, result < 0);
382
383
  #endif
383
384
 
384
385
  if (result >= 0)
385
386
  {
386
- ec = asio::error_code();
387
387
  if (value)
388
388
  state |= user_set_non_blocking;
389
389
  else
@@ -417,26 +417,27 @@ bool set_internal_non_blocking(socket_type s,
417
417
  return false;
418
418
  }
419
419
 
420
- clear_last_error();
421
420
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
422
421
  ioctl_arg_type arg = (value ? 1 : 0);
423
- int result = error_wrapper(::ioctlsocket(s, FIONBIO, &arg), ec);
422
+ int result = ::ioctlsocket(s, FIONBIO, &arg);
423
+ get_last_error(ec, result < 0);
424
424
  #elif defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
425
- int result = error_wrapper(::fcntl(s, F_GETFL, 0), ec);
425
+ int result = ::fcntl(s, F_GETFL, 0);
426
+ get_last_error(ec, result < 0);
426
427
  if (result >= 0)
427
428
  {
428
- clear_last_error();
429
429
  int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
430
- result = error_wrapper(::fcntl(s, F_SETFL, flag), ec);
430
+ result = ::fcntl(s, F_SETFL, flag);
431
+ get_last_error(ec, result < 0);
431
432
  }
432
433
  #else
433
434
  ioctl_arg_type arg = (value ? 1 : 0);
434
- int result = error_wrapper(::ioctl(s, FIONBIO, &arg), ec);
435
+ int result = ::ioctl(s, FIONBIO, &arg);
436
+ get_last_error(ec, result < 0);
435
437
  #endif
436
438
 
437
439
  if (result >= 0)
438
440
  {
439
- ec = asio::error_code();
440
441
  if (value)
441
442
  state |= internal_non_blocking;
442
443
  else
@@ -455,10 +456,8 @@ int shutdown(socket_type s, int what, asio::error_code& ec)
455
456
  return socket_error_retval;
456
457
  }
457
458
 
458
- clear_last_error();
459
- int result = error_wrapper(::shutdown(s, what), ec);
460
- if (result == 0)
461
- ec = asio::error_code();
459
+ int result = ::shutdown(s, what);
460
+ get_last_error(ec, result != 0);
462
461
  return result;
463
462
  }
464
463
 
@@ -478,13 +477,10 @@ int connect(socket_type s, const socket_addr_type* addr,
478
477
  return socket_error_retval;
479
478
  }
480
479
 
481
- clear_last_error();
482
- int result = error_wrapper(call_connect(
483
- &msghdr::msg_namelen, s, addr, addrlen), ec);
484
- if (result == 0)
485
- ec = asio::error_code();
480
+ int result = call_connect(&msghdr::msg_namelen, s, addr, addrlen);
481
+ get_last_error(ec, result != 0);
486
482
  #if defined(__linux__)
487
- else if (ec == asio::error::try_again)
483
+ if (result != 0 && ec == asio::error::try_again)
488
484
  ec = asio::error::no_buffer_space;
489
485
  #endif // defined(__linux__)
490
486
  return result;
@@ -600,7 +596,7 @@ bool non_blocking_connect(socket_type s, asio::error_code& ec)
600
596
  asio::error::get_system_category());
601
597
  }
602
598
  else
603
- ec = asio::error_code();
599
+ ec.assign(0, ec.category());
604
600
  }
605
601
 
606
602
  return true;
@@ -617,10 +613,8 @@ int socketpair(int af, int type, int protocol,
617
613
  ec = asio::error::operation_not_supported;
618
614
  return socket_error_retval;
619
615
  #else
620
- clear_last_error();
621
- int result = error_wrapper(::socketpair(af, type, protocol, sv), ec);
622
- if (result == 0)
623
- ec = asio::error_code();
616
+ int result = ::socketpair(af, type, protocol, sv);
617
+ get_last_error(ec, result != 0);
624
618
  return result;
625
619
  #endif
626
620
  }
@@ -636,20 +630,18 @@ bool sockatmark(socket_type s, asio::error_code& ec)
636
630
  #if defined(SIOCATMARK)
637
631
  ioctl_arg_type value = 0;
638
632
  # if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
639
- int result = error_wrapper(::ioctlsocket(s, SIOCATMARK, &value), ec);
633
+ int result = ::ioctlsocket(s, SIOCATMARK, &value);
640
634
  # else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
641
- int result = error_wrapper(::ioctl(s, SIOCATMARK, &value), ec);
635
+ int result = ::ioctl(s, SIOCATMARK, &value);
642
636
  # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
643
- if (result == 0)
644
- ec = asio::error_code();
637
+ get_last_error(ec, result < 0);
645
638
  # if defined(ENOTTY)
646
639
  if (ec.value() == ENOTTY)
647
640
  ec = asio::error::not_socket;
648
641
  # endif // defined(ENOTTY)
649
642
  #else // defined(SIOCATMARK)
650
- int value = error_wrapper(::sockatmark(s), ec);
651
- if (value != -1)
652
- ec = asio::error_code();
643
+ int value = ::sockatmark(s);
644
+ get_last_error(ec, result < 0);
653
645
  #endif // defined(SIOCATMARK)
654
646
 
655
647
  return ec ? false : value != 0;
@@ -665,12 +657,11 @@ size_t available(socket_type s, asio::error_code& ec)
665
657
 
666
658
  ioctl_arg_type value = 0;
667
659
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
668
- int result = error_wrapper(::ioctlsocket(s, FIONREAD, &value), ec);
660
+ int result = ::ioctlsocket(s, FIONREAD, &value);
669
661
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
670
- int result = error_wrapper(::ioctl(s, FIONREAD, &value), ec);
662
+ int result = ::ioctl(s, FIONREAD, &value);
671
663
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
672
- if (result == 0)
673
- ec = asio::error_code();
664
+ get_last_error(ec, result < 0);
674
665
  #if defined(ENOTTY)
675
666
  if (ec.value() == ENOTTY)
676
667
  ec = asio::error::not_socket;
@@ -687,10 +678,8 @@ int listen(socket_type s, int backlog, asio::error_code& ec)
687
678
  return socket_error_retval;
688
679
  }
689
680
 
690
- clear_last_error();
691
- int result = error_wrapper(::listen(s, backlog), ec);
692
- if (result == 0)
693
- ec = asio::error_code();
681
+ int result = ::listen(s, backlog);
682
+ get_last_error(ec, result != 0);
694
683
  return result;
695
684
  }
696
685
 
@@ -758,14 +747,14 @@ inline void init_msghdr_msg_name(T& name, const socket_addr_type* addr)
758
747
  signed_size_type recv(socket_type s, buf* bufs, size_t count,
759
748
  int flags, asio::error_code& ec)
760
749
  {
761
- clear_last_error();
762
750
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
763
751
  // Receive some data.
764
752
  DWORD recv_buf_count = static_cast<DWORD>(count);
765
753
  DWORD bytes_transferred = 0;
766
754
  DWORD recv_flags = flags;
767
- int result = error_wrapper(::WSARecv(s, bufs,
768
- recv_buf_count, &bytes_transferred, &recv_flags, 0, 0), ec);
755
+ int result = ::WSARecv(s, bufs, recv_buf_count,
756
+ &bytes_transferred, &recv_flags, 0, 0);
757
+ get_last_error(ec, true);
769
758
  if (ec.value() == ERROR_NETNAME_DELETED)
770
759
  ec = asio::error::connection_reset;
771
760
  else if (ec.value() == ERROR_PORT_UNREACHABLE)
@@ -774,15 +763,44 @@ signed_size_type recv(socket_type s, buf* bufs, size_t count,
774
763
  result = 0;
775
764
  if (result != 0)
776
765
  return socket_error_retval;
777
- ec = asio::error_code();
766
+ ec.assign(0, ec.category());
778
767
  return bytes_transferred;
779
768
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
780
769
  msghdr msg = msghdr();
781
770
  msg.msg_iov = bufs;
782
771
  msg.msg_iovlen = static_cast<int>(count);
783
- signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec);
784
- if (result >= 0)
785
- ec = asio::error_code();
772
+ signed_size_type result = ::recvmsg(s, &msg, flags);
773
+ get_last_error(ec, result < 0);
774
+ return result;
775
+ #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
776
+ }
777
+
778
+ signed_size_type recv1(socket_type s, void* data, size_t size,
779
+ int flags, asio::error_code& ec)
780
+ {
781
+ #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
782
+ // Receive some data.
783
+ WSABUF buf;
784
+ buf.buf = const_cast<char*>(static_cast<const char*>(data));
785
+ buf.len = static_cast<ULONG>(size);
786
+ DWORD bytes_transferred = 0;
787
+ DWORD recv_flags = flags;
788
+ int result = ::WSARecv(s, &buf, 1,
789
+ &bytes_transferred, &recv_flags, 0, 0);
790
+ get_last_error(ec, true);
791
+ if (ec.value() == ERROR_NETNAME_DELETED)
792
+ ec = asio::error::connection_reset;
793
+ else if (ec.value() == ERROR_PORT_UNREACHABLE)
794
+ ec = asio::error::connection_refused;
795
+ else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA)
796
+ result = 0;
797
+ if (result != 0)
798
+ return socket_error_retval;
799
+ ec.assign(0, ec.category());
800
+ return bytes_transferred;
801
+ #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
802
+ signed_size_type result = ::recv(s, static_cast<char*>(data), size, flags);
803
+ get_last_error(ec, result < 0);
786
804
  return result;
787
805
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
788
806
  }
@@ -799,7 +817,7 @@ size_t sync_recv(socket_type s, state_type state, buf* bufs,
799
817
  // A request to read 0 bytes on a stream is a no-op.
800
818
  if (all_empty && (state & stream_oriented))
801
819
  {
802
- ec = asio::error_code();
820
+ ec.assign(0, ec.category());
803
821
  return 0;
804
822
  }
805
823
 
@@ -809,10 +827,51 @@ size_t sync_recv(socket_type s, state_type state, buf* bufs,
809
827
  // Try to complete the operation without blocking.
810
828
  signed_size_type bytes = socket_ops::recv(s, bufs, count, flags, ec);
811
829
 
830
+ // Check for EOF.
831
+ if ((state & stream_oriented) && bytes == 0)
832
+ {
833
+ ec = asio::error::eof;
834
+ return 0;
835
+ }
836
+
812
837
  // Check if operation succeeded.
813
- if (bytes > 0)
838
+ if (bytes >= 0)
814
839
  return bytes;
815
840
 
841
+ // Operation failed.
842
+ if ((state & user_set_non_blocking)
843
+ || (ec != asio::error::would_block
844
+ && ec != asio::error::try_again))
845
+ return 0;
846
+
847
+ // Wait for socket to become ready.
848
+ if (socket_ops::poll_read(s, 0, -1, ec) < 0)
849
+ return 0;
850
+ }
851
+ }
852
+
853
+ size_t sync_recv1(socket_type s, state_type state, void* data,
854
+ size_t size, int flags, asio::error_code& ec)
855
+ {
856
+ if (s == invalid_socket)
857
+ {
858
+ ec = asio::error::bad_descriptor;
859
+ return 0;
860
+ }
861
+
862
+ // A request to read 0 bytes on a stream is a no-op.
863
+ if (size == 0 && (state & stream_oriented))
864
+ {
865
+ ec.assign(0, ec.category());
866
+ return 0;
867
+ }
868
+
869
+ // Read some data.
870
+ for (;;)
871
+ {
872
+ // Try to complete the operation without blocking.
873
+ signed_size_type bytes = socket_ops::recv1(s, data, size, flags, ec);
874
+
816
875
  // Check for EOF.
817
876
  if ((state & stream_oriented) && bytes == 0)
818
877
  {
@@ -820,6 +879,10 @@ size_t sync_recv(socket_type s, state_type state, buf* bufs,
820
879
  return 0;
821
880
  }
822
881
 
882
+ // Check if operation succeeded.
883
+ if (bytes >= 0)
884
+ return bytes;
885
+
823
886
  // Operation failed.
824
887
  if ((state & user_set_non_blocking)
825
888
  || (ec != asio::error::would_block
@@ -882,6 +945,13 @@ bool non_blocking_recv(socket_type s,
882
945
  return true;
883
946
  }
884
947
 
948
+ // Check if operation succeeded.
949
+ if (bytes >= 0)
950
+ {
951
+ bytes_transferred = bytes;
952
+ return true;
953
+ }
954
+
885
955
  // Retry operation if interrupted by signal.
886
956
  if (ec == asio::error::interrupted)
887
957
  continue;
@@ -891,15 +961,46 @@ bool non_blocking_recv(socket_type s,
891
961
  || ec == asio::error::try_again)
892
962
  return false;
893
963
 
894
- // Operation is complete.
964
+ // Operation failed.
965
+ bytes_transferred = 0;
966
+ return true;
967
+ }
968
+ }
969
+
970
+ bool non_blocking_recv1(socket_type s,
971
+ void* data, size_t size, int flags, bool is_stream,
972
+ asio::error_code& ec, size_t& bytes_transferred)
973
+ {
974
+ for (;;)
975
+ {
976
+ // Read some data.
977
+ signed_size_type bytes = socket_ops::recv1(s, data, size, flags, ec);
978
+
979
+ // Check for end of stream.
980
+ if (is_stream && bytes == 0)
981
+ {
982
+ ec = asio::error::eof;
983
+ return true;
984
+ }
985
+
986
+ // Check if operation succeeded.
895
987
  if (bytes >= 0)
896
988
  {
897
- ec = asio::error_code();
898
989
  bytes_transferred = bytes;
990
+ return true;
899
991
  }
900
- else
901
- bytes_transferred = 0;
902
992
 
993
+ // Retry operation if interrupted by signal.
994
+ if (ec == asio::error::interrupted)
995
+ continue;
996
+
997
+ // Check if we need to run the operation again.
998
+ if (ec == asio::error::would_block
999
+ || ec == asio::error::try_again)
1000
+ return false;
1001
+
1002
+ // Operation failed.
1003
+ bytes_transferred = 0;
903
1004
  return true;
904
1005
  }
905
1006
  }
@@ -910,15 +1011,15 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count,
910
1011
  int flags, socket_addr_type* addr, std::size_t* addrlen,
911
1012
  asio::error_code& ec)
912
1013
  {
913
- clear_last_error();
914
1014
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
915
1015
  // Receive some data.
916
1016
  DWORD recv_buf_count = static_cast<DWORD>(count);
917
1017
  DWORD bytes_transferred = 0;
918
1018
  DWORD recv_flags = flags;
919
1019
  int tmp_addrlen = (int)*addrlen;
920
- int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count,
921
- &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0), ec);
1020
+ int result = ::WSARecvFrom(s, bufs, recv_buf_count,
1021
+ &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0);
1022
+ get_last_error(ec, true);
922
1023
  *addrlen = (std::size_t)tmp_addrlen;
923
1024
  if (ec.value() == ERROR_NETNAME_DELETED)
924
1025
  ec = asio::error::connection_reset;
@@ -928,7 +1029,7 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count,
928
1029
  result = 0;
929
1030
  if (result != 0)
930
1031
  return socket_error_retval;
931
- ec = asio::error_code();
1032
+ ec.assign(0, ec.category());
932
1033
  return bytes_transferred;
933
1034
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
934
1035
  msghdr msg = msghdr();
@@ -936,10 +1037,56 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count,
936
1037
  msg.msg_namelen = static_cast<int>(*addrlen);
937
1038
  msg.msg_iov = bufs;
938
1039
  msg.msg_iovlen = static_cast<int>(count);
939
- signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec);
1040
+ signed_size_type result = ::recvmsg(s, &msg, flags);
1041
+ get_last_error(ec, result < 0);
940
1042
  *addrlen = msg.msg_namelen;
941
- if (result >= 0)
942
- ec = asio::error_code();
1043
+ return result;
1044
+ #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1045
+ }
1046
+
1047
+ template <typename SockLenType>
1048
+ inline signed_size_type call_recvfrom(SockLenType msghdr::*,
1049
+ socket_type s, void* data, size_t size, int flags,
1050
+ socket_addr_type* addr, std::size_t* addrlen)
1051
+ {
1052
+ SockLenType tmp_addrlen = addrlen ? (SockLenType)*addrlen : 0;
1053
+ signed_size_type result = ::recvfrom(s, static_cast<char*>(data),
1054
+ size, flags, addr, addrlen ? &tmp_addrlen : 0);
1055
+ if (addrlen)
1056
+ *addrlen = (std::size_t)tmp_addrlen;
1057
+ return result;
1058
+ }
1059
+
1060
+ signed_size_type recvfrom1(socket_type s, void* data, size_t size,
1061
+ int flags, socket_addr_type* addr, std::size_t* addrlen,
1062
+ asio::error_code& ec)
1063
+ {
1064
+ #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1065
+ // Receive some data.
1066
+ WSABUF buf;
1067
+ buf.buf = static_cast<char*>(data);
1068
+ buf.len = static_cast<ULONG>(size);
1069
+ DWORD bytes_transferred = 0;
1070
+ DWORD recv_flags = flags;
1071
+ int tmp_addrlen = (int)*addrlen;
1072
+ int result = ::WSARecvFrom(s, &buf, 1, &bytes_transferred,
1073
+ &recv_flags, addr, &tmp_addrlen, 0, 0);
1074
+ get_last_error(ec, true);
1075
+ *addrlen = (std::size_t)tmp_addrlen;
1076
+ if (ec.value() == ERROR_NETNAME_DELETED)
1077
+ ec = asio::error::connection_reset;
1078
+ else if (ec.value() == ERROR_PORT_UNREACHABLE)
1079
+ ec = asio::error::connection_refused;
1080
+ else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA)
1081
+ result = 0;
1082
+ if (result != 0)
1083
+ return socket_error_retval;
1084
+ ec.assign(0, ec.category());
1085
+ return bytes_transferred;
1086
+ #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1087
+ signed_size_type result = call_recvfrom(&msghdr::msg_namelen,
1088
+ s, data, size, flags, addr, addrlen);
1089
+ get_last_error(ec, result < 0);
943
1090
  return result;
944
1091
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
945
1092
  }
@@ -977,6 +1124,39 @@ size_t sync_recvfrom(socket_type s, state_type state, buf* bufs,
977
1124
  }
978
1125
  }
979
1126
 
1127
+ size_t sync_recvfrom1(socket_type s, state_type state, void* data,
1128
+ size_t size, int flags, socket_addr_type* addr,
1129
+ std::size_t* addrlen, asio::error_code& ec)
1130
+ {
1131
+ if (s == invalid_socket)
1132
+ {
1133
+ ec = asio::error::bad_descriptor;
1134
+ return 0;
1135
+ }
1136
+
1137
+ // Read some data.
1138
+ for (;;)
1139
+ {
1140
+ // Try to complete the operation without blocking.
1141
+ signed_size_type bytes = socket_ops::recvfrom1(
1142
+ s, data, size, flags, addr, addrlen, ec);
1143
+
1144
+ // Check if operation succeeded.
1145
+ if (bytes >= 0)
1146
+ return bytes;
1147
+
1148
+ // Operation failed.
1149
+ if ((state & user_set_non_blocking)
1150
+ || (ec != asio::error::would_block
1151
+ && ec != asio::error::try_again))
1152
+ return 0;
1153
+
1154
+ // Wait for socket to become ready.
1155
+ if (socket_ops::poll_read(s, 0, -1, ec) < 0)
1156
+ return 0;
1157
+ }
1158
+ }
1159
+
980
1160
  #if defined(ASIO_HAS_IOCP)
981
1161
 
982
1162
  void complete_iocp_recvfrom(
@@ -1014,6 +1194,13 @@ bool non_blocking_recvfrom(socket_type s,
1014
1194
  signed_size_type bytes = socket_ops::recvfrom(
1015
1195
  s, bufs, count, flags, addr, addrlen, ec);
1016
1196
 
1197
+ // Check if operation succeeded.
1198
+ if (bytes >= 0)
1199
+ {
1200
+ bytes_transferred = bytes;
1201
+ return true;
1202
+ }
1203
+
1017
1204
  // Retry operation if interrupted by signal.
1018
1205
  if (ec == asio::error::interrupted)
1019
1206
  continue;
@@ -1023,15 +1210,41 @@ bool non_blocking_recvfrom(socket_type s,
1023
1210
  || ec == asio::error::try_again)
1024
1211
  return false;
1025
1212
 
1026
- // Operation is complete.
1213
+ // Operation failed.
1214
+ bytes_transferred = 0;
1215
+ return true;
1216
+ }
1217
+ }
1218
+
1219
+ bool non_blocking_recvfrom1(socket_type s,
1220
+ void* data, size_t size, int flags,
1221
+ socket_addr_type* addr, std::size_t* addrlen,
1222
+ asio::error_code& ec, size_t& bytes_transferred)
1223
+ {
1224
+ for (;;)
1225
+ {
1226
+ // Read some data.
1227
+ signed_size_type bytes = socket_ops::recvfrom1(
1228
+ s, data, size, flags, addr, addrlen, ec);
1229
+
1230
+ // Check if operation succeeded.
1027
1231
  if (bytes >= 0)
1028
1232
  {
1029
- ec = asio::error_code();
1030
1233
  bytes_transferred = bytes;
1234
+ return true;
1031
1235
  }
1032
- else
1033
- bytes_transferred = 0;
1034
1236
 
1237
+ // Retry operation if interrupted by signal.
1238
+ if (ec == asio::error::interrupted)
1239
+ continue;
1240
+
1241
+ // Check if we need to run the operation again.
1242
+ if (ec == asio::error::would_block
1243
+ || ec == asio::error::try_again)
1244
+ return false;
1245
+
1246
+ // Operation failed.
1247
+ bytes_transferred = 0;
1035
1248
  return true;
1036
1249
  }
1037
1250
  }
@@ -1041,7 +1254,6 @@ bool non_blocking_recvfrom(socket_type s,
1041
1254
  signed_size_type recvmsg(socket_type s, buf* bufs, size_t count,
1042
1255
  int in_flags, int& out_flags, asio::error_code& ec)
1043
1256
  {
1044
- clear_last_error();
1045
1257
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1046
1258
  out_flags = 0;
1047
1259
  return socket_ops::recv(s, bufs, count, in_flags, ec);
@@ -1049,12 +1261,10 @@ signed_size_type recvmsg(socket_type s, buf* bufs, size_t count,
1049
1261
  msghdr msg = msghdr();
1050
1262
  msg.msg_iov = bufs;
1051
1263
  msg.msg_iovlen = static_cast<int>(count);
1052
- signed_size_type result = error_wrapper(::recvmsg(s, &msg, in_flags), ec);
1264
+ signed_size_type result = ::recvmsg(s, &msg, in_flags);
1265
+ get_last_error(ec, result < 0);
1053
1266
  if (result >= 0)
1054
- {
1055
- ec = asio::error_code();
1056
1267
  out_flags = msg.msg_flags;
1057
- }
1058
1268
  else
1059
1269
  out_flags = 0;
1060
1270
  return result;
@@ -1130,6 +1340,13 @@ bool non_blocking_recvmsg(socket_type s,
1130
1340
  signed_size_type bytes = socket_ops::recvmsg(
1131
1341
  s, bufs, count, in_flags, out_flags, ec);
1132
1342
 
1343
+ // Check if operation succeeded.
1344
+ if (bytes >= 0)
1345
+ {
1346
+ bytes_transferred = bytes;
1347
+ return true;
1348
+ }
1349
+
1133
1350
  // Retry operation if interrupted by signal.
1134
1351
  if (ec == asio::error::interrupted)
1135
1352
  continue;
@@ -1139,15 +1356,8 @@ bool non_blocking_recvmsg(socket_type s,
1139
1356
  || ec == asio::error::try_again)
1140
1357
  return false;
1141
1358
 
1142
- // Operation is complete.
1143
- if (bytes >= 0)
1144
- {
1145
- ec = asio::error_code();
1146
- bytes_transferred = bytes;
1147
- }
1148
- else
1149
- bytes_transferred = 0;
1150
-
1359
+ // Operation failed.
1360
+ bytes_transferred = 0;
1151
1361
  return true;
1152
1362
  }
1153
1363
  }
@@ -1157,21 +1367,21 @@ bool non_blocking_recvmsg(socket_type s,
1157
1367
  signed_size_type send(socket_type s, const buf* bufs, size_t count,
1158
1368
  int flags, asio::error_code& ec)
1159
1369
  {
1160
- clear_last_error();
1161
1370
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1162
1371
  // Send the data.
1163
1372
  DWORD send_buf_count = static_cast<DWORD>(count);
1164
1373
  DWORD bytes_transferred = 0;
1165
1374
  DWORD send_flags = flags;
1166
- int result = error_wrapper(::WSASend(s, const_cast<buf*>(bufs),
1167
- send_buf_count, &bytes_transferred, send_flags, 0, 0), ec);
1375
+ int result = ::WSASend(s, const_cast<buf*>(bufs),
1376
+ send_buf_count, &bytes_transferred, send_flags, 0, 0);
1377
+ get_last_error(ec, true);
1168
1378
  if (ec.value() == ERROR_NETNAME_DELETED)
1169
1379
  ec = asio::error::connection_reset;
1170
1380
  else if (ec.value() == ERROR_PORT_UNREACHABLE)
1171
1381
  ec = asio::error::connection_refused;
1172
1382
  if (result != 0)
1173
1383
  return socket_error_retval;
1174
- ec = asio::error_code();
1384
+ ec.assign(0, ec.category());
1175
1385
  return bytes_transferred;
1176
1386
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1177
1387
  msghdr msg = msghdr();
@@ -1180,9 +1390,40 @@ signed_size_type send(socket_type s, const buf* bufs, size_t count,
1180
1390
  #if defined(__linux__)
1181
1391
  flags |= MSG_NOSIGNAL;
1182
1392
  #endif // defined(__linux__)
1183
- signed_size_type result = error_wrapper(::sendmsg(s, &msg, flags), ec);
1184
- if (result >= 0)
1185
- ec = asio::error_code();
1393
+ signed_size_type result = ::sendmsg(s, &msg, flags);
1394
+ get_last_error(ec, result < 0);
1395
+ return result;
1396
+ #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1397
+ }
1398
+
1399
+ signed_size_type send1(socket_type s, const void* data, size_t size,
1400
+ int flags, asio::error_code& ec)
1401
+ {
1402
+ #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1403
+ // Send the data.
1404
+ WSABUF buf;
1405
+ buf.buf = const_cast<char*>(static_cast<const char*>(data));
1406
+ buf.len = static_cast<ULONG>(size);
1407
+ DWORD bytes_transferred = 0;
1408
+ DWORD send_flags = flags;
1409
+ int result = ::WSASend(s, &buf, 1,
1410
+ &bytes_transferred, send_flags, 0, 0);
1411
+ get_last_error(ec, true);
1412
+ if (ec.value() == ERROR_NETNAME_DELETED)
1413
+ ec = asio::error::connection_reset;
1414
+ else if (ec.value() == ERROR_PORT_UNREACHABLE)
1415
+ ec = asio::error::connection_refused;
1416
+ if (result != 0)
1417
+ return socket_error_retval;
1418
+ ec.assign(0, ec.category());
1419
+ return bytes_transferred;
1420
+ #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1421
+ #if defined(__linux__)
1422
+ flags |= MSG_NOSIGNAL;
1423
+ #endif // defined(__linux__)
1424
+ signed_size_type result = ::send(s,
1425
+ static_cast<const char*>(data), size, flags);
1426
+ get_last_error(ec, result < 0);
1186
1427
  return result;
1187
1428
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1188
1429
  }
@@ -1199,7 +1440,7 @@ size_t sync_send(socket_type s, state_type state, const buf* bufs,
1199
1440
  // A request to write 0 bytes to a stream is a no-op.
1200
1441
  if (all_empty && (state & stream_oriented))
1201
1442
  {
1202
- ec = asio::error_code();
1443
+ ec.assign(0, ec.category());
1203
1444
  return 0;
1204
1445
  }
1205
1446
 
@@ -1225,6 +1466,44 @@ size_t sync_send(socket_type s, state_type state, const buf* bufs,
1225
1466
  }
1226
1467
  }
1227
1468
 
1469
+ size_t sync_send1(socket_type s, state_type state, const void* data,
1470
+ size_t size, int flags, asio::error_code& ec)
1471
+ {
1472
+ if (s == invalid_socket)
1473
+ {
1474
+ ec = asio::error::bad_descriptor;
1475
+ return 0;
1476
+ }
1477
+
1478
+ // A request to write 0 bytes to a stream is a no-op.
1479
+ if (size == 0 && (state & stream_oriented))
1480
+ {
1481
+ ec.assign(0, ec.category());
1482
+ return 0;
1483
+ }
1484
+
1485
+ // Read some data.
1486
+ for (;;)
1487
+ {
1488
+ // Try to complete the operation without blocking.
1489
+ signed_size_type bytes = socket_ops::send1(s, data, size, flags, ec);
1490
+
1491
+ // Check if operation succeeded.
1492
+ if (bytes >= 0)
1493
+ return bytes;
1494
+
1495
+ // Operation failed.
1496
+ if ((state & user_set_non_blocking)
1497
+ || (ec != asio::error::would_block
1498
+ && ec != asio::error::try_again))
1499
+ return 0;
1500
+
1501
+ // Wait for socket to become ready.
1502
+ if (socket_ops::poll_write(s, 0, -1, ec) < 0)
1503
+ return 0;
1504
+ }
1505
+ }
1506
+
1228
1507
  #if defined(ASIO_HAS_IOCP)
1229
1508
 
1230
1509
  void complete_iocp_send(
@@ -1256,6 +1535,13 @@ bool non_blocking_send(socket_type s,
1256
1535
  // Write some data.
1257
1536
  signed_size_type bytes = socket_ops::send(s, bufs, count, flags, ec);
1258
1537
 
1538
+ // Check if operation succeeded.
1539
+ if (bytes >= 0)
1540
+ {
1541
+ bytes_transferred = bytes;
1542
+ return true;
1543
+ }
1544
+
1259
1545
  // Retry operation if interrupted by signal.
1260
1546
  if (ec == asio::error::interrupted)
1261
1547
  continue;
@@ -1265,15 +1551,39 @@ bool non_blocking_send(socket_type s,
1265
1551
  || ec == asio::error::try_again)
1266
1552
  return false;
1267
1553
 
1268
- // Operation is complete.
1554
+ // Operation failed.
1555
+ bytes_transferred = 0;
1556
+ return true;
1557
+ }
1558
+ }
1559
+
1560
+ bool non_blocking_send1(socket_type s,
1561
+ const void* data, size_t size, int flags,
1562
+ asio::error_code& ec, size_t& bytes_transferred)
1563
+ {
1564
+ for (;;)
1565
+ {
1566
+ // Write some data.
1567
+ signed_size_type bytes = socket_ops::send1(s, data, size, flags, ec);
1568
+
1569
+ // Check if operation succeeded.
1269
1570
  if (bytes >= 0)
1270
1571
  {
1271
- ec = asio::error_code();
1272
1572
  bytes_transferred = bytes;
1573
+ return true;
1273
1574
  }
1274
- else
1275
- bytes_transferred = 0;
1276
1575
 
1576
+ // Retry operation if interrupted by signal.
1577
+ if (ec == asio::error::interrupted)
1578
+ continue;
1579
+
1580
+ // Check if we need to run the operation again.
1581
+ if (ec == asio::error::would_block
1582
+ || ec == asio::error::try_again)
1583
+ return false;
1584
+
1585
+ // Operation failed.
1586
+ bytes_transferred = 0;
1277
1587
  return true;
1278
1588
  }
1279
1589
  }
@@ -1284,21 +1594,21 @@ signed_size_type sendto(socket_type s, const buf* bufs, size_t count,
1284
1594
  int flags, const socket_addr_type* addr, std::size_t addrlen,
1285
1595
  asio::error_code& ec)
1286
1596
  {
1287
- clear_last_error();
1288
1597
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1289
1598
  // Send the data.
1290
1599
  DWORD send_buf_count = static_cast<DWORD>(count);
1291
1600
  DWORD bytes_transferred = 0;
1292
- int result = error_wrapper(::WSASendTo(s, const_cast<buf*>(bufs),
1601
+ int result = ::WSASendTo(s, const_cast<buf*>(bufs),
1293
1602
  send_buf_count, &bytes_transferred, flags, addr,
1294
- static_cast<int>(addrlen), 0, 0), ec);
1603
+ static_cast<int>(addrlen), 0, 0);
1604
+ get_last_error(ec, true);
1295
1605
  if (ec.value() == ERROR_NETNAME_DELETED)
1296
1606
  ec = asio::error::connection_reset;
1297
1607
  else if (ec.value() == ERROR_PORT_UNREACHABLE)
1298
1608
  ec = asio::error::connection_refused;
1299
1609
  if (result != 0)
1300
1610
  return socket_error_retval;
1301
- ec = asio::error_code();
1611
+ ec.assign(0, ec.category());
1302
1612
  return bytes_transferred;
1303
1613
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1304
1614
  msghdr msg = msghdr();
@@ -1309,9 +1619,49 @@ signed_size_type sendto(socket_type s, const buf* bufs, size_t count,
1309
1619
  #if defined(__linux__)
1310
1620
  flags |= MSG_NOSIGNAL;
1311
1621
  #endif // defined(__linux__)
1312
- signed_size_type result = error_wrapper(::sendmsg(s, &msg, flags), ec);
1313
- if (result >= 0)
1314
- ec = asio::error_code();
1622
+ signed_size_type result = ::sendmsg(s, &msg, flags);
1623
+ get_last_error(ec, result < 0);
1624
+ return result;
1625
+ #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1626
+ }
1627
+
1628
+ template <typename SockLenType>
1629
+ inline signed_size_type call_sendto(SockLenType msghdr::*,
1630
+ socket_type s, const void* data, size_t size, int flags,
1631
+ const socket_addr_type* addr, std::size_t addrlen)
1632
+ {
1633
+ return ::sendto(s, static_cast<char*>(const_cast<void*>(data)),
1634
+ size, flags, addr, (SockLenType)addrlen);
1635
+ }
1636
+
1637
+ signed_size_type sendto1(socket_type s, const void* data, size_t size,
1638
+ int flags, const socket_addr_type* addr, std::size_t addrlen,
1639
+ asio::error_code& ec)
1640
+ {
1641
+ #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1642
+ // Send the data.
1643
+ WSABUF buf;
1644
+ buf.buf = const_cast<char*>(static_cast<const char*>(data));
1645
+ buf.len = static_cast<ULONG>(size);
1646
+ DWORD bytes_transferred = 0;
1647
+ int result = ::WSASendTo(s, &buf, 1, &bytes_transferred,
1648
+ flags, addr, static_cast<int>(addrlen), 0, 0);
1649
+ get_last_error(ec, true);
1650
+ if (ec.value() == ERROR_NETNAME_DELETED)
1651
+ ec = asio::error::connection_reset;
1652
+ else if (ec.value() == ERROR_PORT_UNREACHABLE)
1653
+ ec = asio::error::connection_refused;
1654
+ if (result != 0)
1655
+ return socket_error_retval;
1656
+ ec.assign(0, ec.category());
1657
+ return bytes_transferred;
1658
+ #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1659
+ #if defined(__linux__)
1660
+ flags |= MSG_NOSIGNAL;
1661
+ #endif // defined(__linux__)
1662
+ signed_size_type result = call_sendto(&msghdr::msg_namelen,
1663
+ s, data, size, flags, addr, addrlen);
1664
+ get_last_error(ec, result < 0);
1315
1665
  return result;
1316
1666
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1317
1667
  }
@@ -1349,6 +1699,39 @@ size_t sync_sendto(socket_type s, state_type state, const buf* bufs,
1349
1699
  }
1350
1700
  }
1351
1701
 
1702
+ size_t sync_sendto1(socket_type s, state_type state, const void* data,
1703
+ size_t size, int flags, const socket_addr_type* addr,
1704
+ std::size_t addrlen, asio::error_code& ec)
1705
+ {
1706
+ if (s == invalid_socket)
1707
+ {
1708
+ ec = asio::error::bad_descriptor;
1709
+ return 0;
1710
+ }
1711
+
1712
+ // Write some data.
1713
+ for (;;)
1714
+ {
1715
+ // Try to complete the operation without blocking.
1716
+ signed_size_type bytes = socket_ops::sendto1(
1717
+ s, data, size, flags, addr, addrlen, ec);
1718
+
1719
+ // Check if operation succeeded.
1720
+ if (bytes >= 0)
1721
+ return bytes;
1722
+
1723
+ // Operation failed.
1724
+ if ((state & user_set_non_blocking)
1725
+ || (ec != asio::error::would_block
1726
+ && ec != asio::error::try_again))
1727
+ return 0;
1728
+
1729
+ // Wait for socket to become ready.
1730
+ if (socket_ops::poll_write(s, 0, -1, ec) < 0)
1731
+ return 0;
1732
+ }
1733
+ }
1734
+
1352
1735
  #if !defined(ASIO_HAS_IOCP)
1353
1736
 
1354
1737
  bool non_blocking_sendto(socket_type s,
@@ -1362,6 +1745,13 @@ bool non_blocking_sendto(socket_type s,
1362
1745
  signed_size_type bytes = socket_ops::sendto(
1363
1746
  s, bufs, count, flags, addr, addrlen, ec);
1364
1747
 
1748
+ // Check if operation succeeded.
1749
+ if (bytes >= 0)
1750
+ {
1751
+ bytes_transferred = bytes;
1752
+ return true;
1753
+ }
1754
+
1365
1755
  // Retry operation if interrupted by signal.
1366
1756
  if (ec == asio::error::interrupted)
1367
1757
  continue;
@@ -1371,15 +1761,41 @@ bool non_blocking_sendto(socket_type s,
1371
1761
  || ec == asio::error::try_again)
1372
1762
  return false;
1373
1763
 
1374
- // Operation is complete.
1764
+ // Operation failed.
1765
+ bytes_transferred = 0;
1766
+ return true;
1767
+ }
1768
+ }
1769
+
1770
+ bool non_blocking_sendto1(socket_type s,
1771
+ const void* data, size_t size, int flags,
1772
+ const socket_addr_type* addr, std::size_t addrlen,
1773
+ asio::error_code& ec, size_t& bytes_transferred)
1774
+ {
1775
+ for (;;)
1776
+ {
1777
+ // Write some data.
1778
+ signed_size_type bytes = socket_ops::sendto1(
1779
+ s, data, size, flags, addr, addrlen, ec);
1780
+
1781
+ // Check if operation succeeded.
1375
1782
  if (bytes >= 0)
1376
1783
  {
1377
- ec = asio::error_code();
1378
1784
  bytes_transferred = bytes;
1785
+ return true;
1379
1786
  }
1380
- else
1381
- bytes_transferred = 0;
1382
1787
 
1788
+ // Retry operation if interrupted by signal.
1789
+ if (ec == asio::error::interrupted)
1790
+ continue;
1791
+
1792
+ // Check if we need to run the operation again.
1793
+ if (ec == asio::error::would_block
1794
+ || ec == asio::error::try_again)
1795
+ return false;
1796
+
1797
+ // Operation failed.
1798
+ bytes_transferred = 0;
1383
1799
  return true;
1384
1800
  }
1385
1801
  }
@@ -1389,10 +1805,9 @@ bool non_blocking_sendto(socket_type s,
1389
1805
  socket_type socket(int af, int type, int protocol,
1390
1806
  asio::error_code& ec)
1391
1807
  {
1392
- clear_last_error();
1393
1808
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1394
- socket_type s = error_wrapper(::WSASocketW(af, type, protocol, 0, 0,
1395
- WSA_FLAG_OVERLAPPED), ec);
1809
+ socket_type s = ::WSASocketW(af, type, protocol, 0, 0, WSA_FLAG_OVERLAPPED);
1810
+ get_last_error(ec, s == invalid_socket);
1396
1811
  if (s == invalid_socket)
1397
1812
  return s;
1398
1813
 
@@ -1406,17 +1821,15 @@ socket_type socket(int af, int type, int protocol,
1406
1821
  reinterpret_cast<const char*>(&optval), sizeof(optval));
1407
1822
  }
1408
1823
 
1409
- ec = asio::error_code();
1410
-
1411
1824
  return s;
1412
1825
  #elif defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
1413
- socket_type s = error_wrapper(::socket(af, type, protocol), ec);
1414
- if (s == invalid_socket)
1415
- return s;
1826
+ socket_type s = ::socket(af, type, protocol);
1827
+ get_last_error(ec, s < 0);
1416
1828
 
1417
1829
  int optval = 1;
1418
- int result = error_wrapper(::setsockopt(s,
1419
- SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec);
1830
+ int result = ::setsockopt(s, SOL_SOCKET,
1831
+ SO_NOSIGPIPE, &optval, sizeof(optval));
1832
+ get_last_error(ec, result != 0);
1420
1833
  if (result != 0)
1421
1834
  {
1422
1835
  ::close(s);
@@ -1425,9 +1838,8 @@ socket_type socket(int af, int type, int protocol,
1425
1838
 
1426
1839
  return s;
1427
1840
  #else
1428
- int s = error_wrapper(::socket(af, type, protocol), ec);
1429
- if (s >= 0)
1430
- ec = asio::error_code();
1841
+ int s = ::socket(af, type, protocol);
1842
+ get_last_error(ec, s < 0);
1431
1843
  return s;
1432
1844
  #endif
1433
1845
  }
@@ -1469,7 +1881,7 @@ int setsockopt(socket_type s, state_type& state, int level, int optname,
1469
1881
  state |= enable_connection_aborted;
1470
1882
  else
1471
1883
  state &= ~enable_connection_aborted;
1472
- ec = asio::error_code();
1884
+ ec.assign(0, ec.category());
1473
1885
  return 0;
1474
1886
  }
1475
1887
 
@@ -1485,22 +1897,21 @@ int setsockopt(socket_type s, state_type& state, int level, int optname,
1485
1897
  typedef int (WSAAPI *sso_t)(SOCKET, int, int, const char*, int);
1486
1898
  if (sso_t sso = (sso_t)::GetProcAddress(winsock_module, "setsockopt"))
1487
1899
  {
1488
- clear_last_error();
1489
- return error_wrapper(sso(s, level, optname,
1900
+ int result = sso(s, level, optname,
1490
1901
  reinterpret_cast<const char*>(optval),
1491
- static_cast<int>(optlen)), ec);
1902
+ static_cast<int>(optlen));
1903
+ get_last_error(ec, result != 0);
1904
+ return result;
1492
1905
  }
1493
1906
  }
1494
1907
  ec = asio::error::fault;
1495
1908
  return socket_error_retval;
1496
1909
  #else // defined(__BORLANDC__)
1497
- clear_last_error();
1498
- int result = error_wrapper(call_setsockopt(&msghdr::msg_namelen,
1499
- s, level, optname, optval, optlen), ec);
1910
+ int result = call_setsockopt(&msghdr::msg_namelen,
1911
+ s, level, optname, optval, optlen);
1912
+ get_last_error(ec, result != 0);
1500
1913
  if (result == 0)
1501
1914
  {
1502
- ec = asio::error_code();
1503
-
1504
1915
  #if defined(__MACH__) && defined(__APPLE__) \
1505
1916
  || defined(__NetBSD__) || defined(__FreeBSD__) \
1506
1917
  || defined(__OpenBSD__) || defined(__QNX__)
@@ -1555,7 +1966,7 @@ int getsockopt(socket_type s, state_type state, int level, int optname,
1555
1966
  }
1556
1967
 
1557
1968
  *static_cast<int*>(optval) = (state & enable_connection_aborted) ? 1 : 0;
1558
- ec = asio::error_code();
1969
+ ec.assign(0, ec.category());
1559
1970
  return 0;
1560
1971
  }
1561
1972
 
@@ -1568,10 +1979,10 @@ int getsockopt(socket_type s, state_type state, int level, int optname,
1568
1979
  typedef int (WSAAPI *gso_t)(SOCKET, int, int, char*, int*);
1569
1980
  if (gso_t gso = (gso_t)::GetProcAddress(winsock_module, "getsockopt"))
1570
1981
  {
1571
- clear_last_error();
1572
1982
  int tmp_optlen = static_cast<int>(*optlen);
1573
- int result = error_wrapper(gso(s, level, optname,
1574
- reinterpret_cast<char*>(optval), &tmp_optlen), ec);
1983
+ int result = gso(s, level, optname,
1984
+ reinterpret_cast<char*>(optval), &tmp_optlen);
1985
+ get_last_error(ec, result != 0);
1575
1986
  *optlen = static_cast<size_t>(tmp_optlen);
1576
1987
  if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY
1577
1988
  && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD))
@@ -1582,7 +1993,7 @@ int getsockopt(socket_type s, state_type state, int level, int optname,
1582
1993
  // value is non-zero (i.e. true). This corresponds to the behavior of
1583
1994
  // IPv6 sockets on Windows platforms pre-Vista.
1584
1995
  *static_cast<DWORD*>(optval) = 1;
1585
- ec = asio::error_code();
1996
+ ec.assign(0, ec.category());
1586
1997
  }
1587
1998
  return result;
1588
1999
  }
@@ -1590,9 +2001,9 @@ int getsockopt(socket_type s, state_type state, int level, int optname,
1590
2001
  ec = asio::error::fault;
1591
2002
  return socket_error_retval;
1592
2003
  #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1593
- clear_last_error();
1594
- int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen,
1595
- s, level, optname, optval, optlen), ec);
2004
+ int result = call_getsockopt(&msghdr::msg_namelen,
2005
+ s, level, optname, optval, optlen);
2006
+ get_last_error(ec, result != 0);
1596
2007
  if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY
1597
2008
  && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD))
1598
2009
  {
@@ -1602,15 +2013,13 @@ int getsockopt(socket_type s, state_type state, int level, int optname,
1602
2013
  // non-zero (i.e. true). This corresponds to the behavior of IPv6 sockets
1603
2014
  // on Windows platforms pre-Vista.
1604
2015
  *static_cast<DWORD*>(optval) = 1;
1605
- ec = asio::error_code();
2016
+ ec.assign(0, ec.category());
1606
2017
  }
1607
- if (result == 0)
1608
- ec = asio::error_code();
1609
2018
  return result;
1610
2019
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1611
- clear_last_error();
1612
- int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen,
1613
- s, level, optname, optval, optlen), ec);
2020
+ int result = call_getsockopt(&msghdr::msg_namelen,
2021
+ s, level, optname, optval, optlen);
2022
+ get_last_error(ec, result != 0);
1614
2023
  #if defined(__linux__)
1615
2024
  if (result == 0 && level == SOL_SOCKET && *optlen == sizeof(int)
1616
2025
  && (optname == SO_SNDBUF || optname == SO_RCVBUF))
@@ -1623,8 +2032,6 @@ int getsockopt(socket_type s, state_type state, int level, int optname,
1623
2032
  *static_cast<int*>(optval) /= 2;
1624
2033
  }
1625
2034
  #endif // defined(__linux__)
1626
- if (result == 0)
1627
- ec = asio::error_code();
1628
2035
  return result;
1629
2036
  #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1630
2037
  }
@@ -1667,7 +2074,7 @@ int getpeername(socket_type s, socket_addr_type* addr,
1667
2074
  }
1668
2075
 
1669
2076
  // The cached value is still valid.
1670
- ec = asio::error_code();
2077
+ ec.assign(0, ec.category());
1671
2078
  return 0;
1672
2079
  }
1673
2080
  #else // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP)
@@ -1676,11 +2083,8 @@ int getpeername(socket_type s, socket_addr_type* addr,
1676
2083
  #endif // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP)
1677
2084
  // || defined(__CYGWIN__)
1678
2085
 
1679
- clear_last_error();
1680
- int result = error_wrapper(call_getpeername(
1681
- &msghdr::msg_namelen, s, addr, addrlen), ec);
1682
- if (result == 0)
1683
- ec = asio::error_code();
2086
+ int result = call_getpeername(&msghdr::msg_namelen, s, addr, addrlen);
2087
+ get_last_error(ec, result != 0);
1684
2088
  return result;
1685
2089
  }
1686
2090
 
@@ -1703,11 +2107,8 @@ int getsockname(socket_type s, socket_addr_type* addr,
1703
2107
  return socket_error_retval;
1704
2108
  }
1705
2109
 
1706
- clear_last_error();
1707
- int result = error_wrapper(call_getsockname(
1708
- &msghdr::msg_namelen, s, addr, addrlen), ec);
1709
- if (result == 0)
1710
- ec = asio::error_code();
2110
+ int result = call_getsockname(&msghdr::msg_namelen, s, addr, addrlen);
2111
+ get_last_error(ec, result != 0);
1711
2112
  return result;
1712
2113
  }
1713
2114
 
@@ -1720,20 +2121,17 @@ int ioctl(socket_type s, state_type& state, int cmd,
1720
2121
  return socket_error_retval;
1721
2122
  }
1722
2123
 
1723
- clear_last_error();
1724
2124
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
1725
- int result = error_wrapper(::ioctlsocket(s, cmd, arg), ec);
2125
+ int result = ::ioctlsocket(s, cmd, arg);
1726
2126
  #elif defined(__MACH__) && defined(__APPLE__) \
1727
2127
  || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
1728
- int result = error_wrapper(::ioctl(s,
1729
- static_cast<unsigned int>(cmd), arg), ec);
2128
+ int result = ::ioctl(s, static_cast<unsigned int>(cmd), arg);
1730
2129
  #else
1731
- int result = error_wrapper(::ioctl(s, cmd, arg), ec);
2130
+ int result = ::ioctl(s, cmd, arg);
1732
2131
  #endif
2132
+ get_last_error(ec, result < 0);
1733
2133
  if (result >= 0)
1734
2134
  {
1735
- ec = asio::error_code();
1736
-
1737
2135
  // When updating the non-blocking mode we always perform the ioctl syscall,
1738
2136
  // even if the flags would otherwise indicate that the socket is already in
1739
2137
  // the correct state. This ensures that the underlying socket is put into
@@ -1761,7 +2159,6 @@ int ioctl(socket_type s, state_type& state, int cmd,
1761
2159
  int select(int nfds, fd_set* readfds, fd_set* writefds,
1762
2160
  fd_set* exceptfds, timeval* timeout, asio::error_code& ec)
1763
2161
  {
1764
- clear_last_error();
1765
2162
  #if defined(__EMSCRIPTEN__)
1766
2163
  exceptfds = 0;
1767
2164
  #endif // defined(__EMSCRIPTEN__)
@@ -1772,7 +2169,7 @@ int select(int nfds, fd_set* readfds, fd_set* writefds,
1772
2169
  if (milliseconds == 0)
1773
2170
  milliseconds = 1; // Force context switch.
1774
2171
  ::Sleep(milliseconds);
1775
- ec = asio::error_code();
2172
+ ec.assign(0, ec.category());
1776
2173
  return 0;
1777
2174
  }
1778
2175
 
@@ -1791,15 +2188,13 @@ int select(int nfds, fd_set* readfds, fd_set* writefds,
1791
2188
  timespec ts;
1792
2189
  ts.tv_sec = timeout ? timeout->tv_sec : 0;
1793
2190
  ts.tv_nsec = timeout ? timeout->tv_usec * 1000 : 0;
1794
- return error_wrapper(::pselect(nfds, readfds,
1795
- writefds, exceptfds, timeout ? &ts : 0, 0), ec);
2191
+ int result = ::pselect(nfds, readfds,
2192
+ writefds, exceptfds, timeout ? &ts : 0, 0);
1796
2193
  #else
1797
- int result = error_wrapper(::select(nfds, readfds,
1798
- writefds, exceptfds, timeout), ec);
1799
- if (result >= 0)
1800
- ec = asio::error_code();
1801
- return result;
2194
+ int result = ::select(nfds, readfds, writefds, exceptfds, timeout);
1802
2195
  #endif
2196
+ get_last_error(ec, result < 0);
2197
+ return result;
1803
2198
  }
1804
2199
 
1805
2200
  int poll_read(socket_type s, state_type state,
@@ -1833,8 +2228,8 @@ int poll_read(socket_type s, state_type state,
1833
2228
  }
1834
2229
  else
1835
2230
  timeout = 0;
1836
- clear_last_error();
1837
- int result = error_wrapper(::select(s + 1, &fds, 0, 0, timeout), ec);
2231
+ int result = ::select(s + 1, &fds, 0, 0, timeout);
2232
+ get_last_error(ec, result < 0);
1838
2233
  #else // defined(ASIO_WINDOWS)
1839
2234
  // || defined(__CYGWIN__)
1840
2235
  // || defined(__SYMBIAN32__)
@@ -1843,16 +2238,14 @@ int poll_read(socket_type s, state_type state,
1843
2238
  fds.events = POLLIN;
1844
2239
  fds.revents = 0;
1845
2240
  int timeout = (state & user_set_non_blocking) ? 0 : msec;
1846
- clear_last_error();
1847
- int result = error_wrapper(::poll(&fds, 1, timeout), ec);
2241
+ int result = ::poll(&fds, 1, timeout);
2242
+ get_last_error(ec, result < 0);
1848
2243
  #endif // defined(ASIO_WINDOWS)
1849
2244
  // || defined(__CYGWIN__)
1850
2245
  // || defined(__SYMBIAN32__)
1851
2246
  if (result == 0)
1852
- ec = (state & user_set_non_blocking)
1853
- ? asio::error::would_block : asio::error_code();
1854
- else if (result > 0)
1855
- ec = asio::error_code();
2247
+ if (state & user_set_non_blocking)
2248
+ ec = asio::error::would_block;
1856
2249
  return result;
1857
2250
  }
1858
2251
 
@@ -1887,8 +2280,8 @@ int poll_write(socket_type s, state_type state,
1887
2280
  }
1888
2281
  else
1889
2282
  timeout = 0;
1890
- clear_last_error();
1891
- int result = error_wrapper(::select(s + 1, 0, &fds, 0, timeout), ec);
2283
+ int result = ::select(s + 1, 0, &fds, 0, timeout);
2284
+ get_last_error(ec, result < 0);
1892
2285
  #else // defined(ASIO_WINDOWS)
1893
2286
  // || defined(__CYGWIN__)
1894
2287
  // || defined(__SYMBIAN32__)
@@ -1897,16 +2290,14 @@ int poll_write(socket_type s, state_type state,
1897
2290
  fds.events = POLLOUT;
1898
2291
  fds.revents = 0;
1899
2292
  int timeout = (state & user_set_non_blocking) ? 0 : msec;
1900
- clear_last_error();
1901
- int result = error_wrapper(::poll(&fds, 1, timeout), ec);
2293
+ int result = ::poll(&fds, 1, timeout);
2294
+ get_last_error(ec, result < 0);
1902
2295
  #endif // defined(ASIO_WINDOWS)
1903
2296
  // || defined(__CYGWIN__)
1904
2297
  // || defined(__SYMBIAN32__)
1905
2298
  if (result == 0)
1906
- ec = (state & user_set_non_blocking)
1907
- ? asio::error::would_block : asio::error_code();
1908
- else if (result > 0)
1909
- ec = asio::error_code();
2299
+ if (state & user_set_non_blocking)
2300
+ ec = asio::error::would_block;
1910
2301
  return result;
1911
2302
  }
1912
2303
 
@@ -1941,8 +2332,8 @@ int poll_error(socket_type s, state_type state,
1941
2332
  }
1942
2333
  else
1943
2334
  timeout = 0;
1944
- clear_last_error();
1945
- int result = error_wrapper(::select(s + 1, 0, 0, &fds, timeout), ec);
2335
+ int result = ::select(s + 1, 0, 0, &fds, timeout);
2336
+ get_last_error(ec, result < 0);
1946
2337
  #else // defined(ASIO_WINDOWS)
1947
2338
  // || defined(__CYGWIN__)
1948
2339
  // || defined(__SYMBIAN32__)
@@ -1951,16 +2342,14 @@ int poll_error(socket_type s, state_type state,
1951
2342
  fds.events = POLLPRI | POLLERR | POLLHUP;
1952
2343
  fds.revents = 0;
1953
2344
  int timeout = (state & user_set_non_blocking) ? 0 : msec;
1954
- clear_last_error();
1955
- int result = error_wrapper(::poll(&fds, 1, timeout), ec);
2345
+ int result = ::poll(&fds, 1, timeout);
2346
+ get_last_error(ec, result < 0);
1956
2347
  #endif // defined(ASIO_WINDOWS)
1957
2348
  // || defined(__CYGWIN__)
1958
2349
  // || defined(__SYMBIAN32__)
1959
2350
  if (result == 0)
1960
- ec = (state & user_set_non_blocking)
1961
- ? asio::error::would_block : asio::error_code();
1962
- else if (result > 0)
1963
- ec = asio::error_code();
2351
+ if (state & user_set_non_blocking)
2352
+ ec = asio::error::would_block;
1964
2353
  return result;
1965
2354
  }
1966
2355
 
@@ -1991,11 +2380,8 @@ int poll_connect(socket_type s, int msec, asio::error_code& ec)
1991
2380
  }
1992
2381
  else
1993
2382
  timeout = 0;
1994
- clear_last_error();
1995
- int result = error_wrapper(::select(
1996
- s + 1, 0, &write_fds, &except_fds, timeout), ec);
1997
- if (result >= 0)
1998
- ec = asio::error_code();
2383
+ int result = ::select(s + 1, 0, &write_fds, &except_fds, timeout);
2384
+ get_last_error(ec, result < 0);
1999
2385
  return result;
2000
2386
  #else // defined(ASIO_WINDOWS)
2001
2387
  // || defined(__CYGWIN__)
@@ -2004,10 +2390,8 @@ int poll_connect(socket_type s, int msec, asio::error_code& ec)
2004
2390
  fds.fd = s;
2005
2391
  fds.events = POLLOUT;
2006
2392
  fds.revents = 0;
2007
- clear_last_error();
2008
- int result = error_wrapper(::poll(&fds, 1, msec), ec);
2009
- if (result >= 0)
2010
- ec = asio::error_code();
2393
+ int result = ::poll(&fds, 1, msec);
2394
+ get_last_error(ec, result < 0);
2011
2395
  return result;
2012
2396
  #endif // defined(ASIO_WINDOWS)
2013
2397
  // || defined(__CYGWIN__)
@@ -2092,18 +2476,20 @@ const char* inet_ntop(int af, const void* src, char* dest, size_t length,
2092
2476
  DWORD string_length = static_cast<DWORD>(length);
2093
2477
  #if defined(BOOST_NO_ANSI_APIS) || (defined(_MSC_VER) && (_MSC_VER >= 1800))
2094
2478
  LPWSTR string_buffer = (LPWSTR)_alloca(length * sizeof(WCHAR));
2095
- int result = error_wrapper(::WSAAddressToStringW(&address.base,
2096
- address_length, 0, string_buffer, &string_length), ec);
2479
+ int result = ::WSAAddressToStringW(&address.base,
2480
+ address_length, 0, string_buffer, &string_length);
2481
+ get_last_error(ec, true);
2097
2482
  ::WideCharToMultiByte(CP_ACP, 0, string_buffer, -1,
2098
2483
  dest, static_cast<int>(length), 0, 0);
2099
2484
  #else
2100
- int result = error_wrapper(::WSAAddressToStringA(
2101
- &address.base, address_length, 0, dest, &string_length), ec);
2485
+ int result = ::WSAAddressToStringA(&address.base,
2486
+ address_length, 0, dest, &string_length);
2487
+ get_last_error(ec, true);
2102
2488
  #endif
2103
2489
 
2104
2490
  // Windows may set error code on success.
2105
2491
  if (result != socket_error_retval)
2106
- ec = asio::error_code();
2492
+ ec.assign(0, ec.category());
2107
2493
 
2108
2494
  // Windows may not set an error code on failure.
2109
2495
  else if (result == socket_error_retval && !ec)
@@ -2111,8 +2497,8 @@ const char* inet_ntop(int af, const void* src, char* dest, size_t length,
2111
2497
 
2112
2498
  return result == socket_error_retval ? 0 : dest;
2113
2499
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
2114
- const char* result = error_wrapper(::inet_ntop(
2115
- af, src, dest, static_cast<int>(length)), ec);
2500
+ const char* result = ::inet_ntop(af, src, dest, static_cast<int>(length));
2501
+ get_last_error(ec, true);
2116
2502
  if (result == 0 && !ec)
2117
2503
  ec = asio::error::invalid_argument;
2118
2504
  if (result != 0 && af == ASIO_OS_DEF(AF_INET6) && scope_id != 0)
@@ -2157,7 +2543,7 @@ int inet_pton(int af, const char* src, void* dest,
2157
2543
  bytes[1] = static_cast<unsigned char>(b1);
2158
2544
  bytes[2] = static_cast<unsigned char>(b2);
2159
2545
  bytes[3] = static_cast<unsigned char>(b3);
2160
- ec = asio::error_code();
2546
+ ec.assign(), ec.category());
2161
2547
  return 1;
2162
2548
  }
2163
2549
  else if (af == ASIO_OS_DEF(AF_INET6))
@@ -2273,7 +2659,7 @@ int inet_pton(int af, const char* src, void* dest,
2273
2659
  for (int i = 0; i < num_back_bytes; ++i)
2274
2660
  bytes[16 - num_back_bytes + i] = back_bytes[i];
2275
2661
 
2276
- ec = asio::error_code();
2662
+ ec.assign(0, ec.category());
2277
2663
  return 1;
2278
2664
  }
2279
2665
  else
@@ -2302,11 +2688,13 @@ int inet_pton(int af, const char* src, void* dest,
2302
2688
  int num_wide_chars = static_cast<int>(strlen(src)) + 1;
2303
2689
  LPWSTR wide_buffer = (LPWSTR)_alloca(num_wide_chars * sizeof(WCHAR));
2304
2690
  ::MultiByteToWideChar(CP_ACP, 0, src, -1, wide_buffer, num_wide_chars);
2305
- int result = error_wrapper(::WSAStringToAddressW(
2306
- wide_buffer, af, 0, &address.base, &address_length), ec);
2691
+ int result = ::WSAStringToAddressW(wide_buffer,
2692
+ af, 0, &address.base, &address_length);
2693
+ get_last_error(ec, true);
2307
2694
  #else
2308
- int result = error_wrapper(::WSAStringToAddressA(
2309
- const_cast<char*>(src), af, 0, &address.base, &address_length), ec);
2695
+ int result = ::WSAStringToAddressA(const_cast<char*>(src),
2696
+ af, 0, &address.base, &address_length);
2697
+ get_last_error(ec, true);
2310
2698
  #endif
2311
2699
 
2312
2700
  if (af == ASIO_OS_DEF(AF_INET))
@@ -2314,12 +2702,12 @@ int inet_pton(int af, const char* src, void* dest,
2314
2702
  if (result != socket_error_retval)
2315
2703
  {
2316
2704
  memcpy(dest, &address.v4.sin_addr, sizeof(in4_addr_type));
2317
- ec = asio::error_code();
2705
+ ec.assign(0, ec.category());
2318
2706
  }
2319
2707
  else if (strcmp(src, "255.255.255.255") == 0)
2320
2708
  {
2321
2709
  static_cast<in4_addr_type*>(dest)->s_addr = INADDR_NONE;
2322
- ec = asio::error_code();
2710
+ ec.assign(0, ec.category());
2323
2711
  }
2324
2712
  }
2325
2713
  else // AF_INET6
@@ -2329,7 +2717,7 @@ int inet_pton(int af, const char* src, void* dest,
2329
2717
  memcpy(dest, &address.v6.sin6_addr, sizeof(in6_addr_type));
2330
2718
  if (scope_id)
2331
2719
  *scope_id = address.v6.sin6_scope_id;
2332
- ec = asio::error_code();
2720
+ ec.assign(0, ec.category());
2333
2721
  }
2334
2722
  }
2335
2723
 
@@ -2338,7 +2726,7 @@ int inet_pton(int af, const char* src, void* dest,
2338
2726
  ec = asio::error::invalid_argument;
2339
2727
 
2340
2728
  if (result != socket_error_retval)
2341
- ec = asio::error_code();
2729
+ ec.assign(0, ec.category());
2342
2730
 
2343
2731
  return result == socket_error_retval ? -1 : 1;
2344
2732
  #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
@@ -2362,7 +2750,8 @@ int inet_pton(int af, const char* src, void* dest,
2362
2750
  src_ptr = src_buf;
2363
2751
  }
2364
2752
 
2365
- int result = error_wrapper(::inet_pton(af, src_ptr, dest), ec);
2753
+ int result = ::inet_pton(af, src_ptr, dest);
2754
+ get_last_error(ec, true);
2366
2755
  if (result <= 0 && !ec)
2367
2756
  ec = asio::error::invalid_argument;
2368
2757
  if (result > 0 && is_v6 && scope_id)
@@ -2388,7 +2777,6 @@ int inet_pton(int af, const char* src, void* dest,
2388
2777
 
2389
2778
  int gethostname(char* name, int namelen, asio::error_code& ec)
2390
2779
  {
2391
- clear_last_error();
2392
2780
  #if defined(ASIO_WINDOWS_RUNTIME)
2393
2781
  try
2394
2782
  {
@@ -2419,11 +2807,8 @@ int gethostname(char* name, int namelen, asio::error_code& ec)
2419
2807
  return -1;
2420
2808
  }
2421
2809
  #else // defined(ASIO_WINDOWS_RUNTIME)
2422
- int result = error_wrapper(::gethostname(name, namelen), ec);
2423
- # if defined(ASIO_WINDOWS)
2424
- if (result == 0)
2425
- ec = asio::error_code();
2426
- # endif // defined(ASIO_WINDOWS)
2810
+ int result = ::gethostname(name, namelen);
2811
+ get_last_error(ec, result != 0);
2427
2812
  return result;
2428
2813
  #endif // defined(ASIO_WINDOWS_RUNTIME)
2429
2814
  }
@@ -2458,20 +2843,20 @@ inline asio::error_code translate_netdb_error(int error)
2458
2843
  inline hostent* gethostbyaddr(const char* addr, int length, int af,
2459
2844
  hostent* result, char* buffer, int buflength, asio::error_code& ec)
2460
2845
  {
2461
- clear_last_error();
2462
2846
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
2463
2847
  (void)(buffer);
2464
2848
  (void)(buflength);
2465
- hostent* retval = error_wrapper(::gethostbyaddr(addr, length, af), ec);
2849
+ hostent* retval = ::gethostbyaddr(addr, length, af);
2850
+ get_last_error(ec, !retval);
2466
2851
  if (!retval)
2467
2852
  return 0;
2468
- ec = asio::error_code();
2469
2853
  *result = *retval;
2470
2854
  return retval;
2471
2855
  #elif defined(__sun) || defined(__QNX__)
2472
2856
  int error = 0;
2473
- hostent* retval = error_wrapper(::gethostbyaddr_r(addr, length, af, result,
2474
- buffer, buflength, &error), ec);
2857
+ hostent* retval = ::gethostbyaddr_r(addr, length,
2858
+ af, result, buffer, buflength, &error);
2859
+ get_last_error(ec, !retval);
2475
2860
  if (error)
2476
2861
  ec = translate_netdb_error(error);
2477
2862
  return retval;
@@ -2479,8 +2864,8 @@ inline hostent* gethostbyaddr(const char* addr, int length, int af,
2479
2864
  (void)(buffer);
2480
2865
  (void)(buflength);
2481
2866
  int error = 0;
2482
- hostent* retval = error_wrapper(::getipnodebyaddr(
2483
- addr, length, af, &error), ec);
2867
+ hostent* retval = ::getipnodebyaddr(addr, length, af, &error);
2868
+ get_last_error(ec, !retval);
2484
2869
  if (error)
2485
2870
  ec = translate_netdb_error(error);
2486
2871
  if (!retval)
@@ -2490,8 +2875,10 @@ inline hostent* gethostbyaddr(const char* addr, int length, int af,
2490
2875
  #else
2491
2876
  hostent* retval = 0;
2492
2877
  int error = 0;
2493
- error_wrapper(::gethostbyaddr_r(addr, length, af, result, buffer,
2494
- buflength, &retval, &error), ec);
2878
+ clear_last_error();
2879
+ ::gethostbyaddr_r(addr, length, af, result,
2880
+ buffer, buflength, &retval, &error);
2881
+ get_last_error(ec, true);
2495
2882
  if (error)
2496
2883
  ec = translate_netdb_error(error);
2497
2884
  return retval;
@@ -2501,7 +2888,6 @@ inline hostent* gethostbyaddr(const char* addr, int length, int af,
2501
2888
  inline hostent* gethostbyname(const char* name, int af, struct hostent* result,
2502
2889
  char* buffer, int buflength, int ai_flags, asio::error_code& ec)
2503
2890
  {
2504
- clear_last_error();
2505
2891
  #if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
2506
2892
  (void)(buffer);
2507
2893
  (void)(buflength);
@@ -2511,10 +2897,10 @@ inline hostent* gethostbyname(const char* name, int af, struct hostent* result,
2511
2897
  ec = asio::error::address_family_not_supported;
2512
2898
  return 0;
2513
2899
  }
2514
- hostent* retval = error_wrapper(::gethostbyname(name), ec);
2900
+ hostent* retval = ::gethostbyname(name);
2901
+ get_last_error(ec, !retval);
2515
2902
  if (!retval)
2516
2903
  return 0;
2517
- ec = asio::error_code();
2518
2904
  *result = *retval;
2519
2905
  return result;
2520
2906
  #elif defined(__sun) || defined(__QNX__)
@@ -2525,8 +2911,8 @@ inline hostent* gethostbyname(const char* name, int af, struct hostent* result,
2525
2911
  return 0;
2526
2912
  }
2527
2913
  int error = 0;
2528
- hostent* retval = error_wrapper(::gethostbyname_r(name, result, buffer,
2529
- buflength, &error), ec);
2914
+ hostent* retval = ::gethostbyname_r(name, result, buffer, buflength, &error);
2915
+ get_last_error(ec, !retval);
2530
2916
  if (error)
2531
2917
  ec = translate_netdb_error(error);
2532
2918
  return retval;
@@ -2534,8 +2920,8 @@ inline hostent* gethostbyname(const char* name, int af, struct hostent* result,
2534
2920
  (void)(buffer);
2535
2921
  (void)(buflength);
2536
2922
  int error = 0;
2537
- hostent* retval = error_wrapper(::getipnodebyname(
2538
- name, af, ai_flags, &error), ec);
2923
+ hostent* retval = ::getipnodebyname(name, af, ai_flags, &error);
2924
+ get_last_error(ec, !retval);
2539
2925
  if (error)
2540
2926
  ec = translate_netdb_error(error);
2541
2927
  if (!retval)
@@ -2551,8 +2937,9 @@ inline hostent* gethostbyname(const char* name, int af, struct hostent* result,
2551
2937
  }
2552
2938
  hostent* retval = 0;
2553
2939
  int error = 0;
2554
- error_wrapper(::gethostbyname_r(name, result,
2555
- buffer, buflength, &retval, &error), ec);
2940
+ clear_last_error();
2941
+ ::gethostbyname_r(name, result, buffer, buflength, &retval, &error);
2942
+ get_last_error(ec, true);
2556
2943
  if (error)
2557
2944
  ec = translate_netdb_error(error);
2558
2945
  return retval;
@@ -3268,7 +3655,7 @@ inline asio::error_code getnameinfo_emulation(
3268
3655
  }
3269
3656
  }
3270
3657
 
3271
- ec = asio::error_code();
3658
+ ec.assign(0, ec.category());
3272
3659
  return ec;
3273
3660
  }
3274
3661