grpc 1.43.1 → 1.44.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -35,6 +35,15 @@
35
35
 
36
36
  #include <string>
37
37
 
38
+ #include <openssl/bio.h>
39
+ #include <openssl/crypto.h> /* For OPENSSL_free */
40
+ #include <openssl/engine.h>
41
+ #include <openssl/err.h>
42
+ #include <openssl/ssl.h>
43
+ #include <openssl/tls1.h>
44
+ #include <openssl/x509.h>
45
+ #include <openssl/x509v3.h>
46
+
38
47
  #include "absl/strings/match.h"
39
48
  #include "absl/strings/string_view.h"
40
49
 
@@ -45,17 +54,6 @@
45
54
  #include <grpc/support/sync.h>
46
55
  #include <grpc/support/thd_id.h>
47
56
 
48
- extern "C" {
49
- #include <openssl/bio.h>
50
- #include <openssl/crypto.h> /* For OPENSSL_free */
51
- #include <openssl/engine.h>
52
- #include <openssl/err.h>
53
- #include <openssl/ssl.h>
54
- #include <openssl/tls1.h>
55
- #include <openssl/x509.h>
56
- #include <openssl/x509v3.h>
57
- }
58
-
59
57
  #include "src/core/lib/gpr/useful.h"
60
58
  #include "src/core/tsi/ssl/session_cache/ssl_session_cache.h"
61
59
  #include "src/core/tsi/ssl_types.h"
@@ -1923,6 +1921,14 @@ static int server_handshaker_factory_new_session_callback(
1923
1921
  return 1;
1924
1922
  }
1925
1923
 
1924
+ static int verify_cb(int ok, X509_STORE_CTX* ctx) {
1925
+ int cert_error = X509_STORE_CTX_get_error(ctx);
1926
+ if (cert_error != 0) {
1927
+ gpr_log(GPR_ERROR, "Certificate verify failed with code %d", cert_error);
1928
+ }
1929
+ return ok;
1930
+ }
1931
+
1926
1932
  /* --- tsi_ssl_handshaker_factory constructors. --- */
1927
1933
 
1928
1934
  static tsi_ssl_handshaker_factory_vtable client_handshaker_factory_vtable = {
@@ -2043,7 +2049,24 @@ tsi_result tsi_create_ssl_client_handshaker_factory_with_options(
2043
2049
  } else {
2044
2050
  SSL_CTX_set_verify(ssl_context, SSL_VERIFY_PEER, nullptr);
2045
2051
  }
2046
- /* TODO(jboeuf): Add revocation verification. */
2052
+
2053
+ #if OPENSSL_VERSION_NUMBER >= 0x10100000
2054
+ if (options->crl_directory != nullptr &&
2055
+ strcmp(options->crl_directory, "") != 0) {
2056
+ gpr_log(GPR_INFO, "enabling client CRL checking with path: %s",
2057
+ options->crl_directory);
2058
+ X509_STORE* cert_store = SSL_CTX_get_cert_store(ssl_context);
2059
+ X509_STORE_set_verify_cb(cert_store, verify_cb);
2060
+ if (!X509_STORE_load_locations(cert_store, nullptr,
2061
+ options->crl_directory)) {
2062
+ gpr_log(GPR_ERROR, "Failed to load CRL File from directory.");
2063
+ } else {
2064
+ X509_VERIFY_PARAM* param = X509_STORE_get0_param(cert_store);
2065
+ X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
2066
+ gpr_log(GPR_INFO, "enabled client side CRL checking.");
2067
+ }
2068
+ }
2069
+ #endif
2047
2070
 
2048
2071
  *factory = impl;
2049
2072
  return TSI_OK;
@@ -2205,7 +2228,24 @@ tsi_result tsi_create_ssl_server_handshaker_factory_with_options(
2205
2228
  nullptr);
2206
2229
  break;
2207
2230
  }
2208
- /* TODO(jboeuf): Add revocation verification. */
2231
+
2232
+ #if OPENSSL_VERSION_NUMBER >= 0x10100000
2233
+ if (options->crl_directory != nullptr &&
2234
+ strcmp(options->crl_directory, "") != 0) {
2235
+ gpr_log(GPR_INFO, "enabling server CRL checking with path %s",
2236
+ options->crl_directory);
2237
+ X509_STORE* cert_store = SSL_CTX_get_cert_store(impl->ssl_contexts[i]);
2238
+ X509_STORE_set_verify_cb(cert_store, verify_cb);
2239
+ if (!X509_STORE_load_locations(cert_store, nullptr,
2240
+ options->crl_directory)) {
2241
+ gpr_log(GPR_ERROR, "Failed to load CRL File from directory.");
2242
+ } else {
2243
+ X509_VERIFY_PARAM* param = X509_STORE_get0_param(cert_store);
2244
+ X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
2245
+ gpr_log(GPR_INFO, "enabled server CRL checking.");
2246
+ }
2247
+ }
2248
+ #endif
2209
2249
 
2210
2250
  result = tsi_ssl_extract_x509_subject_names_from_pem_cert(
2211
2251
  options->pem_key_cert_pairs[i].cert_chain,
@@ -21,16 +21,14 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <openssl/x509.h>
25
+
24
26
  #include "absl/strings/string_view.h"
25
27
 
26
28
  #include <grpc/grpc_security_constants.h>
27
29
 
28
30
  #include "src/core/tsi/transport_security_interface.h"
29
31
 
30
- extern "C" {
31
- #include <openssl/x509.h>
32
- }
33
-
34
32
  /* Value for the TSI_CERTIFICATE_TYPE_PEER_PROPERTY property for X509 certs. */
35
33
  #define TSI_X509_CERTIFICATE_TYPE "X509"
36
34
 
@@ -159,6 +157,12 @@ struct tsi_ssl_client_handshaker_options {
159
157
  tsi_tls_version min_tls_version;
160
158
  tsi_tls_version max_tls_version;
161
159
 
160
+ /* The directory where all hashed CRL files enforced by the handshaker are
161
+ located. If the directory is invalid, CRL checking will fail open and just
162
+ log. An empty directory will not enable crl checking. Only OpenSSL version
163
+ > 1.1 is supported for CRL checking*/
164
+ const char* crl_directory;
165
+
162
166
  tsi_ssl_client_handshaker_options()
163
167
  : pem_key_cert_pair(nullptr),
164
168
  pem_root_certs(nullptr),
@@ -169,7 +173,8 @@ struct tsi_ssl_client_handshaker_options {
169
173
  session_cache(nullptr),
170
174
  skip_server_certificate_verification(false),
171
175
  min_tls_version(tsi_tls_version::TSI_TLS1_2),
172
- max_tls_version(tsi_tls_version::TSI_TLS1_3) {}
176
+ max_tls_version(tsi_tls_version::TSI_TLS1_3),
177
+ crl_directory(nullptr) {}
173
178
  };
174
179
 
175
180
  /* Creates a client handshaker factory.
@@ -289,6 +294,12 @@ struct tsi_ssl_server_handshaker_options {
289
294
  tsi_tls_version min_tls_version;
290
295
  tsi_tls_version max_tls_version;
291
296
 
297
+ /* The directory where all hashed CRL files are cached in the x.509 store and
298
+ * enforced by the handshaker are located. If the directory is invalid, CRL
299
+ * checking will fail open and just log. An empty directory will not enable
300
+ * crl checking. Only OpenSSL version > 1.1 is supported for CRL checking */
301
+ const char* crl_directory;
302
+
292
303
  tsi_ssl_server_handshaker_options()
293
304
  : pem_key_cert_pairs(nullptr),
294
305
  num_key_cert_pairs(0),
@@ -300,7 +311,8 @@ struct tsi_ssl_server_handshaker_options {
300
311
  session_ticket_key(nullptr),
301
312
  session_ticket_key_size(0),
302
313
  min_tls_version(tsi_tls_version::TSI_TLS1_2),
303
- max_tls_version(tsi_tls_version::TSI_TLS1_3) {}
314
+ max_tls_version(tsi_tls_version::TSI_TLS1_3),
315
+ crl_directory(nullptr) {}
304
316
  };
305
317
 
306
318
  /* Creates a server handshaker factory.
@@ -60,7 +60,7 @@ end
60
60
 
61
61
  ENV['CPPFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
62
62
  ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\"" '
63
- ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.43.1\"" '
63
+ ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.44.0.pre2\"" '
64
64
 
65
65
  output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
66
66
  grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
@@ -69,9 +69,16 @@ ENV['BUILDDIR'] = output_dir
69
69
  unless windows
70
70
  puts 'Building internal gRPC into ' + grpc_lib_dir
71
71
  nproc = 4
72
- nproc = Etc.nprocessors * 2 if Etc.respond_to? :nprocessors
72
+ nproc = Etc.nprocessors if Etc.respond_to? :nprocessors
73
+ nproc_override = ENV['GRPC_RUBY_BUILD_PROCS']
74
+ unless nproc_override.nil? or nproc_override.size == 0
75
+ nproc = nproc_override
76
+ puts "Overriding make parallelism to #{nproc}"
77
+ end
73
78
  make = bsd ? 'gmake' : 'make'
74
- system("#{make} -j#{nproc} -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config} Q=")
79
+ cmd = "#{make} -j#{nproc} -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config} Q="
80
+ puts "Building grpc native library: #{cmd}"
81
+ system(cmd)
75
82
  exit 1 unless $? == 0
76
83
  end
77
84
 
@@ -178,6 +178,7 @@ grpc_tls_credentials_options_set_root_cert_name_type grpc_tls_credentials_option
178
178
  grpc_tls_credentials_options_watch_identity_key_cert_pairs_type grpc_tls_credentials_options_watch_identity_key_cert_pairs_import;
179
179
  grpc_tls_credentials_options_set_identity_cert_name_type grpc_tls_credentials_options_set_identity_cert_name_import;
180
180
  grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
181
+ grpc_tls_credentials_options_set_crl_directory_type grpc_tls_credentials_options_set_crl_directory_import;
181
182
  grpc_tls_credentials_options_set_verify_server_cert_type grpc_tls_credentials_options_set_verify_server_cert_import;
182
183
  grpc_tls_credentials_options_set_check_call_host_type grpc_tls_credentials_options_set_check_call_host_import;
183
184
  grpc_xds_credentials_create_type grpc_xds_credentials_create_import;
@@ -466,6 +467,7 @@ void grpc_rb_load_imports(HMODULE library) {
466
467
  grpc_tls_credentials_options_watch_identity_key_cert_pairs_import = (grpc_tls_credentials_options_watch_identity_key_cert_pairs_type) GetProcAddress(library, "grpc_tls_credentials_options_watch_identity_key_cert_pairs");
467
468
  grpc_tls_credentials_options_set_identity_cert_name_import = (grpc_tls_credentials_options_set_identity_cert_name_type) GetProcAddress(library, "grpc_tls_credentials_options_set_identity_cert_name");
468
469
  grpc_tls_credentials_options_set_cert_request_type_import = (grpc_tls_credentials_options_set_cert_request_type_type) GetProcAddress(library, "grpc_tls_credentials_options_set_cert_request_type");
470
+ grpc_tls_credentials_options_set_crl_directory_import = (grpc_tls_credentials_options_set_crl_directory_type) GetProcAddress(library, "grpc_tls_credentials_options_set_crl_directory");
469
471
  grpc_tls_credentials_options_set_verify_server_cert_import = (grpc_tls_credentials_options_set_verify_server_cert_type) GetProcAddress(library, "grpc_tls_credentials_options_set_verify_server_cert");
470
472
  grpc_tls_credentials_options_set_check_call_host_import = (grpc_tls_credentials_options_set_check_call_host_type) GetProcAddress(library, "grpc_tls_credentials_options_set_check_call_host");
471
473
  grpc_xds_credentials_create_import = (grpc_xds_credentials_create_type) GetProcAddress(library, "grpc_xds_credentials_create");
@@ -509,6 +509,9 @@ extern grpc_tls_credentials_options_set_identity_cert_name_type grpc_tls_credent
509
509
  typedef void(*grpc_tls_credentials_options_set_cert_request_type_type)(grpc_tls_credentials_options* options, grpc_ssl_client_certificate_request_type type);
510
510
  extern grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
511
511
  #define grpc_tls_credentials_options_set_cert_request_type grpc_tls_credentials_options_set_cert_request_type_import
512
+ typedef void(*grpc_tls_credentials_options_set_crl_directory_type)(grpc_tls_credentials_options* options, const char* crl_directory);
513
+ extern grpc_tls_credentials_options_set_crl_directory_type grpc_tls_credentials_options_set_crl_directory_import;
514
+ #define grpc_tls_credentials_options_set_crl_directory grpc_tls_credentials_options_set_crl_directory_import
512
515
  typedef void(*grpc_tls_credentials_options_set_verify_server_cert_type)(grpc_tls_credentials_options* options, int verify_server_cert);
513
516
  extern grpc_tls_credentials_options_set_verify_server_cert_type grpc_tls_credentials_options_set_verify_server_cert_import;
514
517
  #define grpc_tls_credentials_options_set_verify_server_cert grpc_tls_credentials_options_set_verify_server_cert_import
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.43.1'
17
+ VERSION = '1.44.0.pre2'
18
18
  end
@@ -1,9 +1,10 @@
1
1
  # Generated by the protocol buffer compiler. DO NOT EDIT!
2
2
  # source: src/proto/grpc/testing/test.proto
3
3
 
4
+ require 'google/protobuf'
5
+
4
6
  require 'src/proto/grpc/testing/empty_pb'
5
7
  require 'src/proto/grpc/testing/messages_pb'
6
- require 'google/protobuf'
7
8
 
8
9
  Google::Protobuf::DescriptorPool.generated_pool.build do
9
10
  add_file("src/proto/grpc/testing/test.proto", :syntax => :proto3) do
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2020 The Abseil Authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef ABSL_BASE_INTERNAL_FAST_TYPE_ID_H_
18
+ #define ABSL_BASE_INTERNAL_FAST_TYPE_ID_H_
19
+
20
+ #include "absl/base/config.h"
21
+
22
+ namespace absl {
23
+ ABSL_NAMESPACE_BEGIN
24
+ namespace base_internal {
25
+
26
+ template <typename Type>
27
+ struct FastTypeTag {
28
+ constexpr static char dummy_var = 0;
29
+ };
30
+
31
+ template <typename Type>
32
+ constexpr char FastTypeTag<Type>::dummy_var;
33
+
34
+ // FastTypeId<Type>() evaluates at compile/link-time to a unique pointer for the
35
+ // passed-in type. These are meant to be good match for keys into maps or
36
+ // straight up comparisons.
37
+ using FastTypeIdType = const void*;
38
+
39
+ template <typename Type>
40
+ constexpr inline FastTypeIdType FastTypeId() {
41
+ return &FastTypeTag<Type>::dummy_var;
42
+ }
43
+
44
+ } // namespace base_internal
45
+ ABSL_NAMESPACE_END
46
+ } // namespace absl
47
+
48
+ #endif // ABSL_BASE_INTERNAL_FAST_TYPE_ID_H_
@@ -0,0 +1,200 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
16
+ #define ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
17
+
18
+ #include <cstdint>
19
+ #include <istream>
20
+ #include <limits>
21
+
22
+ #include "absl/base/optimization.h"
23
+ #include "absl/random/internal/fast_uniform_bits.h"
24
+ #include "absl/random/internal/iostream_state_saver.h"
25
+
26
+ namespace absl {
27
+ ABSL_NAMESPACE_BEGIN
28
+
29
+ // absl::bernoulli_distribution is a drop in replacement for
30
+ // std::bernoulli_distribution. It guarantees that (given a perfect
31
+ // UniformRandomBitGenerator) the acceptance probability is *exactly* equal to
32
+ // the given double.
33
+ //
34
+ // The implementation assumes that double is IEEE754
35
+ class bernoulli_distribution {
36
+ public:
37
+ using result_type = bool;
38
+
39
+ class param_type {
40
+ public:
41
+ using distribution_type = bernoulli_distribution;
42
+
43
+ explicit param_type(double p = 0.5) : prob_(p) {
44
+ assert(p >= 0.0 && p <= 1.0);
45
+ }
46
+
47
+ double p() const { return prob_; }
48
+
49
+ friend bool operator==(const param_type& p1, const param_type& p2) {
50
+ return p1.p() == p2.p();
51
+ }
52
+ friend bool operator!=(const param_type& p1, const param_type& p2) {
53
+ return p1.p() != p2.p();
54
+ }
55
+
56
+ private:
57
+ double prob_;
58
+ };
59
+
60
+ bernoulli_distribution() : bernoulli_distribution(0.5) {}
61
+
62
+ explicit bernoulli_distribution(double p) : param_(p) {}
63
+
64
+ explicit bernoulli_distribution(param_type p) : param_(p) {}
65
+
66
+ // no-op
67
+ void reset() {}
68
+
69
+ template <typename URBG>
70
+ bool operator()(URBG& g) { // NOLINT(runtime/references)
71
+ return Generate(param_.p(), g);
72
+ }
73
+
74
+ template <typename URBG>
75
+ bool operator()(URBG& g, // NOLINT(runtime/references)
76
+ const param_type& param) {
77
+ return Generate(param.p(), g);
78
+ }
79
+
80
+ param_type param() const { return param_; }
81
+ void param(const param_type& param) { param_ = param; }
82
+
83
+ double p() const { return param_.p(); }
84
+
85
+ result_type(min)() const { return false; }
86
+ result_type(max)() const { return true; }
87
+
88
+ friend bool operator==(const bernoulli_distribution& d1,
89
+ const bernoulli_distribution& d2) {
90
+ return d1.param_ == d2.param_;
91
+ }
92
+
93
+ friend bool operator!=(const bernoulli_distribution& d1,
94
+ const bernoulli_distribution& d2) {
95
+ return d1.param_ != d2.param_;
96
+ }
97
+
98
+ private:
99
+ static constexpr uint64_t kP32 = static_cast<uint64_t>(1) << 32;
100
+
101
+ template <typename URBG>
102
+ static bool Generate(double p, URBG& g); // NOLINT(runtime/references)
103
+
104
+ param_type param_;
105
+ };
106
+
107
+ template <typename CharT, typename Traits>
108
+ std::basic_ostream<CharT, Traits>& operator<<(
109
+ std::basic_ostream<CharT, Traits>& os, // NOLINT(runtime/references)
110
+ const bernoulli_distribution& x) {
111
+ auto saver = random_internal::make_ostream_state_saver(os);
112
+ os.precision(random_internal::stream_precision_helper<double>::kPrecision);
113
+ os << x.p();
114
+ return os;
115
+ }
116
+
117
+ template <typename CharT, typename Traits>
118
+ std::basic_istream<CharT, Traits>& operator>>(
119
+ std::basic_istream<CharT, Traits>& is, // NOLINT(runtime/references)
120
+ bernoulli_distribution& x) { // NOLINT(runtime/references)
121
+ auto saver = random_internal::make_istream_state_saver(is);
122
+ auto p = random_internal::read_floating_point<double>(is);
123
+ if (!is.fail()) {
124
+ x.param(bernoulli_distribution::param_type(p));
125
+ }
126
+ return is;
127
+ }
128
+
129
+ template <typename URBG>
130
+ bool bernoulli_distribution::Generate(double p,
131
+ URBG& g) { // NOLINT(runtime/references)
132
+ random_internal::FastUniformBits<uint32_t> fast_u32;
133
+
134
+ while (true) {
135
+ // There are two aspects of the definition of `c` below that are worth
136
+ // commenting on. First, because `p` is in the range [0, 1], `c` is in the
137
+ // range [0, 2^32] which does not fit in a uint32_t and therefore requires
138
+ // 64 bits.
139
+ //
140
+ // Second, `c` is constructed by first casting explicitly to a signed
141
+ // integer and then converting implicitly to an unsigned integer of the same
142
+ // size. This is done because the hardware conversion instructions produce
143
+ // signed integers from double; if taken as a uint64_t the conversion would
144
+ // be wrong for doubles greater than 2^63 (not relevant in this use-case).
145
+ // If converted directly to an unsigned integer, the compiler would end up
146
+ // emitting code to handle such large values that are not relevant due to
147
+ // the known bounds on `c`. To avoid these extra instructions this
148
+ // implementation converts first to the signed type and then use the
149
+ // implicit conversion to unsigned (which is a no-op).
150
+ const uint64_t c = static_cast<int64_t>(p * kP32);
151
+ const uint32_t v = fast_u32(g);
152
+ // FAST PATH: this path fails with probability 1/2^32. Note that simply
153
+ // returning v <= c would approximate P very well (up to an absolute error
154
+ // of 1/2^32); the slow path (taken in that range of possible error, in the
155
+ // case of equality) eliminates the remaining error.
156
+ if (ABSL_PREDICT_TRUE(v != c)) return v < c;
157
+
158
+ // It is guaranteed that `q` is strictly less than 1, because if `q` were
159
+ // greater than or equal to 1, the same would be true for `p`. Certainly `p`
160
+ // cannot be greater than 1, and if `p == 1`, then the fast path would
161
+ // necessary have been taken already.
162
+ const double q = static_cast<double>(c) / kP32;
163
+
164
+ // The probability of acceptance on the fast path is `q` and so the
165
+ // probability of acceptance here should be `p - q`.
166
+ //
167
+ // Note that `q` is obtained from `p` via some shifts and conversions, the
168
+ // upshot of which is that `q` is simply `p` with some of the
169
+ // least-significant bits of its mantissa set to zero. This means that the
170
+ // difference `p - q` will not have any rounding errors. To see why, pretend
171
+ // that double has 10 bits of resolution and q is obtained from `p` in such
172
+ // a way that the 4 least-significant bits of its mantissa are set to zero.
173
+ // For example:
174
+ // p = 1.1100111011 * 2^-1
175
+ // q = 1.1100110000 * 2^-1
176
+ // p - q = 1.011 * 2^-8
177
+ // The difference `p - q` has exactly the nonzero mantissa bits that were
178
+ // "lost" in `q` producing a number which is certainly representable in a
179
+ // double.
180
+ const double left = p - q;
181
+
182
+ // By construction, the probability of being on this slow path is 1/2^32, so
183
+ // P(accept in slow path) = P(accept| in slow path) * P(slow path),
184
+ // which means the probability of acceptance here is `1 / (left * kP32)`:
185
+ const double here = left * kP32;
186
+
187
+ // The simplest way to compute the result of this trial is to repeat the
188
+ // whole algorithm with the new probability. This terminates because even
189
+ // given arbitrarily unfriendly "random" bits, each iteration either
190
+ // multiplies a tiny probability by 2^32 (if c == 0) or strips off some
191
+ // number of nonzero mantissa bits. That process is bounded.
192
+ if (here == 0) return false;
193
+ p = here;
194
+ }
195
+ }
196
+
197
+ ABSL_NAMESPACE_END
198
+ } // namespace absl
199
+
200
+ #endif // ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_