grpc 1.31.1 → 1.32.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 (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +595 -15723
  3. data/include/grpc/grpc_security.h +31 -14
  4. data/include/grpc/impl/codegen/README.md +22 -0
  5. data/include/grpc/impl/codegen/port_platform.h +6 -1
  6. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  7. data/src/core/ext/filters/client_channel/client_channel.cc +64 -20
  8. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -1
  11. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -3
  12. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +20 -13
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
  21. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +20 -9
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +54 -56
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  29. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  30. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +363 -14
  32. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
  33. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +5 -4
  34. data/src/core/ext/filters/client_channel/server_address.cc +40 -7
  35. data/src/core/ext/filters/client_channel/server_address.h +42 -4
  36. data/src/core/ext/filters/client_channel/subchannel.cc +64 -23
  37. data/src/core/ext/filters/client_channel/subchannel.h +16 -4
  38. data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
  39. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  40. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
  41. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -25
  43. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
  44. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
  45. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
  46. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
  47. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +239 -277
  48. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  49. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  50. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +1 -28
  52. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -5
  53. data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
  54. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
  55. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
  56. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  57. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  58. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
  59. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
  60. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
  61. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  62. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
  63. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  64. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
  65. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
  66. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
  67. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  68. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
  69. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  70. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
  71. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
  72. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  78. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  84. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  86. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  88. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  89. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  90. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  91. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  92. data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
  93. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  94. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
  95. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
  96. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
  97. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
  98. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  99. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  100. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
  101. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
  102. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  103. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  104. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
  105. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
  106. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
  107. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
  108. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  109. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
  118. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
  119. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
  120. data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
  121. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  122. data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
  123. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  124. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
  125. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
  126. data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
  127. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  128. data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
  129. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  130. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  131. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  132. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
  133. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  134. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
  135. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  136. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  137. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  138. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  139. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  140. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  141. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  142. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  143. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  144. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  145. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
  146. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  147. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  148. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  149. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  150. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  151. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  152. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
  153. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
  154. data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
  155. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  156. data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
  157. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  158. data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
  159. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  160. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  161. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  162. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
  163. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
  164. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  165. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  166. data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
  167. data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
  168. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.cc +1045 -767
  169. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +114 -99
  170. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +44 -2
  171. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
  172. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
  173. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
  174. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
  175. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +85 -417
  176. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
  177. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
  178. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +3 -3
  179. data/src/core/lib/channel/channelz.cc +14 -15
  180. data/src/core/lib/channel/channelz.h +1 -1
  181. data/src/core/lib/channel/channelz_registry.cc +3 -1
  182. data/src/core/lib/gpr/sync_posix.cc +2 -8
  183. data/src/core/lib/iomgr/endpoint.cc +5 -1
  184. data/src/core/lib/iomgr/endpoint.h +7 -3
  185. data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
  186. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  187. data/src/core/lib/iomgr/iomgr.cc +0 -10
  188. data/src/core/lib/iomgr/iomgr.h +0 -10
  189. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
  190. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
  191. data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
  192. data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
  193. data/src/core/lib/iomgr/tcp_custom.cc +32 -16
  194. data/src/core/lib/iomgr/tcp_posix.cc +31 -13
  195. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  196. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  197. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  198. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  199. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  200. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  201. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  202. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  203. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  204. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  205. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  206. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  207. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
  208. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -2
  209. data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
  210. data/src/core/lib/surface/call.cc +12 -12
  211. data/src/core/lib/surface/call.h +2 -1
  212. data/src/core/lib/surface/channel.cc +28 -20
  213. data/src/core/lib/surface/channel.h +12 -2
  214. data/src/core/lib/surface/completion_queue.cc +10 -272
  215. data/src/core/lib/surface/completion_queue.h +0 -8
  216. data/src/core/lib/surface/init.cc +1 -3
  217. data/src/core/lib/surface/server.cc +1066 -1244
  218. data/src/core/lib/surface/server.h +363 -87
  219. data/src/core/lib/surface/version.cc +2 -2
  220. data/src/core/lib/transport/authority_override.cc +38 -0
  221. data/src/core/lib/transport/authority_override.h +32 -0
  222. data/src/core/lib/transport/connectivity_state.cc +18 -13
  223. data/src/core/lib/transport/connectivity_state.h +18 -6
  224. data/src/core/lib/transport/error_utils.cc +13 -0
  225. data/src/core/lib/transport/error_utils.h +6 -0
  226. data/src/core/lib/transport/static_metadata.cc +295 -276
  227. data/src/core/lib/transport/static_metadata.h +80 -73
  228. data/src/core/lib/transport/transport.h +7 -0
  229. data/src/core/lib/uri/uri_parser.cc +23 -21
  230. data/src/core/lib/uri/uri_parser.h +3 -1
  231. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +22 -0
  232. data/src/core/tsi/ssl_transport_security.cc +3 -9
  233. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  234. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
  235. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
  236. data/src/ruby/lib/grpc/version.rb +1 -1
  237. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  238. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  239. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  240. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  241. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  242. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  243. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  244. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  245. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  246. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  247. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  248. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  249. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  250. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  251. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  252. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  253. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  254. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  255. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  256. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  257. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  258. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  259. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  260. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  261. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  262. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  263. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  264. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  265. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  266. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  267. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  268. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  269. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  270. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  271. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  272. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  273. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  274. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  275. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  276. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  277. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  278. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  279. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  280. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  281. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  282. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  283. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  284. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  285. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  286. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  287. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  288. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  289. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  290. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  291. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  292. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  293. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  294. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  295. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  296. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  297. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  298. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  299. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  300. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  301. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  302. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  303. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  304. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  305. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  306. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  307. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  308. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  309. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  310. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  311. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  312. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  313. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  314. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  315. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  316. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  317. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  318. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  319. data/third_party/boringssl-with-bazel/err_data.c +263 -257
  320. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
  321. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
  323. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
  325. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  326. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +39 -7
  327. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
  328. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +11 -0
  329. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +10 -0
  332. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
  333. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -0
  334. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  335. data/third_party/upb/upb/decode.c +64 -15
  336. data/third_party/upb/upb/encode.c +2 -2
  337. data/third_party/upb/upb/msg.h +2 -2
  338. data/third_party/upb/upb/port_def.inc +1 -1
  339. data/third_party/upb/upb/table.c +0 -11
  340. data/third_party/upb/upb/table.int.h +0 -9
  341. data/third_party/upb/upb/upb.c +16 -14
  342. data/third_party/upb/upb/upb.h +26 -0
  343. data/third_party/upb/upb/upb.hpp +2 -0
  344. metadata +257 -155
  345. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  346. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
  347. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  348. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
  349. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  350. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
  351. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  352. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
  353. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
  354. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  355. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
  356. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  357. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
  358. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  359. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
  360. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  361. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
  362. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
  363. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  364. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
  365. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  366. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
  367. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  368. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
  369. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  370. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
  371. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  372. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
  373. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  374. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  375. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
  376. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
  377. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  378. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
  379. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
  380. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  381. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
  382. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  383. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
  384. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  385. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
  386. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  387. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
  388. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
  389. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  390. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
  391. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  392. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
  393. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  394. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
  395. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  396. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
  397. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
  398. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  399. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
  400. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  401. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
  402. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  403. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
  404. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  405. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
  406. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
  407. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  408. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
  409. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  410. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
  411. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  412. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  413. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  414. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
  415. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  416. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
  417. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  418. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
  419. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  420. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  421. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  422. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  423. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
  424. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
  425. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
  426. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  427. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
  428. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  429. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  430. data/src/core/lib/slice/slice_hash_table.h +0 -199
  431. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
@@ -0,0 +1,194 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ // Allow dynamic symbol lookup in the kernel VDSO page.
16
+ //
17
+ // VDSOSupport -- a class representing kernel VDSO (if present).
18
+
19
+ #include "absl/debugging/internal/vdso_support.h"
20
+
21
+ #ifdef ABSL_HAVE_VDSO_SUPPORT // defined in vdso_support.h
22
+
23
+ #include <errno.h>
24
+ #include <fcntl.h>
25
+ #include <sys/syscall.h>
26
+ #include <unistd.h>
27
+
28
+ #if __GLIBC_PREREQ(2, 16) // GLIBC-2.16 implements getauxval.
29
+ #include <sys/auxv.h>
30
+ #endif
31
+
32
+ #include "absl/base/dynamic_annotations.h"
33
+ #include "absl/base/internal/raw_logging.h"
34
+ #include "absl/base/port.h"
35
+
36
+ #ifndef AT_SYSINFO_EHDR
37
+ #define AT_SYSINFO_EHDR 33 // for crosstoolv10
38
+ #endif
39
+
40
+ namespace absl {
41
+ ABSL_NAMESPACE_BEGIN
42
+ namespace debugging_internal {
43
+
44
+ ABSL_CONST_INIT
45
+ std::atomic<const void *> VDSOSupport::vdso_base_(
46
+ debugging_internal::ElfMemImage::kInvalidBase);
47
+
48
+ std::atomic<VDSOSupport::GetCpuFn> VDSOSupport::getcpu_fn_(&InitAndGetCPU);
49
+ VDSOSupport::VDSOSupport()
50
+ // If vdso_base_ is still set to kInvalidBase, we got here
51
+ // before VDSOSupport::Init has been called. Call it now.
52
+ : image_(vdso_base_.load(std::memory_order_relaxed) ==
53
+ debugging_internal::ElfMemImage::kInvalidBase
54
+ ? Init()
55
+ : vdso_base_.load(std::memory_order_relaxed)) {}
56
+
57
+ // NOTE: we can't use GoogleOnceInit() below, because we can be
58
+ // called by tcmalloc, and none of the *once* stuff may be functional yet.
59
+ //
60
+ // In addition, we hope that the VDSOSupportHelper constructor
61
+ // causes this code to run before there are any threads, and before
62
+ // InitGoogle() has executed any chroot or setuid calls.
63
+ //
64
+ // Finally, even if there is a race here, it is harmless, because
65
+ // the operation should be idempotent.
66
+ const void *VDSOSupport::Init() {
67
+ const auto kInvalidBase = debugging_internal::ElfMemImage::kInvalidBase;
68
+ #if __GLIBC_PREREQ(2, 16)
69
+ if (vdso_base_.load(std::memory_order_relaxed) == kInvalidBase) {
70
+ errno = 0;
71
+ const void *const sysinfo_ehdr =
72
+ reinterpret_cast<const void *>(getauxval(AT_SYSINFO_EHDR));
73
+ if (errno == 0) {
74
+ vdso_base_.store(sysinfo_ehdr, std::memory_order_relaxed);
75
+ }
76
+ }
77
+ #endif // __GLIBC_PREREQ(2, 16)
78
+ if (vdso_base_.load(std::memory_order_relaxed) == kInvalidBase) {
79
+ // Valgrind zaps AT_SYSINFO_EHDR and friends from the auxv[]
80
+ // on stack, and so glibc works as if VDSO was not present.
81
+ // But going directly to kernel via /proc/self/auxv below bypasses
82
+ // Valgrind zapping. So we check for Valgrind separately.
83
+ if (RunningOnValgrind()) {
84
+ vdso_base_.store(nullptr, std::memory_order_relaxed);
85
+ getcpu_fn_.store(&GetCPUViaSyscall, std::memory_order_relaxed);
86
+ return nullptr;
87
+ }
88
+ int fd = open("/proc/self/auxv", O_RDONLY);
89
+ if (fd == -1) {
90
+ // Kernel too old to have a VDSO.
91
+ vdso_base_.store(nullptr, std::memory_order_relaxed);
92
+ getcpu_fn_.store(&GetCPUViaSyscall, std::memory_order_relaxed);
93
+ return nullptr;
94
+ }
95
+ ElfW(auxv_t) aux;
96
+ while (read(fd, &aux, sizeof(aux)) == sizeof(aux)) {
97
+ if (aux.a_type == AT_SYSINFO_EHDR) {
98
+ vdso_base_.store(reinterpret_cast<void *>(aux.a_un.a_val),
99
+ std::memory_order_relaxed);
100
+ break;
101
+ }
102
+ }
103
+ close(fd);
104
+ if (vdso_base_.load(std::memory_order_relaxed) == kInvalidBase) {
105
+ // Didn't find AT_SYSINFO_EHDR in auxv[].
106
+ vdso_base_.store(nullptr, std::memory_order_relaxed);
107
+ }
108
+ }
109
+ GetCpuFn fn = &GetCPUViaSyscall; // default if VDSO not present.
110
+ if (vdso_base_.load(std::memory_order_relaxed)) {
111
+ VDSOSupport vdso;
112
+ SymbolInfo info;
113
+ if (vdso.LookupSymbol("__vdso_getcpu", "LINUX_2.6", STT_FUNC, &info)) {
114
+ fn = reinterpret_cast<GetCpuFn>(const_cast<void *>(info.address));
115
+ }
116
+ }
117
+ // Subtle: this code runs outside of any locks; prevent compiler
118
+ // from assigning to getcpu_fn_ more than once.
119
+ getcpu_fn_.store(fn, std::memory_order_relaxed);
120
+ return vdso_base_.load(std::memory_order_relaxed);
121
+ }
122
+
123
+ const void *VDSOSupport::SetBase(const void *base) {
124
+ ABSL_RAW_CHECK(base != debugging_internal::ElfMemImage::kInvalidBase,
125
+ "internal error");
126
+ const void *old_base = vdso_base_.load(std::memory_order_relaxed);
127
+ vdso_base_.store(base, std::memory_order_relaxed);
128
+ image_.Init(base);
129
+ // Also reset getcpu_fn_, so GetCPU could be tested with simulated VDSO.
130
+ getcpu_fn_.store(&InitAndGetCPU, std::memory_order_relaxed);
131
+ return old_base;
132
+ }
133
+
134
+ bool VDSOSupport::LookupSymbol(const char *name,
135
+ const char *version,
136
+ int type,
137
+ SymbolInfo *info) const {
138
+ return image_.LookupSymbol(name, version, type, info);
139
+ }
140
+
141
+ bool VDSOSupport::LookupSymbolByAddress(const void *address,
142
+ SymbolInfo *info_out) const {
143
+ return image_.LookupSymbolByAddress(address, info_out);
144
+ }
145
+
146
+ // NOLINT on 'long' because this routine mimics kernel api.
147
+ long VDSOSupport::GetCPUViaSyscall(unsigned *cpu, // NOLINT(runtime/int)
148
+ void *, void *) {
149
+ #ifdef SYS_getcpu
150
+ return syscall(SYS_getcpu, cpu, nullptr, nullptr);
151
+ #else
152
+ // x86_64 never implemented sys_getcpu(), except as a VDSO call.
153
+ static_cast<void>(cpu); // Avoid an unused argument compiler warning.
154
+ errno = ENOSYS;
155
+ return -1;
156
+ #endif
157
+ }
158
+
159
+ // Use fast __vdso_getcpu if available.
160
+ long VDSOSupport::InitAndGetCPU(unsigned *cpu, // NOLINT(runtime/int)
161
+ void *x, void *y) {
162
+ Init();
163
+ GetCpuFn fn = getcpu_fn_.load(std::memory_order_relaxed);
164
+ ABSL_RAW_CHECK(fn != &InitAndGetCPU, "Init() did not set getcpu_fn_");
165
+ return (*fn)(cpu, x, y);
166
+ }
167
+
168
+ // This function must be very fast, and may be called from very
169
+ // low level (e.g. tcmalloc). Hence I avoid things like
170
+ // GoogleOnceInit() and ::operator new.
171
+ ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY
172
+ int GetCPU() {
173
+ unsigned cpu;
174
+ int ret_code = (*VDSOSupport::getcpu_fn_)(&cpu, nullptr, nullptr);
175
+ return ret_code == 0 ? cpu : ret_code;
176
+ }
177
+
178
+ // We need to make sure VDSOSupport::Init() is called before
179
+ // InitGoogle() does any setuid or chroot calls. If VDSOSupport
180
+ // is used in any global constructor, this will happen, since
181
+ // VDSOSupport's constructor calls Init. But if not, we need to
182
+ // ensure it here, with a global constructor of our own. This
183
+ // is an allowed exception to the normal rule against non-trivial
184
+ // global constructors.
185
+ static class VDSOInitHelper {
186
+ public:
187
+ VDSOInitHelper() { VDSOSupport::Init(); }
188
+ } vdso_init_helper;
189
+
190
+ } // namespace debugging_internal
191
+ ABSL_NAMESPACE_END
192
+ } // namespace absl
193
+
194
+ #endif // ABSL_HAVE_VDSO_SUPPORT
@@ -0,0 +1,158 @@
1
+ //
2
+ // Copyright 2017 The Abseil Authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ // Allow dynamic symbol lookup in the kernel VDSO page.
18
+ //
19
+ // VDSO stands for "Virtual Dynamic Shared Object" -- a page of
20
+ // executable code, which looks like a shared library, but doesn't
21
+ // necessarily exist anywhere on disk, and which gets mmap()ed into
22
+ // every process by kernels which support VDSO, such as 2.6.x for 32-bit
23
+ // executables, and 2.6.24 and above for 64-bit executables.
24
+ //
25
+ // More details could be found here:
26
+ // http://www.trilithium.com/johan/2005/08/linux-gate/
27
+ //
28
+ // VDSOSupport -- a class representing kernel VDSO (if present).
29
+ //
30
+ // Example usage:
31
+ // VDSOSupport vdso;
32
+ // VDSOSupport::SymbolInfo info;
33
+ // typedef (*FN)(unsigned *, void *, void *);
34
+ // FN fn = nullptr;
35
+ // if (vdso.LookupSymbol("__vdso_getcpu", "LINUX_2.6", STT_FUNC, &info)) {
36
+ // fn = reinterpret_cast<FN>(info.address);
37
+ // }
38
+
39
+ #ifndef ABSL_DEBUGGING_INTERNAL_VDSO_SUPPORT_H_
40
+ #define ABSL_DEBUGGING_INTERNAL_VDSO_SUPPORT_H_
41
+
42
+ #include <atomic>
43
+
44
+ #include "absl/base/attributes.h"
45
+ #include "absl/debugging/internal/elf_mem_image.h"
46
+
47
+ #ifdef ABSL_HAVE_ELF_MEM_IMAGE
48
+
49
+ #ifdef ABSL_HAVE_VDSO_SUPPORT
50
+ #error ABSL_HAVE_VDSO_SUPPORT cannot be directly set
51
+ #else
52
+ #define ABSL_HAVE_VDSO_SUPPORT 1
53
+ #endif
54
+
55
+ namespace absl {
56
+ ABSL_NAMESPACE_BEGIN
57
+ namespace debugging_internal {
58
+
59
+ // NOTE: this class may be used from within tcmalloc, and can not
60
+ // use any memory allocation routines.
61
+ class VDSOSupport {
62
+ public:
63
+ VDSOSupport();
64
+
65
+ typedef ElfMemImage::SymbolInfo SymbolInfo;
66
+ typedef ElfMemImage::SymbolIterator SymbolIterator;
67
+
68
+ // On PowerPC64 VDSO symbols can either be of type STT_FUNC or STT_NOTYPE
69
+ // depending on how the kernel is built. The kernel is normally built with
70
+ // STT_NOTYPE type VDSO symbols. Let's make things simpler first by using a
71
+ // compile-time constant.
72
+ #ifdef __powerpc64__
73
+ enum { kVDSOSymbolType = STT_NOTYPE };
74
+ #else
75
+ enum { kVDSOSymbolType = STT_FUNC };
76
+ #endif
77
+
78
+ // Answers whether we have a vdso at all.
79
+ bool IsPresent() const { return image_.IsPresent(); }
80
+
81
+ // Allow to iterate over all VDSO symbols.
82
+ SymbolIterator begin() const { return image_.begin(); }
83
+ SymbolIterator end() const { return image_.end(); }
84
+
85
+ // Look up versioned dynamic symbol in the kernel VDSO.
86
+ // Returns false if VDSO is not present, or doesn't contain given
87
+ // symbol/version/type combination.
88
+ // If info_out != nullptr, additional details are filled in.
89
+ bool LookupSymbol(const char *name, const char *version,
90
+ int symbol_type, SymbolInfo *info_out) const;
91
+
92
+ // Find info about symbol (if any) which overlaps given address.
93
+ // Returns true if symbol was found; false if VDSO isn't present
94
+ // or doesn't have a symbol overlapping given address.
95
+ // If info_out != nullptr, additional details are filled in.
96
+ bool LookupSymbolByAddress(const void *address, SymbolInfo *info_out) const;
97
+
98
+ // Used only for testing. Replace real VDSO base with a mock.
99
+ // Returns previous value of vdso_base_. After you are done testing,
100
+ // you are expected to call SetBase() with previous value, in order to
101
+ // reset state to the way it was.
102
+ const void *SetBase(const void *s);
103
+
104
+ // Computes vdso_base_ and returns it. Should be called as early as
105
+ // possible; before any thread creation, chroot or setuid.
106
+ static const void *Init();
107
+
108
+ private:
109
+ // image_ represents VDSO ELF image in memory.
110
+ // image_.ehdr_ == nullptr implies there is no VDSO.
111
+ ElfMemImage image_;
112
+
113
+ // Cached value of auxv AT_SYSINFO_EHDR, computed once.
114
+ // This is a tri-state:
115
+ // kInvalidBase => value hasn't been determined yet.
116
+ // 0 => there is no VDSO.
117
+ // else => vma of VDSO Elf{32,64}_Ehdr.
118
+ //
119
+ // When testing with mock VDSO, low bit is set.
120
+ // The low bit is always available because vdso_base_ is
121
+ // page-aligned.
122
+ static std::atomic<const void *> vdso_base_;
123
+
124
+ // NOLINT on 'long' because these routines mimic kernel api.
125
+ // The 'cache' parameter may be used by some versions of the kernel,
126
+ // and should be nullptr or point to a static buffer containing at
127
+ // least two 'long's.
128
+ static long InitAndGetCPU(unsigned *cpu, void *cache, // NOLINT 'long'.
129
+ void *unused);
130
+ static long GetCPUViaSyscall(unsigned *cpu, void *cache, // NOLINT 'long'.
131
+ void *unused);
132
+ typedef long (*GetCpuFn)(unsigned *cpu, void *cache, // NOLINT 'long'.
133
+ void *unused);
134
+
135
+ // This function pointer may point to InitAndGetCPU,
136
+ // GetCPUViaSyscall, or __vdso_getcpu at different stages of initialization.
137
+ ABSL_CONST_INIT static std::atomic<GetCpuFn> getcpu_fn_;
138
+
139
+ friend int GetCPU(void); // Needs access to getcpu_fn_.
140
+
141
+ VDSOSupport(const VDSOSupport&) = delete;
142
+ VDSOSupport& operator=(const VDSOSupport&) = delete;
143
+ };
144
+
145
+ // Same as sched_getcpu() on later glibc versions.
146
+ // Return current CPU, using (fast) __vdso_getcpu@LINUX_2.6 if present,
147
+ // otherwise use syscall(SYS_getcpu,...).
148
+ // May return -1 with errno == ENOSYS if the kernel doesn't
149
+ // support SYS_getcpu.
150
+ int GetCPU();
151
+
152
+ } // namespace debugging_internal
153
+ ABSL_NAMESPACE_END
154
+ } // namespace absl
155
+
156
+ #endif // ABSL_HAVE_ELF_MEM_IMAGE
157
+
158
+ #endif // ABSL_DEBUGGING_INTERNAL_VDSO_SUPPORT_H_
@@ -0,0 +1,140 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ // Produce stack trace.
16
+ //
17
+ // There are three different ways we can try to get the stack trace:
18
+ //
19
+ // 1) Our hand-coded stack-unwinder. This depends on a certain stack
20
+ // layout, which is used by gcc (and those systems using a
21
+ // gcc-compatible ABI) on x86 systems, at least since gcc 2.95.
22
+ // It uses the frame pointer to do its work.
23
+ //
24
+ // 2) The libunwind library. This is still in development, and as a
25
+ // separate library adds a new dependency, but doesn't need a frame
26
+ // pointer. It also doesn't call malloc.
27
+ //
28
+ // 3) The gdb unwinder -- also the one used by the c++ exception code.
29
+ // It's obviously well-tested, but has a fatal flaw: it can call
30
+ // malloc() from the unwinder. This is a problem because we're
31
+ // trying to use the unwinder to instrument malloc().
32
+ //
33
+ // Note: if you add a new implementation here, make sure it works
34
+ // correctly when absl::GetStackTrace() is called with max_depth == 0.
35
+ // Some code may do that.
36
+
37
+ #include "absl/debugging/stacktrace.h"
38
+
39
+ #include <atomic>
40
+
41
+ #include "absl/base/attributes.h"
42
+ #include "absl/base/port.h"
43
+ #include "absl/debugging/internal/stacktrace_config.h"
44
+
45
+ #if defined(ABSL_STACKTRACE_INL_HEADER)
46
+ #include ABSL_STACKTRACE_INL_HEADER
47
+ #else
48
+ # error Cannot calculate stack trace: will need to write for your environment
49
+
50
+ # include "absl/debugging/internal/stacktrace_aarch64-inl.inc"
51
+ # include "absl/debugging/internal/stacktrace_arm-inl.inc"
52
+ # include "absl/debugging/internal/stacktrace_generic-inl.inc"
53
+ # include "absl/debugging/internal/stacktrace_powerpc-inl.inc"
54
+ # include "absl/debugging/internal/stacktrace_unimplemented-inl.inc"
55
+ # include "absl/debugging/internal/stacktrace_win32-inl.inc"
56
+ # include "absl/debugging/internal/stacktrace_x86-inl.inc"
57
+ #endif
58
+
59
+ namespace absl {
60
+ ABSL_NAMESPACE_BEGIN
61
+ namespace {
62
+
63
+ typedef int (*Unwinder)(void**, int*, int, int, const void*, int*);
64
+ std::atomic<Unwinder> custom;
65
+
66
+ template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
67
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, int* sizes,
68
+ int max_depth, int skip_count,
69
+ const void* uc,
70
+ int* min_dropped_frames) {
71
+ Unwinder f = &UnwindImpl<IS_STACK_FRAMES, IS_WITH_CONTEXT>;
72
+ Unwinder g = custom.load(std::memory_order_acquire);
73
+ if (g != nullptr) f = g;
74
+
75
+ // Add 1 to skip count for the unwinder function itself
76
+ int size = (*f)(result, sizes, max_depth, skip_count + 1, uc,
77
+ min_dropped_frames);
78
+ // To disable tail call to (*f)(...)
79
+ ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
80
+ return size;
81
+ }
82
+
83
+ } // anonymous namespace
84
+
85
+ ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int GetStackFrames(
86
+ void** result, int* sizes, int max_depth, int skip_count) {
87
+ return Unwind<true, false>(result, sizes, max_depth, skip_count, nullptr,
88
+ nullptr);
89
+ }
90
+
91
+ ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int
92
+ GetStackFramesWithContext(void** result, int* sizes, int max_depth,
93
+ int skip_count, const void* uc,
94
+ int* min_dropped_frames) {
95
+ return Unwind<true, true>(result, sizes, max_depth, skip_count, uc,
96
+ min_dropped_frames);
97
+ }
98
+
99
+ ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int GetStackTrace(
100
+ void** result, int max_depth, int skip_count) {
101
+ return Unwind<false, false>(result, nullptr, max_depth, skip_count, nullptr,
102
+ nullptr);
103
+ }
104
+
105
+ ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int
106
+ GetStackTraceWithContext(void** result, int max_depth, int skip_count,
107
+ const void* uc, int* min_dropped_frames) {
108
+ return Unwind<false, true>(result, nullptr, max_depth, skip_count, uc,
109
+ min_dropped_frames);
110
+ }
111
+
112
+ void SetStackUnwinder(Unwinder w) {
113
+ custom.store(w, std::memory_order_release);
114
+ }
115
+
116
+ int DefaultStackUnwinder(void** pcs, int* sizes, int depth, int skip,
117
+ const void* uc, int* min_dropped_frames) {
118
+ skip++; // For this function
119
+ Unwinder f = nullptr;
120
+ if (sizes == nullptr) {
121
+ if (uc == nullptr) {
122
+ f = &UnwindImpl<false, false>;
123
+ } else {
124
+ f = &UnwindImpl<false, true>;
125
+ }
126
+ } else {
127
+ if (uc == nullptr) {
128
+ f = &UnwindImpl<true, false>;
129
+ } else {
130
+ f = &UnwindImpl<true, true>;
131
+ }
132
+ }
133
+ volatile int x = 0;
134
+ int n = (*f)(pcs, sizes, depth, skip, uc, min_dropped_frames);
135
+ x = 1; (void) x; // To disable tail call to (*f)(...)
136
+ return n;
137
+ }
138
+
139
+ ABSL_NAMESPACE_END
140
+ } // namespace absl