grpc 1.41.1 → 1.42.0.pre1

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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +55 -43
  3. data/include/grpc/event_engine/event_engine.h +82 -42
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  5. data/include/grpc/event_engine/memory_allocator.h +210 -0
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/grpc_security.h +18 -0
  8. data/include/grpc/grpc_security_constants.h +1 -0
  9. data/include/grpc/impl/codegen/port_platform.h +7 -0
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  11. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  12. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  13. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  14. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  15. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  18. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  20. data/src/core/ext/filters/client_channel/connector.h +18 -18
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  42. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  44. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  49. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  52. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  55. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  58. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  59. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  60. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  62. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  63. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  64. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  66. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  67. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  68. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  69. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  74. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  75. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  76. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  77. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  78. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  79. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  80. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  81. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  82. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  84. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  85. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  87. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  88. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  89. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  90. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  91. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  92. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  93. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  94. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  96. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  98. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  99. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  103. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  107. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  109. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  110. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  112. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  120. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  121. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  123. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  125. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  127. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  128. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  130. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  131. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  138. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  139. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  140. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  142. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  146. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  147. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  148. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  153. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  155. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  161. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  163. data/src/core/ext/xds/xds_api.cc +325 -362
  164. data/src/core/ext/xds/xds_api.h +134 -82
  165. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  166. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  167. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  168. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  169. data/src/core/ext/xds/xds_client.cc +527 -314
  170. data/src/core/ext/xds/xds_client.h +42 -37
  171. data/src/core/ext/xds/xds_client_stats.h +1 -1
  172. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  173. data/src/core/lib/address_utils/parse_address.cc +2 -0
  174. data/src/core/lib/avl/avl.cc +5 -5
  175. data/src/core/lib/backoff/backoff.cc +1 -1
  176. data/src/core/lib/channel/channel_args.cc +24 -6
  177. data/src/core/lib/channel/channel_args.h +9 -0
  178. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  179. data/src/core/lib/channel/channel_trace.cc +1 -1
  180. data/src/core/lib/channel/channel_trace.h +1 -1
  181. data/src/core/lib/channel/channelz.cc +3 -3
  182. data/src/core/lib/channel/channelz.h +2 -2
  183. data/src/core/lib/channel/channelz_registry.cc +1 -1
  184. data/src/core/lib/channel/channelz_registry.h +1 -1
  185. data/src/core/lib/channel/connected_channel.cc +1 -3
  186. data/src/core/lib/channel/connected_channel.h +1 -2
  187. data/src/core/lib/compression/compression.cc +2 -2
  188. data/src/core/lib/compression/compression_args.cc +6 -4
  189. data/src/core/lib/compression/compression_internal.cc +2 -2
  190. data/src/core/lib/compression/compression_internal.h +1 -1
  191. data/src/core/lib/config/core_configuration.cc +44 -2
  192. data/src/core/lib/config/core_configuration.h +39 -1
  193. data/src/core/lib/debug/stats.cc +1 -1
  194. data/src/core/lib/debug/stats_data.cc +13 -13
  195. data/src/core/lib/gpr/atm.cc +1 -1
  196. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  197. data/src/core/lib/gpr/string.cc +2 -2
  198. data/src/core/lib/gpr/tls.h +1 -1
  199. data/src/core/lib/gpr/useful.h +79 -32
  200. data/src/core/lib/gprpp/arena.h +10 -0
  201. data/src/core/lib/gprpp/bitset.h +38 -16
  202. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  203. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  204. data/src/core/lib/gprpp/match.h +1 -1
  205. data/src/core/lib/gprpp/memory.h +6 -0
  206. data/src/core/lib/gprpp/overload.h +1 -1
  207. data/src/core/lib/gprpp/status_helper.cc +23 -3
  208. data/src/core/lib/gprpp/status_helper.h +12 -1
  209. data/src/core/lib/gprpp/table.h +411 -0
  210. data/src/core/lib/http/httpcli.cc +200 -182
  211. data/src/core/lib/http/parser.cc +2 -2
  212. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  213. data/src/core/lib/iomgr/combiner.cc +6 -21
  214. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  215. data/src/core/lib/iomgr/error.cc +113 -52
  216. data/src/core/lib/iomgr/error.h +50 -9
  217. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  218. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  219. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  220. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  221. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  222. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  223. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  224. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  225. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  226. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  227. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  228. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  229. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  230. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  231. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  232. data/src/core/lib/iomgr/executor.cc +6 -20
  233. data/src/core/lib/iomgr/iomgr.cc +3 -1
  234. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  235. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  236. data/src/core/lib/iomgr/load_file.cc +2 -2
  237. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  238. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  239. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  240. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  241. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  242. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  243. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  244. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  246. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  247. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  250. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  251. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  252. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  253. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  254. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  255. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  256. data/src/core/lib/json/json_util.cc +68 -0
  257. data/src/core/lib/json/json_util.h +57 -99
  258. data/src/core/lib/json/json_writer.cc +0 -3
  259. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  260. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  261. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  262. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  263. data/src/core/lib/security/context/security_context.cc +4 -2
  264. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  265. data/src/core/lib/security/credentials/credentials.cc +4 -2
  266. data/src/core/lib/security/credentials/credentials.h +6 -1
  267. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  268. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  269. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  270. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  271. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  272. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  273. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  274. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  275. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  276. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  278. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  279. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  280. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  281. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  282. data/src/core/lib/slice/slice.cc +0 -16
  283. data/src/core/lib/slice/slice_api.cc +39 -0
  284. data/src/core/lib/slice/slice_buffer.cc +5 -5
  285. data/src/core/lib/slice/slice_intern.cc +8 -13
  286. data/src/core/lib/slice/slice_internal.h +1 -244
  287. data/src/core/lib/slice/slice_refcount.cc +17 -0
  288. data/src/core/lib/slice/slice_refcount.h +121 -0
  289. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  290. data/src/core/lib/slice/slice_split.cc +100 -0
  291. data/src/core/lib/slice/slice_split.h +40 -0
  292. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  293. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  294. data/src/core/lib/slice/static_slice.cc +529 -0
  295. data/src/core/lib/slice/static_slice.h +331 -0
  296. data/src/core/lib/surface/builtins.cc +49 -0
  297. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  298. data/src/core/lib/surface/call.cc +103 -120
  299. data/src/core/lib/surface/call.h +0 -6
  300. data/src/core/lib/surface/channel.cc +19 -32
  301. data/src/core/lib/surface/channel.h +0 -9
  302. data/src/core/lib/surface/channel_init.cc +23 -76
  303. data/src/core/lib/surface/channel_init.h +52 -44
  304. data/src/core/lib/surface/completion_queue.cc +6 -5
  305. data/src/core/lib/surface/init.cc +0 -39
  306. data/src/core/lib/surface/init_secure.cc +17 -14
  307. data/src/core/lib/surface/lame_client.cc +18 -11
  308. data/src/core/lib/surface/lame_client.h +1 -1
  309. data/src/core/lib/surface/server.cc +25 -17
  310. data/src/core/lib/surface/server.h +17 -10
  311. data/src/core/lib/surface/validate_metadata.cc +5 -2
  312. data/src/core/lib/surface/version.cc +2 -2
  313. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  314. data/src/core/lib/transport/error_utils.cc +42 -17
  315. data/src/core/lib/transport/error_utils.h +1 -1
  316. data/src/core/lib/transport/metadata.cc +31 -10
  317. data/src/core/lib/transport/metadata.h +2 -1
  318. data/src/core/lib/transport/metadata_batch.cc +35 -371
  319. data/src/core/lib/transport/metadata_batch.h +905 -71
  320. data/src/core/lib/transport/parsed_metadata.h +263 -0
  321. data/src/core/lib/transport/pid_controller.cc +4 -4
  322. data/src/core/lib/transport/static_metadata.cc +714 -846
  323. data/src/core/lib/transport/static_metadata.h +115 -379
  324. data/src/core/lib/transport/status_metadata.cc +1 -0
  325. data/src/core/lib/transport/transport.cc +4 -5
  326. data/src/core/lib/transport/transport_op_string.cc +40 -20
  327. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  328. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  329. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  330. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  331. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  332. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  335. data/src/core/tsi/fake_transport_security.cc +15 -7
  336. data/src/core/tsi/local_transport_security.cc +36 -73
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  339. data/src/core/tsi/ssl_transport_security.cc +10 -2
  340. data/src/core/tsi/transport_security.cc +12 -0
  341. data/src/core/tsi/transport_security.h +16 -1
  342. data/src/core/tsi/transport_security_interface.h +26 -0
  343. data/src/ruby/ext/grpc/extconf.rb +12 -9
  344. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  346. data/src/ruby/lib/grpc/version.rb +1 -1
  347. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  348. data/src/ruby/spec/client_server_spec.rb +1 -1
  349. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  351. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  352. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
  353. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +13 -0
  355. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  356. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  357. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  358. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  359. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  360. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  361. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
  362. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  363. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  364. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  366. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  368. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
  369. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +72 -45
  370. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  371. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +2 -2
  372. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +479 -15
  373. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
  374. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
  375. data/third_party/re2/re2/compile.cc +91 -109
  376. data/third_party/re2/re2/dfa.cc +27 -39
  377. data/third_party/re2/re2/filtered_re2.cc +18 -2
  378. data/third_party/re2/re2/filtered_re2.h +10 -5
  379. data/third_party/re2/re2/nfa.cc +1 -1
  380. data/third_party/re2/re2/parse.cc +42 -23
  381. data/third_party/re2/re2/perl_groups.cc +34 -34
  382. data/third_party/re2/re2/prefilter.cc +3 -2
  383. data/third_party/re2/re2/prog.cc +182 -4
  384. data/third_party/re2/re2/prog.h +28 -9
  385. data/third_party/re2/re2/re2.cc +87 -118
  386. data/third_party/re2/re2/re2.h +156 -141
  387. data/third_party/re2/re2/regexp.cc +12 -5
  388. data/third_party/re2/re2/regexp.h +8 -2
  389. data/third_party/re2/re2/set.cc +31 -9
  390. data/third_party/re2/re2/set.h +9 -4
  391. data/third_party/re2/re2/simplify.cc +11 -3
  392. data/third_party/re2/re2/tostring.cc +1 -1
  393. data/third_party/re2/re2/walker-inl.h +1 -1
  394. data/third_party/re2/util/mutex.h +2 -2
  395. data/third_party/re2/util/pcre.h +3 -3
  396. metadata +78 -66
  397. data/include/grpc/event_engine/slice_allocator.h +0 -71
  398. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  399. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  400. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  401. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  402. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  403. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  404. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  405. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  406. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  407. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  408. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  409. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  410. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  411. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  412. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  413. data/src/core/lib/iomgr/udp_server.cc +0 -747
  414. data/src/core/lib/iomgr/udp_server.h +0 -103
  415. data/src/core/lib/transport/authority_override.cc +0 -40
  416. data/src/core/lib/transport/authority_override.h +0 -37
@@ -44,12 +44,12 @@
44
44
 
45
45
  namespace re2 {
46
46
 
47
- // Reduce the maximum repeat count by an order of magnitude when fuzzing.
48
- #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
49
- static const int kMaxRepeat = 100;
50
- #else
51
- static const int kMaxRepeat = 1000;
52
- #endif
47
+ // Controls the maximum repeat count permitted by the parser.
48
+ static int maximum_repeat_count = 1000;
49
+
50
+ void Regexp::FUZZING_ONLY_set_maximum_repeat_count(int i) {
51
+ maximum_repeat_count = i;
52
+ }
53
53
 
54
54
  // Regular expression parse state.
55
55
  // The list of parsed regexps so far is maintained as a vector of
@@ -568,7 +568,9 @@ int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) {
568
568
  bool Regexp::ParseState::PushRepetition(int min, int max,
569
569
  const StringPiece& s,
570
570
  bool nongreedy) {
571
- if ((max != -1 && max < min) || min > kMaxRepeat || max > kMaxRepeat) {
571
+ if ((max != -1 && max < min) ||
572
+ min > maximum_repeat_count ||
573
+ max > maximum_repeat_count) {
572
574
  status_->set_code(kRegexpRepeatSize);
573
575
  status_->set_error_arg(s);
574
576
  return false;
@@ -591,7 +593,7 @@ bool Regexp::ParseState::PushRepetition(int min, int max,
591
593
  stacktop_ = re;
592
594
  if (min >= 2 || max >= 2) {
593
595
  RepetitionWalker w;
594
- if (w.Walk(stacktop_, kMaxRepeat) == 0) {
596
+ if (w.Walk(stacktop_, maximum_repeat_count) == 0) {
595
597
  status_->set_code(kRegexpRepeatSize);
596
598
  status_->set_error_arg(s);
597
599
  return false;
@@ -685,7 +687,7 @@ bool Regexp::ParseState::DoRightParen() {
685
687
  if ((r1 = stacktop_) == NULL ||
686
688
  (r2 = r1->down_) == NULL ||
687
689
  r2->op() != kLeftParen) {
688
- status_->set_code(kRegexpMissingParen);
690
+ status_->set_code(kRegexpUnexpectedParen);
689
691
  status_->set_error_arg(whole_regexp_);
690
692
  return false;
691
693
  }
@@ -1407,13 +1409,15 @@ static int StringPieceToRune(Rune *r, StringPiece *sp, RegexpStatus* status) {
1407
1409
  }
1408
1410
  }
1409
1411
 
1410
- status->set_code(kRegexpBadUTF8);
1411
- status->set_error_arg(StringPiece());
1412
+ if (status != NULL) {
1413
+ status->set_code(kRegexpBadUTF8);
1414
+ status->set_error_arg(StringPiece());
1415
+ }
1412
1416
  return -1;
1413
1417
  }
1414
1418
 
1415
- // Return whether name is valid UTF-8.
1416
- // If not, set status to kRegexpBadUTF8.
1419
+ // Returns whether name is valid UTF-8.
1420
+ // If not, sets status to kRegexpBadUTF8.
1417
1421
  static bool IsValidUTF8(const StringPiece& s, RegexpStatus* status) {
1418
1422
  StringPiece t = s;
1419
1423
  Rune r;
@@ -2011,19 +2015,34 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s,
2011
2015
  return true;
2012
2016
  }
2013
2017
 
2014
- // Is this a valid capture name? [A-Za-z0-9_]+
2015
- // PCRE limits names to 32 bytes.
2016
- // Python rejects names starting with digits.
2017
- // We don't enforce either of those.
2018
+ // Returns whether name is a valid capture name.
2018
2019
  static bool IsValidCaptureName(const StringPiece& name) {
2019
2020
  if (name.empty())
2020
2021
  return false;
2021
- for (size_t i = 0; i < name.size(); i++) {
2022
- int c = name[i];
2023
- if (('0' <= c && c <= '9') ||
2024
- ('a' <= c && c <= 'z') ||
2025
- ('A' <= c && c <= 'Z') ||
2026
- c == '_')
2022
+
2023
+ // Historically, we effectively used [0-9A-Za-z_]+ to validate; that
2024
+ // followed Python 2 except for not restricting the first character.
2025
+ // As of Python 3, Unicode characters beyond ASCII are also allowed;
2026
+ // accordingly, we permit the Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd and
2027
+ // Pc categories, but again without restricting the first character.
2028
+ // Also, Unicode normalization (e.g. NFKC) isn't performed: Python 3
2029
+ // performs it for identifiers, but seemingly not for capture names;
2030
+ // if they start doing that for capture names, we won't follow suit.
2031
+ static const CharClass* const cc = []() {
2032
+ CharClassBuilder ccb;
2033
+ for (StringPiece group :
2034
+ {"Lu", "Ll", "Lt", "Lm", "Lo", "Nl", "Mn", "Mc", "Nd", "Pc"})
2035
+ AddUGroup(&ccb, LookupGroup(group, unicode_groups, num_unicode_groups),
2036
+ +1, Regexp::NoParseFlags);
2037
+ return ccb.GetCharClass();
2038
+ }();
2039
+
2040
+ StringPiece t = name;
2041
+ Rune r;
2042
+ while (!t.empty()) {
2043
+ if (StringPieceToRune(&r, &t, NULL) < 0)
2044
+ return false;
2045
+ if (cc->Contains(r))
2027
2046
  continue;
2028
2047
  return false;
2029
2048
  }
@@ -20,12 +20,12 @@ static const URange16 code3[] = { /* \w */
20
20
  { 0x61, 0x7a },
21
21
  };
22
22
  const UGroup perl_groups[] = {
23
- { "\\d", +1, code1, 1 },
24
- { "\\D", -1, code1, 1 },
25
- { "\\s", +1, code2, 3 },
26
- { "\\S", -1, code2, 3 },
27
- { "\\w", +1, code3, 4 },
28
- { "\\W", -1, code3, 4 },
23
+ { "\\d", +1, code1, 1, 0, 0 },
24
+ { "\\D", -1, code1, 1, 0, 0 },
25
+ { "\\s", +1, code2, 3, 0, 0 },
26
+ { "\\S", -1, code2, 3, 0, 0 },
27
+ { "\\w", +1, code3, 4, 0, 0 },
28
+ { "\\W", -1, code3, 4, 0, 0 },
29
29
  };
30
30
  const int num_perl_groups = 6;
31
31
  static const URange16 code4[] = { /* [:alnum:] */
@@ -85,34 +85,34 @@ static const URange16 code17[] = { /* [:xdigit:] */
85
85
  { 0x61, 0x66 },
86
86
  };
87
87
  const UGroup posix_groups[] = {
88
- { "[:alnum:]", +1, code4, 3 },
89
- { "[:^alnum:]", -1, code4, 3 },
90
- { "[:alpha:]", +1, code5, 2 },
91
- { "[:^alpha:]", -1, code5, 2 },
92
- { "[:ascii:]", +1, code6, 1 },
93
- { "[:^ascii:]", -1, code6, 1 },
94
- { "[:blank:]", +1, code7, 2 },
95
- { "[:^blank:]", -1, code7, 2 },
96
- { "[:cntrl:]", +1, code8, 2 },
97
- { "[:^cntrl:]", -1, code8, 2 },
98
- { "[:digit:]", +1, code9, 1 },
99
- { "[:^digit:]", -1, code9, 1 },
100
- { "[:graph:]", +1, code10, 1 },
101
- { "[:^graph:]", -1, code10, 1 },
102
- { "[:lower:]", +1, code11, 1 },
103
- { "[:^lower:]", -1, code11, 1 },
104
- { "[:print:]", +1, code12, 1 },
105
- { "[:^print:]", -1, code12, 1 },
106
- { "[:punct:]", +1, code13, 4 },
107
- { "[:^punct:]", -1, code13, 4 },
108
- { "[:space:]", +1, code14, 2 },
109
- { "[:^space:]", -1, code14, 2 },
110
- { "[:upper:]", +1, code15, 1 },
111
- { "[:^upper:]", -1, code15, 1 },
112
- { "[:word:]", +1, code16, 4 },
113
- { "[:^word:]", -1, code16, 4 },
114
- { "[:xdigit:]", +1, code17, 3 },
115
- { "[:^xdigit:]", -1, code17, 3 },
88
+ { "[:alnum:]", +1, code4, 3, 0, 0 },
89
+ { "[:^alnum:]", -1, code4, 3, 0, 0 },
90
+ { "[:alpha:]", +1, code5, 2, 0, 0 },
91
+ { "[:^alpha:]", -1, code5, 2, 0, 0 },
92
+ { "[:ascii:]", +1, code6, 1, 0, 0 },
93
+ { "[:^ascii:]", -1, code6, 1, 0, 0 },
94
+ { "[:blank:]", +1, code7, 2, 0, 0 },
95
+ { "[:^blank:]", -1, code7, 2, 0, 0 },
96
+ { "[:cntrl:]", +1, code8, 2, 0, 0 },
97
+ { "[:^cntrl:]", -1, code8, 2, 0, 0 },
98
+ { "[:digit:]", +1, code9, 1, 0, 0 },
99
+ { "[:^digit:]", -1, code9, 1, 0, 0 },
100
+ { "[:graph:]", +1, code10, 1, 0, 0 },
101
+ { "[:^graph:]", -1, code10, 1, 0, 0 },
102
+ { "[:lower:]", +1, code11, 1, 0, 0 },
103
+ { "[:^lower:]", -1, code11, 1, 0, 0 },
104
+ { "[:print:]", +1, code12, 1, 0, 0 },
105
+ { "[:^print:]", -1, code12, 1, 0, 0 },
106
+ { "[:punct:]", +1, code13, 4, 0, 0 },
107
+ { "[:^punct:]", -1, code13, 4, 0, 0 },
108
+ { "[:space:]", +1, code14, 2, 0, 0 },
109
+ { "[:^space:]", -1, code14, 2, 0, 0 },
110
+ { "[:upper:]", +1, code15, 1, 0, 0 },
111
+ { "[:^upper:]", -1, code15, 1, 0, 0 },
112
+ { "[:word:]", +1, code16, 4, 0, 0 },
113
+ { "[:^word:]", -1, code16, 4, 0, 0 },
114
+ { "[:xdigit:]", +1, code17, 3, 0, 0 },
115
+ { "[:^xdigit:]", -1, code17, 3, 0, 0 },
116
116
  };
117
117
  const int num_posix_groups = 28;
118
118
 
@@ -648,14 +648,15 @@ Prefilter* Prefilter::FromRegexp(Regexp* re) {
648
648
  return NULL;
649
649
 
650
650
  Regexp* simple = re->Simplify();
651
- Prefilter::Info *info = BuildInfo(simple);
651
+ if (simple == NULL)
652
+ return NULL;
652
653
 
654
+ Prefilter::Info* info = BuildInfo(simple);
653
655
  simple->Decref();
654
656
  if (info == NULL)
655
657
  return NULL;
656
658
 
657
659
  Prefilter* m = info->TakeMatch();
658
-
659
660
  delete info;
660
661
  return m;
661
662
  }
@@ -115,9 +115,8 @@ Prog::Prog()
115
115
  start_unanchored_(0),
116
116
  size_(0),
117
117
  bytemap_range_(0),
118
+ prefix_foldcase_(false),
118
119
  prefix_size_(0),
119
- prefix_front_(-1),
120
- prefix_back_(-1),
121
120
  list_count_(0),
122
121
  dfa_mem_(0),
123
122
  dfa_first_(NULL),
@@ -127,6 +126,8 @@ Prog::Prog()
127
126
  Prog::~Prog() {
128
127
  DeleteDFA(dfa_longest_);
129
128
  DeleteDFA(dfa_first_);
129
+ if (prefix_foldcase_)
130
+ delete[] prefix_dfa_;
130
131
  }
131
132
 
132
133
  typedef SparseSet Workq;
@@ -916,6 +917,183 @@ void Prog::ComputeHints(std::vector<Inst>* flat, int begin, int end) {
916
917
  }
917
918
  }
918
919
 
920
+ // The final state will always be this, which frees up a register for the hot
921
+ // loop and thus avoids the spilling that can occur when building with Clang.
922
+ static const size_t kShiftDFAFinal = 9;
923
+
924
+ // This function takes the prefix as std::string (i.e. not const std::string&
925
+ // as normal) because it's going to clobber it, so a temporary is convenient.
926
+ static uint64_t* BuildShiftDFA(std::string prefix) {
927
+ // This constant is for convenience now and also for correctness later when
928
+ // we clobber the prefix, but still need to know how long it was initially.
929
+ const size_t size = prefix.size();
930
+
931
+ // Construct the NFA.
932
+ // The table is indexed by input byte; each element is a bitfield of states
933
+ // reachable by the input byte. Given a bitfield of the current states, the
934
+ // bitfield of states reachable from those is - for this specific purpose -
935
+ // always ((ncurr << 1) | 1). Intersecting the reachability bitfields gives
936
+ // the bitfield of the next states reached by stepping over the input byte.
937
+ // Credits for this technique: the Hyperscan paper by Geoff Langdale et al.
938
+ uint16_t nfa[256]{};
939
+ for (size_t i = 0; i < size; ++i) {
940
+ uint8_t b = prefix[i];
941
+ nfa[b] |= 1 << (i+1);
942
+ }
943
+ // This is the `\C*?` for unanchored search.
944
+ for (int b = 0; b < 256; ++b)
945
+ nfa[b] |= 1;
946
+
947
+ // This maps from DFA state to NFA states; the reverse mapping is used when
948
+ // recording transitions and gets implemented with plain old linear search.
949
+ // The "Shift DFA" technique limits this to ten states when using uint64_t;
950
+ // to allow for the initial state, we use at most nine bytes of the prefix.
951
+ // That same limit is also why uint16_t is sufficient for the NFA bitfield.
952
+ uint16_t states[kShiftDFAFinal+1]{};
953
+ states[0] = 1;
954
+ for (size_t dcurr = 0; dcurr < size; ++dcurr) {
955
+ uint8_t b = prefix[dcurr];
956
+ uint16_t ncurr = states[dcurr];
957
+ uint16_t nnext = nfa[b] & ((ncurr << 1) | 1);
958
+ size_t dnext = dcurr+1;
959
+ if (dnext == size)
960
+ dnext = kShiftDFAFinal;
961
+ states[dnext] = nnext;
962
+ }
963
+
964
+ // Sort and unique the bytes of the prefix to avoid repeating work while we
965
+ // record transitions. This clobbers the prefix, but it's no longer needed.
966
+ std::sort(prefix.begin(), prefix.end());
967
+ prefix.erase(std::unique(prefix.begin(), prefix.end()), prefix.end());
968
+
969
+ // Construct the DFA.
970
+ // The table is indexed by input byte; each element is effectively a packed
971
+ // array of uint6_t; each array value will be multiplied by six in order to
972
+ // avoid having to do so later in the hot loop as well as masking/shifting.
973
+ // Credits for this technique: "Shift-based DFAs" on GitHub by Per Vognsen.
974
+ uint64_t* dfa = new uint64_t[256]{};
975
+ // Record a transition from each state for each of the bytes of the prefix.
976
+ // Note that all other input bytes go back to the initial state by default.
977
+ for (size_t dcurr = 0; dcurr < size; ++dcurr) {
978
+ for (uint8_t b : prefix) {
979
+ uint16_t ncurr = states[dcurr];
980
+ uint16_t nnext = nfa[b] & ((ncurr << 1) | 1);
981
+ size_t dnext = 0;
982
+ while (states[dnext] != nnext)
983
+ ++dnext;
984
+ dfa[b] |= static_cast<uint64_t>(dnext * 6) << (dcurr * 6);
985
+ // Convert ASCII letters to uppercase and record the extra transitions.
986
+ // Note that ASCII letters are guaranteed to be lowercase at this point
987
+ // because that's how the parser normalises them. #FunFact: 'k' and 's'
988
+ // match U+212A and U+017F, respectively, so they won't occur here when
989
+ // using UTF-8 encoding because the parser will emit character classes.
990
+ if ('a' <= b && b <= 'z') {
991
+ b -= 'a' - 'A';
992
+ dfa[b] |= static_cast<uint64_t>(dnext * 6) << (dcurr * 6);
993
+ }
994
+ }
995
+ }
996
+ // This lets the final state "saturate", which will matter for performance:
997
+ // in the hot loop, we check for a match only at the end of each iteration,
998
+ // so we must keep signalling the match until we get around to checking it.
999
+ for (int b = 0; b < 256; ++b)
1000
+ dfa[b] |= static_cast<uint64_t>(kShiftDFAFinal * 6) << (kShiftDFAFinal * 6);
1001
+
1002
+ return dfa;
1003
+ }
1004
+
1005
+ void Prog::ConfigurePrefixAccel(const std::string& prefix,
1006
+ bool prefix_foldcase) {
1007
+ prefix_foldcase_ = prefix_foldcase;
1008
+ prefix_size_ = prefix.size();
1009
+ if (prefix_foldcase_) {
1010
+ // Use PrefixAccel_ShiftDFA().
1011
+ // ... and no more than nine bytes of the prefix. (See above for details.)
1012
+ prefix_size_ = std::min(prefix_size_, kShiftDFAFinal);
1013
+ prefix_dfa_ = BuildShiftDFA(prefix.substr(0, prefix_size_));
1014
+ } else if (prefix_size_ != 1) {
1015
+ // Use PrefixAccel_FrontAndBack().
1016
+ prefix_front_ = prefix.front();
1017
+ prefix_back_ = prefix.back();
1018
+ } else {
1019
+ // Use memchr(3).
1020
+ prefix_front_ = prefix.front();
1021
+ }
1022
+ }
1023
+
1024
+ const void* Prog::PrefixAccel_ShiftDFA(const void* data, size_t size) {
1025
+ if (size < prefix_size_)
1026
+ return NULL;
1027
+
1028
+ uint64_t curr = 0;
1029
+
1030
+ // At the time of writing, rough benchmarks on a Broadwell machine showed
1031
+ // that this unroll factor (i.e. eight) achieves a speedup factor of two.
1032
+ if (size >= 8) {
1033
+ const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
1034
+ const uint8_t* endp = p + (size&~7);
1035
+ do {
1036
+ uint8_t b0 = p[0];
1037
+ uint8_t b1 = p[1];
1038
+ uint8_t b2 = p[2];
1039
+ uint8_t b3 = p[3];
1040
+ uint8_t b4 = p[4];
1041
+ uint8_t b5 = p[5];
1042
+ uint8_t b6 = p[6];
1043
+ uint8_t b7 = p[7];
1044
+
1045
+ uint64_t next0 = prefix_dfa_[b0];
1046
+ uint64_t next1 = prefix_dfa_[b1];
1047
+ uint64_t next2 = prefix_dfa_[b2];
1048
+ uint64_t next3 = prefix_dfa_[b3];
1049
+ uint64_t next4 = prefix_dfa_[b4];
1050
+ uint64_t next5 = prefix_dfa_[b5];
1051
+ uint64_t next6 = prefix_dfa_[b6];
1052
+ uint64_t next7 = prefix_dfa_[b7];
1053
+
1054
+ uint64_t curr0 = next0 >> (curr & 63);
1055
+ uint64_t curr1 = next1 >> (curr0 & 63);
1056
+ uint64_t curr2 = next2 >> (curr1 & 63);
1057
+ uint64_t curr3 = next3 >> (curr2 & 63);
1058
+ uint64_t curr4 = next4 >> (curr3 & 63);
1059
+ uint64_t curr5 = next5 >> (curr4 & 63);
1060
+ uint64_t curr6 = next6 >> (curr5 & 63);
1061
+ uint64_t curr7 = next7 >> (curr6 & 63);
1062
+
1063
+ if ((curr7 & 63) == kShiftDFAFinal * 6) {
1064
+ // At the time of writing, using the same masking subexpressions from
1065
+ // the preceding lines caused Clang to clutter the hot loop computing
1066
+ // them - even though they aren't actually needed for shifting! Hence
1067
+ // these rewritten conditions, which achieve a speedup factor of two.
1068
+ if (((curr7-curr0) & 63) == 0) return p+1-prefix_size_;
1069
+ if (((curr7-curr1) & 63) == 0) return p+2-prefix_size_;
1070
+ if (((curr7-curr2) & 63) == 0) return p+3-prefix_size_;
1071
+ if (((curr7-curr3) & 63) == 0) return p+4-prefix_size_;
1072
+ if (((curr7-curr4) & 63) == 0) return p+5-prefix_size_;
1073
+ if (((curr7-curr5) & 63) == 0) return p+6-prefix_size_;
1074
+ if (((curr7-curr6) & 63) == 0) return p+7-prefix_size_;
1075
+ if (((curr7-curr7) & 63) == 0) return p+8-prefix_size_;
1076
+ }
1077
+
1078
+ curr = curr7;
1079
+ p += 8;
1080
+ } while (p != endp);
1081
+ data = p;
1082
+ size = size&7;
1083
+ }
1084
+
1085
+ const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
1086
+ const uint8_t* endp = p + size;
1087
+ while (p != endp) {
1088
+ uint8_t b = *p++;
1089
+ uint64_t next = prefix_dfa_[b];
1090
+ curr = next >> (curr & 63);
1091
+ if ((curr & 63) == kShiftDFAFinal * 6)
1092
+ return p-prefix_size_;
1093
+ }
1094
+ return NULL;
1095
+ }
1096
+
919
1097
  #if defined(__AVX2__)
920
1098
  // Finds the least significant non-zero bit in n.
921
1099
  static int FindLSBSet(uint32_t n) {
@@ -958,7 +1136,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) {
958
1136
  const __m256i* endfp = fp + size/sizeof(__m256i);
959
1137
  const __m256i f_set1 = _mm256_set1_epi8(prefix_front_);
960
1138
  const __m256i b_set1 = _mm256_set1_epi8(prefix_back_);
961
- while (fp != endfp) {
1139
+ do {
962
1140
  const __m256i f_loadu = _mm256_loadu_si256(fp++);
963
1141
  const __m256i b_loadu = _mm256_loadu_si256(bp++);
964
1142
  const __m256i f_cmpeq = _mm256_cmpeq_epi8(f_set1, f_loadu);
@@ -970,7 +1148,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) {
970
1148
  const int fb_ctz = FindLSBSet(fb_movemask);
971
1149
  return reinterpret_cast<const char*>(fp-1) + fb_ctz;
972
1150
  }
973
- }
1151
+ } while (fp != endfp);
974
1152
  data = fp;
975
1153
  size = size%sizeof(__m256i);
976
1154
  }
@@ -220,11 +220,23 @@ class Prog {
220
220
  // Accelerates to the first likely occurrence of the prefix.
221
221
  // Returns a pointer to the first byte or NULL if not found.
222
222
  const void* PrefixAccel(const void* data, size_t size) {
223
- DCHECK_GE(prefix_size_, 1);
224
- return prefix_size_ == 1 ? memchr(data, prefix_front_, size)
225
- : PrefixAccel_FrontAndBack(data, size);
223
+ DCHECK(can_prefix_accel());
224
+ if (prefix_foldcase_) {
225
+ return PrefixAccel_ShiftDFA(data, size);
226
+ } else if (prefix_size_ != 1) {
227
+ return PrefixAccel_FrontAndBack(data, size);
228
+ } else {
229
+ return memchr(data, prefix_front_, size);
230
+ }
226
231
  }
227
232
 
233
+ // Configures prefix accel using the analysis performed during compilation.
234
+ void ConfigurePrefixAccel(const std::string& prefix, bool prefix_foldcase);
235
+
236
+ // An implementation of prefix accel that uses prefix_dfa_ to perform
237
+ // case-insensitive search.
238
+ const void* PrefixAccel_ShiftDFA(const void* data, size_t size);
239
+
228
240
  // An implementation of prefix accel that looks for prefix_front_ and
229
241
  // prefix_back_ to return fewer false positives than memchr(3) alone.
230
242
  const void* PrefixAccel_FrontAndBack(const void* data, size_t size);
@@ -298,10 +310,6 @@ class Prog {
298
310
  // FOR TESTING OR EXPERIMENTAL PURPOSES ONLY.
299
311
  int BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb);
300
312
 
301
- // Controls whether the DFA should bail out early if the NFA would be faster.
302
- // FOR TESTING ONLY.
303
- static void TEST_dfa_should_bail_when_slow(bool b);
304
-
305
313
  // Compute bytemap.
306
314
  void ComputeByteMap();
307
315
 
@@ -390,6 +398,10 @@ class Prog {
390
398
  // Computes hints for ByteRange instructions in [begin, end).
391
399
  void ComputeHints(std::vector<Inst>* flat, int begin, int end);
392
400
 
401
+ // Controls whether the DFA should bail out early if the NFA would be faster.
402
+ // FOR TESTING ONLY.
403
+ static void TESTING_ONLY_set_dfa_should_bail_when_slow(bool b);
404
+
393
405
  private:
394
406
  friend class Compiler;
395
407
 
@@ -406,9 +418,16 @@ class Prog {
406
418
  int start_unanchored_; // unanchored entry point for program
407
419
  int size_; // number of instructions
408
420
  int bytemap_range_; // bytemap_[x] < bytemap_range_
421
+
422
+ bool prefix_foldcase_; // whether prefix is case-insensitive
409
423
  size_t prefix_size_; // size of prefix (0 if no prefix)
410
- int prefix_front_; // first byte of prefix (-1 if no prefix)
411
- int prefix_back_; // last byte of prefix (-1 if no prefix)
424
+ union {
425
+ uint64_t* prefix_dfa_; // "Shift DFA" for prefix
426
+ struct {
427
+ int prefix_front_; // first byte of prefix
428
+ int prefix_back_; // last byte of prefix
429
+ };
430
+ };
412
431
 
413
432
  int list_count_; // count of lists (see above)
414
433
  int inst_count_[kNumInst]; // count of instructions by opcode