grpc 1.30.2 → 1.31.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 (317) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +560 -619
  3. data/include/grpc/grpc_security_constants.h +3 -0
  4. data/include/grpc/impl/codegen/grpc_types.h +7 -5
  5. data/include/grpc/impl/codegen/port_platform.h +0 -32
  6. data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
  7. data/src/core/ext/filters/client_channel/client_channel.cc +406 -265
  8. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  9. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  10. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  11. data/src/core/ext/filters/client_channel/health/health_check_client.cc +2 -0
  12. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  13. data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
  14. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +39 -23
  16. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
  17. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +376 -68
  18. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
  19. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
  23. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
  24. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -48
  25. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  26. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +21 -18
  27. data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
  28. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
  29. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +33 -28
  30. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
  31. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  32. data/src/core/ext/filters/client_channel/subchannel.cc +1 -1
  33. data/src/core/ext/filters/client_channel/xds/xds_api.cc +327 -123
  34. data/src/core/ext/filters/client_channel/xds/xds_api.h +72 -7
  35. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +12 -23
  36. data/src/core/ext/filters/client_channel/xds/xds_client.cc +112 -33
  37. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +10 -10
  38. data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
  39. data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
  40. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
  41. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
  42. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
  43. data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
  44. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +383 -347
  45. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  46. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  47. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  48. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  49. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -4
  50. data/src/core/ext/transport/chttp2/transport/flow_control.cc +22 -27
  51. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  52. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  53. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  54. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  55. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  56. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  57. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  59. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  60. data/src/core/ext/transport/chttp2/transport/internal.h +13 -0
  61. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  62. data/src/core/ext/transport/chttp2/transport/writing.cc +9 -14
  63. data/src/core/ext/transport/inproc/inproc_transport.cc +35 -15
  64. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  65. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  66. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -1
  67. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +80 -69
  68. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +24 -23
  69. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +66 -56
  70. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  71. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +2 -2
  72. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +317 -311
  73. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  74. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  75. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  76. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  77. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +9 -8
  78. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +1 -1
  79. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +163 -169
  80. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  81. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +4 -5
  82. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  83. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +137 -117
  84. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  85. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +105 -87
  86. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +12 -13
  87. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -1
  88. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  89. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  90. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -1
  91. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  92. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  93. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +49 -42
  94. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  95. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  96. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +81 -65
  97. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  98. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +1 -1
  99. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  100. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  101. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  102. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  103. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  104. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +7 -7
  105. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +648 -696
  106. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  107. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  108. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -1
  109. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  110. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +234 -199
  111. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  112. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +13 -13
  113. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  114. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +20 -18
  115. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  116. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +18 -17
  117. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  118. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  119. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  120. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  121. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  122. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  123. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  124. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  125. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  126. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  127. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +3 -3
  128. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
  129. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  130. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  131. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  132. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  133. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  134. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  135. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  136. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  137. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  138. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  139. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  140. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  141. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  142. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  143. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  144. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  145. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
  146. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  147. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  148. data/src/core/ext/upb-generated/validate/validate.upb.h +536 -535
  149. data/src/core/lib/channel/channel_trace.cc +2 -6
  150. data/src/core/lib/channel/channelz.cc +5 -15
  151. data/src/core/lib/gpr/log_linux.cc +6 -8
  152. data/src/core/lib/gpr/log_posix.cc +6 -8
  153. data/src/core/lib/gpr/string.cc +10 -9
  154. data/src/core/lib/gpr/string.h +4 -2
  155. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  156. data/src/core/lib/http/httpcli.cc +13 -10
  157. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  158. data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
  159. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  160. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  161. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
  162. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
  163. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  164. data/src/core/lib/iomgr/ev_posix.cc +2 -0
  165. data/src/core/lib/iomgr/iomgr.cc +10 -0
  166. data/src/core/lib/iomgr/iomgr.h +10 -0
  167. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  168. data/src/core/lib/iomgr/port.h +1 -21
  169. data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
  170. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
  171. data/src/core/lib/iomgr/resource_quota.cc +34 -31
  172. data/src/core/lib/iomgr/sockaddr_utils.cc +7 -5
  173. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  174. data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
  175. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  176. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
  177. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  178. data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
  179. data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
  180. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  181. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  182. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  183. data/src/core/lib/iomgr/tcp_server.h +7 -5
  184. data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
  185. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
  186. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  187. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
  188. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
  189. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  190. data/src/core/lib/iomgr/timer_generic.cc +13 -12
  191. data/src/core/lib/iomgr/udp_server.cc +24 -23
  192. data/src/core/lib/iomgr/udp_server.h +5 -2
  193. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  194. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  195. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  196. data/src/core/lib/json/json_reader.cc +20 -21
  197. data/src/core/lib/security/credentials/credentials.h +5 -3
  198. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  199. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -9
  200. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  201. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
  202. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
  203. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  204. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  205. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
  206. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +10 -10
  207. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  208. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  209. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
  210. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
  211. data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
  212. data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
  213. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
  214. data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
  215. data/src/core/lib/security/util/json_util.cc +12 -13
  216. data/src/core/lib/slice/slice.cc +38 -1
  217. data/src/core/lib/slice/slice_internal.h +1 -0
  218. data/src/core/lib/surface/call.cc +40 -41
  219. data/src/core/lib/surface/completion_queue.cc +271 -14
  220. data/src/core/lib/surface/completion_queue.h +8 -0
  221. data/src/core/lib/surface/init.cc +2 -0
  222. data/src/core/lib/surface/server.cc +565 -632
  223. data/src/core/lib/surface/server.h +34 -12
  224. data/src/core/lib/surface/version.cc +2 -2
  225. data/src/core/lib/transport/transport.h +6 -0
  226. data/src/core/lib/uri/uri_parser.cc +8 -15
  227. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  228. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
  229. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -0
  230. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  231. data/src/core/tsi/ssl_transport_security.cc +102 -11
  232. data/src/core/tsi/ssl_transport_security.h +14 -2
  233. data/src/core/tsi/transport_security_interface.h +5 -0
  234. data/src/ruby/ext/grpc/extconf.rb +5 -2
  235. data/src/ruby/ext/grpc/rb_call.c +3 -2
  236. data/src/ruby/ext/grpc/rb_call.h +4 -0
  237. data/src/ruby/ext/grpc/rb_call_credentials.c +54 -10
  238. data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
  239. data/src/ruby/lib/grpc/version.rb +1 -1
  240. data/third_party/boringssl-with-bazel/err_data.c +89 -83
  241. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  242. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  243. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  244. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  245. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  246. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  247. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  248. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  249. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  250. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  251. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  252. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  253. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
  254. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
  255. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
  262. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  265. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
  266. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  267. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  268. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
  269. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
  270. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
  271. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  272. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  273. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  274. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  275. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  276. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  277. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
  278. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  279. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
  280. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  281. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  282. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  283. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  284. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  286. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  287. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  288. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  289. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  290. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +33 -16
  291. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
  292. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +789 -715
  293. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
  294. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
  295. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
  296. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
  297. data/third_party/boringssl-with-bazel/src/ssl/internal.h +17 -14
  298. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
  299. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +28 -0
  300. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
  301. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  302. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
  303. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
  304. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +12 -9
  305. data/third_party/upb/upb/decode.c +467 -504
  306. data/third_party/upb/upb/encode.c +163 -121
  307. data/third_party/upb/upb/msg.c +130 -64
  308. data/third_party/upb/upb/msg.h +418 -14
  309. data/third_party/upb/upb/port_def.inc +35 -6
  310. data/third_party/upb/upb/port_undef.inc +8 -1
  311. data/third_party/upb/upb/table.c +53 -75
  312. data/third_party/upb/upb/table.int.h +11 -43
  313. data/third_party/upb/upb/upb.c +148 -124
  314. data/third_party/upb/upb/upb.h +65 -147
  315. data/third_party/upb/upb/upb.hpp +86 -0
  316. metadata +40 -37
  317. data/third_party/upb/upb/generated_util.h +0 -105
@@ -52,19 +52,8 @@ typedef enum {
52
52
 
53
53
  typedef struct {
54
54
  uint64_t val;
55
- #ifndef NDEBUG
56
- /* In debug mode we carry the value type around also so we can check accesses
57
- * to be sure the right member is being read. */
58
- upb_ctype_t ctype;
59
- #endif
60
55
  } upb_value;
61
56
 
62
- #ifdef NDEBUG
63
- #define SET_TYPE(dest, val) UPB_UNUSED(val)
64
- #else
65
- #define SET_TYPE(dest, val) dest = val
66
- #endif
67
-
68
57
  /* Like strdup(), which isn't always available since it's not ANSI C. */
69
58
  char *upb_strdup(const char *s, upb_alloc *a);
70
59
  /* Variant that works with a length-delimited rather than NULL-delimited string,
@@ -75,15 +64,13 @@ UPB_INLINE char *upb_gstrdup(const char *s) {
75
64
  return upb_strdup(s, &upb_alloc_global);
76
65
  }
77
66
 
78
- UPB_INLINE void _upb_value_setval(upb_value *v, uint64_t val,
79
- upb_ctype_t ctype) {
67
+ UPB_INLINE void _upb_value_setval(upb_value *v, uint64_t val) {
80
68
  v->val = val;
81
- SET_TYPE(v->ctype, ctype);
82
69
  }
83
70
 
84
- UPB_INLINE upb_value _upb_value_val(uint64_t val, upb_ctype_t ctype) {
71
+ UPB_INLINE upb_value _upb_value_val(uint64_t val) {
85
72
  upb_value ret;
86
- _upb_value_setval(&ret, val, ctype);
73
+ _upb_value_setval(&ret, val);
87
74
  return ret;
88
75
  }
89
76
 
@@ -98,7 +85,6 @@ UPB_INLINE upb_value _upb_value_val(uint64_t val, upb_ctype_t ctype) {
98
85
  #define FUNCS(name, membername, type_t, converter, proto_type) \
99
86
  UPB_INLINE void upb_value_set ## name(upb_value *val, type_t cval) { \
100
87
  val->val = (converter)cval; \
101
- SET_TYPE(val->ctype, proto_type); \
102
88
  } \
103
89
  UPB_INLINE upb_value upb_value_ ## name(type_t val) { \
104
90
  upb_value ret; \
@@ -106,7 +92,6 @@ UPB_INLINE upb_value _upb_value_val(uint64_t val, upb_ctype_t ctype) {
106
92
  return ret; \
107
93
  } \
108
94
  UPB_INLINE type_t upb_value_get ## name(upb_value val) { \
109
- UPB_ASSERT_DEBUGVAR(val.ctype == proto_type); \
110
95
  return (type_t)(converter)val.val; \
111
96
  }
112
97
 
@@ -124,12 +109,10 @@ FUNCS(fptr, fptr, upb_func*, uintptr_t, UPB_CTYPE_FPTR)
124
109
 
125
110
  UPB_INLINE void upb_value_setfloat(upb_value *val, float cval) {
126
111
  memcpy(&val->val, &cval, sizeof(cval));
127
- SET_TYPE(val->ctype, UPB_CTYPE_FLOAT);
128
112
  }
129
113
 
130
114
  UPB_INLINE void upb_value_setdouble(upb_value *val, double cval) {
131
115
  memcpy(&val->val, &cval, sizeof(cval));
132
- SET_TYPE(val->ctype, UPB_CTYPE_DOUBLE);
133
116
  }
134
117
 
135
118
  UPB_INLINE upb_value upb_value_float(float cval) {
@@ -173,7 +156,6 @@ typedef struct {
173
156
 
174
157
  #define UPB_TABVALUE_EMPTY_INIT {-1}
175
158
 
176
-
177
159
  /* upb_table ******************************************************************/
178
160
 
179
161
  typedef struct _upb_tabent {
@@ -190,7 +172,6 @@ typedef struct _upb_tabent {
190
172
  typedef struct {
191
173
  size_t count; /* Number of entries in the hash part. */
192
174
  size_t mask; /* Mask to turn hash value -> bucket. */
193
- upb_ctype_t ctype; /* Type of all values. */
194
175
  uint8_t size_lg2; /* Size of the hashtable part is 2^size_lg2 entries. */
195
176
 
196
177
  /* Hash table entries.
@@ -200,17 +181,6 @@ typedef struct {
200
181
  * initialize const hash tables. Then we cast away const when we have to.
201
182
  */
202
183
  const upb_tabent *entries;
203
-
204
- #ifndef NDEBUG
205
- /* This table's allocator. We make the user pass it in to every relevant
206
- * function and only use this to check it in debug mode. We do this solely
207
- * to keep upb_table as small as possible. This might seem slightly paranoid
208
- * but the plan is to use upb_table for all map fields and extension sets in
209
- * a forthcoming message representation, so there could be a lot of these.
210
- * If this turns out to be too annoying later, we can change it (since this
211
- * is an internal-only header file). */
212
- upb_alloc *alloc;
213
- #endif
214
184
  } upb_table;
215
185
 
216
186
  typedef struct {
@@ -224,12 +194,6 @@ typedef struct {
224
194
  size_t array_count; /* Array part number of elements. */
225
195
  } upb_inttable;
226
196
 
227
- #define UPB_INTTABLE_INIT(count, mask, ctype, size_lg2, ent, a, asize, acount) \
228
- {UPB_TABLE_INIT(count, mask, ctype, size_lg2, ent), a, asize, acount}
229
-
230
- #define UPB_EMPTY_INTTABLE_INIT(ctype) \
231
- UPB_INTTABLE_INIT(0, 0, ctype, 0, NULL, NULL, 0, 0)
232
-
233
197
  #define UPB_ARRAY_EMPTYENT -1
234
198
 
235
199
  UPB_INLINE size_t upb_table_size(const upb_table *t) {
@@ -298,6 +262,7 @@ upb_inttable *upb_inttable_pack(const upb_inttable *t, void *p, size_t *ofs,
298
262
  size_t size);
299
263
  upb_strtable *upb_strtable_pack(const upb_strtable *t, void *p, size_t *ofs,
300
264
  size_t size);
265
+ void upb_strtable_clear(upb_strtable *t);
301
266
 
302
267
  /* Inserts the given key into the hashtable with the given value. The key must
303
268
  * not already exist in the hash table. For string tables, the key must be
@@ -399,7 +364,7 @@ UPB_INLINE bool upb_inttable_lookup32(const upb_inttable *t, uint32_t key,
399
364
  if (key < t->array_size) {
400
365
  upb_tabval arrval = t->array[key];
401
366
  if (upb_arrhas(arrval)) {
402
- _upb_value_setval(v, arrval.val, t->t.ctype);
367
+ _upb_value_setval(v, arrval.val);
403
368
  return true;
404
369
  } else {
405
370
  return false;
@@ -409,7 +374,7 @@ UPB_INLINE bool upb_inttable_lookup32(const upb_inttable *t, uint32_t key,
409
374
  if (t->t.entries == NULL) return false;
410
375
  for (e = upb_getentry(&t->t, upb_inthash(key)); true; e = e->next) {
411
376
  if ((uint32_t)e->key == key) {
412
- _upb_value_setval(v, e->val.val, t->t.ctype);
377
+ _upb_value_setval(v, e->val.val);
413
378
  return true;
414
379
  }
415
380
  if (e->next == NULL) return false;
@@ -463,8 +428,7 @@ typedef struct {
463
428
  void upb_strtable_begin(upb_strtable_iter *i, const upb_strtable *t);
464
429
  void upb_strtable_next(upb_strtable_iter *i);
465
430
  bool upb_strtable_done(const upb_strtable_iter *i);
466
- const char *upb_strtable_iter_key(const upb_strtable_iter *i);
467
- size_t upb_strtable_iter_keylength(const upb_strtable_iter *i);
431
+ upb_strview upb_strtable_iter_key(const upb_strtable_iter *i);
468
432
  upb_value upb_strtable_iter_value(const upb_strtable_iter *i);
469
433
  void upb_strtable_iter_setdone(upb_strtable_iter *i);
470
434
  bool upb_strtable_iter_isequal(const upb_strtable_iter *i1,
@@ -488,6 +452,10 @@ typedef struct {
488
452
  bool array_part;
489
453
  } upb_inttable_iter;
490
454
 
455
+ UPB_INLINE const upb_tabent *str_tabent(const upb_strtable_iter *i) {
456
+ return &i->t->t.entries[i->index];
457
+ }
458
+
491
459
  void upb_inttable_begin(upb_inttable_iter *i, const upb_inttable *t);
492
460
  void upb_inttable_next(upb_inttable_iter *i);
493
461
  bool upb_inttable_done(const upb_inttable_iter *i);
@@ -11,17 +11,6 @@
11
11
 
12
12
  #include "upb/port_def.inc"
13
13
 
14
- /* Guarantee null-termination and provide ellipsis truncation.
15
- * It may be tempting to "optimize" this by initializing these final
16
- * four bytes up-front and then being careful never to overwrite them,
17
- * this is safer and simpler. */
18
- static void nullz(upb_status *status) {
19
- const char *ellipsis = "...";
20
- size_t len = strlen(ellipsis);
21
- UPB_ASSERT(sizeof(status->msg) > len);
22
- memcpy(status->msg + sizeof(status->msg) - len, ellipsis, len);
23
- }
24
-
25
14
  /* upb_status *****************************************************************/
26
15
 
27
16
  void upb_status_clear(upb_status *status) {
@@ -37,8 +26,8 @@ const char *upb_status_errmsg(const upb_status *status) { return status->msg; }
37
26
  void upb_status_seterrmsg(upb_status *status, const char *msg) {
38
27
  if (!status) return;
39
28
  status->ok = false;
40
- strncpy(status->msg, msg, sizeof(status->msg));
41
- nullz(status);
29
+ strncpy(status->msg, msg, UPB_STATUS_MAX_MESSAGE - 1);
30
+ status->msg[UPB_STATUS_MAX_MESSAGE - 1] = '\0';
42
31
  }
43
32
 
44
33
  void upb_status_seterrf(upb_status *status, const char *fmt, ...) {
@@ -52,7 +41,16 @@ void upb_status_vseterrf(upb_status *status, const char *fmt, va_list args) {
52
41
  if (!status) return;
53
42
  status->ok = false;
54
43
  _upb_vsnprintf(status->msg, sizeof(status->msg), fmt, args);
55
- nullz(status);
44
+ status->msg[UPB_STATUS_MAX_MESSAGE - 1] = '\0';
45
+ }
46
+
47
+ void upb_status_vappenderrf(upb_status *status, const char *fmt, va_list args) {
48
+ size_t len;
49
+ if (!status) return;
50
+ status->ok = false;
51
+ len = strlen(status->msg);
52
+ _upb_vsnprintf(status->msg + len, sizeof(status->msg) - len, fmt, args);
53
+ status->msg[UPB_STATUS_MAX_MESSAGE - 1] = '\0';
56
54
  }
57
55
 
58
56
  /* upb_alloc ******************************************************************/
@@ -74,188 +72,214 @@ upb_alloc upb_alloc_global = {&upb_global_allocfunc};
74
72
  /* upb_arena ******************************************************************/
75
73
 
76
74
  /* Be conservative and choose 16 in case anyone is using SSE. */
77
- static const size_t maxalign = 16;
78
75
 
79
- static size_t align_up_max(size_t size) {
80
- return ((size + maxalign - 1) / maxalign) * maxalign;
81
- }
76
+ typedef struct mem_block {
77
+ struct mem_block *next;
78
+ uint32_t size;
79
+ uint32_t cleanups;
80
+ /* Data follows. */
81
+ } mem_block;
82
+
83
+ typedef struct cleanup_ent {
84
+ upb_cleanup_func *cleanup;
85
+ void *ud;
86
+ } cleanup_ent;
82
87
 
83
88
  struct upb_arena {
84
- /* We implement the allocator interface.
85
- * This must be the first member of upb_arena! */
86
- upb_alloc alloc;
89
+ _upb_arena_head head;
90
+ uint32_t *cleanups;
87
91
 
88
92
  /* Allocator to allocate arena blocks. We are responsible for freeing these
89
93
  * when we are destroyed. */
90
94
  upb_alloc *block_alloc;
95
+ uint32_t last_size;
91
96
 
92
- size_t bytes_allocated;
93
- size_t next_block_size;
94
- size_t max_block_size;
95
-
96
- /* Linked list of blocks. Points to an arena_block, defined in env.c */
97
- void *block_head;
97
+ /* When multiple arenas are fused together, each arena points to a parent
98
+ * arena (root points to itself). The root tracks how many live arenas
99
+ * reference it. */
100
+ uint32_t refcount; /* Only used when a->parent == a */
101
+ struct upb_arena *parent;
98
102
 
99
- /* Cleanup entries. Pointer to a cleanup_ent, defined in env.c */
100
- void *cleanup_head;
103
+ /* Linked list of blocks to free/cleanup. */
104
+ mem_block *freelist, *freelist_tail;
101
105
  };
102
106
 
103
- typedef struct mem_block {
104
- struct mem_block *next;
105
- size_t size;
106
- size_t used;
107
- bool owned;
108
- /* Data follows. */
109
- } mem_block;
110
-
111
- typedef struct cleanup_ent {
112
- struct cleanup_ent *next;
113
- upb_cleanup_func *cleanup;
114
- void *ud;
115
- } cleanup_ent;
107
+ static const size_t memblock_reserve = UPB_ALIGN_UP(sizeof(mem_block), 16);
116
108
 
117
- static void upb_arena_addblock(upb_arena *a, void *ptr, size_t size,
118
- bool owned) {
109
+ static void upb_arena_addblock(upb_arena *a, void *ptr, size_t size) {
119
110
  mem_block *block = ptr;
120
111
 
121
- block->next = a->block_head;
122
- block->size = size;
123
- block->used = align_up_max(sizeof(mem_block));
124
- block->owned = owned;
112
+ block->next = a->freelist;
113
+ block->size = (uint32_t)size;
114
+ block->cleanups = 0;
115
+ a->freelist = block;
116
+ a->last_size = block->size;
117
+ if (!a->freelist_tail) a->freelist_tail = block;
125
118
 
126
- a->block_head = block;
119
+ a->head.ptr = UPB_PTR_AT(block, memblock_reserve, char);
120
+ a->head.end = UPB_PTR_AT(block, size, char);
121
+ a->cleanups = &block->cleanups;
127
122
 
128
123
  /* TODO(haberman): ASAN poison. */
129
124
  }
130
125
 
131
- static mem_block *upb_arena_allocblock(upb_arena *a, size_t size) {
132
- size_t block_size = UPB_MAX(size, a->next_block_size) + sizeof(mem_block);
126
+ static bool upb_arena_allocblock(upb_arena *a, size_t size) {
127
+ size_t block_size = UPB_MAX(size, a->last_size * 2) + memblock_reserve;
133
128
  mem_block *block = upb_malloc(a->block_alloc, block_size);
134
129
 
135
- if (!block) {
136
- return NULL;
137
- }
130
+ if (!block) return false;
131
+ upb_arena_addblock(a, block, block_size);
132
+ return true;
133
+ }
138
134
 
139
- upb_arena_addblock(a, block, block_size, true);
140
- a->next_block_size = UPB_MIN(block_size * 2, a->max_block_size);
135
+ static bool arena_has(upb_arena *a, size_t size) {
136
+ _upb_arena_head *h = (_upb_arena_head*)a;
137
+ return (size_t)(h->end - h->ptr) >= size;
138
+ }
141
139
 
142
- return block;
140
+ void *_upb_arena_slowmalloc(upb_arena *a, size_t size) {
141
+ if (!upb_arena_allocblock(a, size)) return NULL; /* Out of memory. */
142
+ UPB_ASSERT(arena_has(a, size));
143
+ return upb_arena_malloc(a, size);
143
144
  }
144
145
 
145
146
  static void *upb_arena_doalloc(upb_alloc *alloc, void *ptr, size_t oldsize,
146
147
  size_t size) {
147
148
  upb_arena *a = (upb_arena*)alloc; /* upb_alloc is initial member. */
148
- mem_block *block = a->block_head;
149
- void *ret;
149
+ return upb_arena_realloc(a, ptr, oldsize, size);
150
+ }
150
151
 
151
- if (size == 0) {
152
- return NULL; /* We are an arena, don't need individual frees. */
152
+ static upb_arena *arena_findroot(upb_arena *a) {
153
+ /* Path splitting keeps time complexity down, see:
154
+ * https://en.wikipedia.org/wiki/Disjoint-set_data_structure */
155
+ while (a->parent != a) {
156
+ upb_arena *next = a->parent;
157
+ a->parent = next->parent;
158
+ a = next;
153
159
  }
160
+ return a;
161
+ }
154
162
 
155
- size = align_up_max(size);
156
-
157
- /* TODO(haberman): special-case if this is a realloc of the last alloc? */
163
+ /* Public Arena API ***********************************************************/
158
164
 
159
- if (!block || block->size - block->used < size) {
160
- /* Slow path: have to allocate a new block. */
161
- block = upb_arena_allocblock(a, size);
165
+ upb_arena *arena_initslow(void *mem, size_t n, upb_alloc *alloc) {
166
+ const size_t first_block_overhead = sizeof(upb_arena) + memblock_reserve;
167
+ upb_arena *a;
162
168
 
163
- if (!block) {
164
- return NULL; /* Out of memory. */
165
- }
169
+ /* We need to malloc the initial block. */
170
+ n = first_block_overhead + 256;
171
+ if (!alloc || !(mem = upb_malloc(alloc, n))) {
172
+ return NULL;
166
173
  }
167
174
 
168
- ret = (char*)block + block->used;
169
- block->used += size;
175
+ a = UPB_PTR_AT(mem, n - sizeof(*a), upb_arena);
176
+ n -= sizeof(*a);
170
177
 
171
- if (oldsize > 0) {
172
- memcpy(ret, ptr, oldsize); /* Preserve existing data. */
173
- }
178
+ a->head.alloc.func = &upb_arena_doalloc;
179
+ a->block_alloc = alloc;
180
+ a->parent = a;
181
+ a->refcount = 1;
182
+ a->freelist = NULL;
183
+ a->freelist_tail = NULL;
174
184
 
175
- /* TODO(haberman): ASAN unpoison. */
185
+ upb_arena_addblock(a, mem, n);
176
186
 
177
- a->bytes_allocated += size;
178
- return ret;
187
+ return a;
179
188
  }
180
189
 
181
- /* Public Arena API ***********************************************************/
182
-
183
- #define upb_alignof(type) offsetof (struct { char c; type member; }, member)
184
-
185
190
  upb_arena *upb_arena_init(void *mem, size_t n, upb_alloc *alloc) {
186
- const size_t first_block_overhead = sizeof(upb_arena) + sizeof(mem_block);
187
191
  upb_arena *a;
188
- bool owned = false;
189
192
 
190
193
  /* Round block size down to alignof(*a) since we will allocate the arena
191
194
  * itself at the end. */
192
- n &= ~(upb_alignof(upb_arena) - 1);
193
-
194
- if (n < first_block_overhead) {
195
- /* We need to malloc the initial block. */
196
- n = first_block_overhead + 256;
197
- owned = true;
198
- if (!alloc || !(mem = upb_malloc(alloc, n))) {
199
- return NULL;
200
- }
195
+ n = UPB_ALIGN_DOWN(n, UPB_ALIGN_OF(upb_arena));
196
+
197
+ if (UPB_UNLIKELY(n < sizeof(upb_arena))) {
198
+ return arena_initslow(mem, n, alloc);
201
199
  }
202
200
 
203
- a = (void*)((char*)mem + n - sizeof(*a));
201
+ a = UPB_PTR_AT(mem, n - sizeof(*a), upb_arena);
204
202
  n -= sizeof(*a);
205
203
 
206
- a->alloc.func = &upb_arena_doalloc;
207
- a->block_alloc = &upb_alloc_global;
208
- a->bytes_allocated = 0;
209
- a->next_block_size = 256;
210
- a->max_block_size = 16384;
211
- a->cleanup_head = NULL;
212
- a->block_head = NULL;
204
+ a->head.alloc.func = &upb_arena_doalloc;
213
205
  a->block_alloc = alloc;
214
-
215
- upb_arena_addblock(a, mem, n, owned);
206
+ a->parent = a;
207
+ a->refcount = 1;
208
+ a->last_size = 128;
209
+ a->head.ptr = mem;
210
+ a->head.end = UPB_PTR_AT(mem, n, char);
211
+ a->freelist = NULL;
212
+ a->cleanups = NULL;
216
213
 
217
214
  return a;
218
215
  }
219
216
 
220
- #undef upb_alignof
221
-
222
- void upb_arena_free(upb_arena *a) {
223
- cleanup_ent *ent = a->cleanup_head;
224
- mem_block *block = a->block_head;
225
-
226
- while (ent) {
227
- ent->cleanup(ent->ud);
228
- ent = ent->next;
229
- }
217
+ static void arena_dofree(upb_arena *a) {
218
+ mem_block *block = a->freelist;
219
+ UPB_ASSERT(a->parent == a);
220
+ UPB_ASSERT(a->refcount == 0);
230
221
 
231
- /* Must do this after running cleanup functions, because this will delete
232
- * the memory we store our cleanup entries in! */
233
222
  while (block) {
234
223
  /* Load first since we are deleting block. */
235
224
  mem_block *next = block->next;
236
225
 
237
- if (block->owned) {
238
- upb_free(a->block_alloc, block);
226
+ if (block->cleanups > 0) {
227
+ cleanup_ent *end = UPB_PTR_AT(block, block->size, void);
228
+ cleanup_ent *ptr = end - block->cleanups;
229
+
230
+ for (; ptr < end; ptr++) {
231
+ ptr->cleanup(ptr->ud);
232
+ }
239
233
  }
240
234
 
235
+ upb_free(a->block_alloc, block);
241
236
  block = next;
242
237
  }
243
238
  }
244
239
 
240
+ void upb_arena_free(upb_arena *a) {
241
+ a = arena_findroot(a);
242
+ if (--a->refcount == 0) arena_dofree(a);
243
+ }
244
+
245
245
  bool upb_arena_addcleanup(upb_arena *a, void *ud, upb_cleanup_func *func) {
246
- cleanup_ent *ent = upb_malloc(&a->alloc, sizeof(cleanup_ent));
247
- if (!ent) {
248
- return false; /* Out of memory. */
246
+ cleanup_ent *ent;
247
+
248
+ if (!a->cleanups || !arena_has(a, sizeof(cleanup_ent))) {
249
+ if (!upb_arena_allocblock(a, 128)) return false; /* Out of memory. */
250
+ UPB_ASSERT(arena_has(a, sizeof(cleanup_ent)));
249
251
  }
250
252
 
253
+ a->head.end -= sizeof(cleanup_ent);
254
+ ent = (cleanup_ent*)a->head.end;
255
+ (*a->cleanups)++;
256
+
251
257
  ent->cleanup = func;
252
258
  ent->ud = ud;
253
- ent->next = a->cleanup_head;
254
- a->cleanup_head = ent;
255
259
 
256
260
  return true;
257
261
  }
258
262
 
259
- size_t upb_arena_bytesallocated(const upb_arena *a) {
260
- return a->bytes_allocated;
263
+ void upb_arena_fuse(upb_arena *a1, upb_arena *a2) {
264
+ upb_arena *r1 = arena_findroot(a1);
265
+ upb_arena *r2 = arena_findroot(a2);
266
+
267
+ if (r1 == r2) return; /* Already fused. */
268
+
269
+ /* We want to join the smaller tree to the larger tree.
270
+ * So swap first if they are backwards. */
271
+ if (r1->refcount < r2->refcount) {
272
+ upb_arena *tmp = r1;
273
+ r1 = r2;
274
+ r2 = tmp;
275
+ }
276
+
277
+ /* r1 takes over r2's freelist and refcount. */
278
+ r1->refcount += r2->refcount;
279
+ if (r2->freelist_tail) {
280
+ UPB_ASSERT(r2->freelist_tail->next == NULL);
281
+ r2->freelist_tail->next = r1->freelist;
282
+ r1->freelist = r2->freelist;
283
+ }
284
+ r2->parent = r1;
261
285
  }