grpc 1.23.1 → 1.24.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 (245) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +757 -477
  3. data/include/grpc/grpc.h +3 -1
  4. data/include/grpc/grpc_security.h +20 -4
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -5
  6. data/include/grpc/impl/codegen/port_platform.h +25 -0
  7. data/src/core/ext/filters/client_channel/backend_metric.cc +78 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.h +36 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +16 -2
  10. data/src/core/ext/filters/client_channel/client_channel.cc +325 -267
  11. data/src/core/ext/filters/client_channel/client_channel_factory.h +0 -4
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +23 -32
  13. data/src/core/ext/filters/client_channel/http_proxy.cc +7 -3
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy.h +58 -34
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -50
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +9 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +35 -17
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +130 -215
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +34 -21
  21. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1120 -802
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +8 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +33 -12
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +151 -40
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +184 -26
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +389 -245
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +98 -60
  28. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -1
  29. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -0
  30. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +3 -8
  31. data/src/core/ext/filters/client_channel/server_address.cc +1 -3
  32. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  33. data/src/core/ext/filters/client_channel/subchannel.h +2 -1
  34. data/src/core/ext/filters/client_idle/client_idle_filter.cc +207 -29
  35. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -8
  36. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  37. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +10 -7
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +52 -26
  39. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -20
  40. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +24 -21
  41. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  42. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -24
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  44. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +237 -191
  45. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +29 -27
  46. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -1
  47. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +19 -4
  48. data/src/core/ext/transport/chttp2/transport/hpack_table.h +13 -4
  49. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -1
  50. data/src/core/ext/transport/chttp2/transport/internal.h +0 -2
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +99 -71
  52. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +222 -0
  53. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +818 -0
  54. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +314 -0
  55. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1142 -0
  56. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +53 -0
  57. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +158 -0
  58. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +34 -0
  59. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +69 -0
  60. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +49 -0
  61. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +240 -0
  62. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +110 -0
  63. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +324 -0
  64. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +235 -0
  65. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +661 -0
  66. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +84 -0
  67. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +274 -0
  68. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +175 -0
  69. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +572 -0
  70. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +150 -0
  71. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +596 -0
  72. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +35 -0
  73. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +80 -0
  74. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +95 -0
  75. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +308 -0
  76. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +128 -0
  77. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +392 -0
  78. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +91 -0
  79. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +236 -0
  80. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +88 -0
  81. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +258 -0
  82. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +111 -0
  83. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +324 -0
  84. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +23 -0
  85. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +50 -0
  86. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +52 -0
  87. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +130 -0
  88. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +39 -0
  89. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +87 -0
  90. data/src/core/ext/upb-generated/envoy/type/range.upb.c +39 -0
  91. data/src/core/ext/upb-generated/envoy/type/range.upb.h +85 -0
  92. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +17 -0
  93. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +30 -0
  94. data/src/core/ext/upb-generated/google/api/annotations.upb.c +18 -0
  95. data/src/core/ext/upb-generated/google/api/annotations.upb.h +30 -0
  96. data/src/core/ext/upb-generated/google/api/http.upb.c +66 -0
  97. data/src/core/ext/upb-generated/google/api/http.upb.h +190 -0
  98. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +27 -0
  99. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +58 -0
  100. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +485 -0
  101. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1690 -0
  102. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +27 -0
  103. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +58 -0
  104. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +22 -0
  105. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +50 -0
  106. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +79 -0
  107. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +215 -0
  108. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +27 -0
  109. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +58 -0
  110. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +106 -0
  111. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +238 -0
  112. data/src/core/ext/upb-generated/google/rpc/status.upb.c +33 -0
  113. data/src/core/ext/upb-generated/google/rpc/status.upb.h +74 -0
  114. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +49 -0
  115. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +126 -0
  116. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +209 -0
  117. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +681 -0
  118. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +42 -0
  119. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +109 -0
  120. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +36 -0
  121. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +84 -0
  122. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +133 -0
  123. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +359 -0
  124. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +58 -0
  125. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +144 -0
  126. data/src/core/ext/upb-generated/validate/validate.upb.c +443 -0
  127. data/src/core/ext/upb-generated/validate/validate.upb.h +2037 -0
  128. data/src/core/lib/channel/channel_args.cc +21 -0
  129. data/src/core/lib/channel/channel_args.h +16 -2
  130. data/src/core/lib/channel/channel_stack.h +2 -1
  131. data/src/core/lib/channel/channelz.cc +54 -56
  132. data/src/core/lib/channel/channelz.h +29 -12
  133. data/src/core/lib/compression/compression.cc +2 -1
  134. data/src/core/lib/compression/compression_internal.h +8 -0
  135. data/src/core/lib/gpr/log_linux.cc +2 -2
  136. data/src/core/lib/gpr/log_posix.cc +2 -2
  137. data/src/core/lib/gpr/time_precise.cc +123 -36
  138. data/src/core/lib/gpr/time_precise.h +37 -0
  139. data/src/core/lib/gprpp/abstract.h +10 -0
  140. data/src/core/lib/gprpp/atomic.h +4 -0
  141. data/src/core/lib/gprpp/inlined_vector.h +20 -4
  142. data/src/core/lib/gprpp/map.h +109 -6
  143. data/src/core/lib/gprpp/memory.h +6 -0
  144. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  145. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -54
  146. data/src/core/lib/iomgr/exec_ctx.cc +27 -17
  147. data/src/core/lib/iomgr/exec_ctx.h +3 -0
  148. data/src/core/lib/iomgr/sockaddr_utils.cc +1 -3
  149. data/src/core/lib/iomgr/tcp_posix.cc +16 -25
  150. data/src/core/lib/iomgr/tcp_server_custom.cc +1 -1
  151. data/src/core/lib/iomgr/timer_manager.cc +8 -1
  152. data/src/core/lib/iomgr/timer_manager.h +2 -0
  153. data/src/core/lib/security/credentials/credentials.h +8 -2
  154. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -0
  155. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -0
  156. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +3 -3
  157. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -12
  158. data/src/core/lib/security/security_connector/ssl_utils.h +10 -6
  159. data/src/core/lib/security/security_connector/ssl_utils_config.cc +32 -0
  160. data/src/core/lib/security/security_connector/ssl_utils_config.h +30 -0
  161. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +161 -49
  162. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +34 -1
  163. data/src/core/lib/slice/slice_intern.cc +17 -9
  164. data/src/core/lib/slice/slice_internal.h +34 -7
  165. data/src/core/lib/slice/slice_utils.h +7 -3
  166. data/src/core/lib/surface/call.cc +97 -57
  167. data/src/core/lib/surface/channel.cc +2 -2
  168. data/src/core/lib/surface/completion_queue.cc +10 -16
  169. data/src/core/lib/surface/init.cc +3 -0
  170. data/src/core/lib/surface/server.cc +11 -14
  171. data/src/core/lib/surface/validate_metadata.cc +4 -0
  172. data/src/core/lib/surface/version.cc +2 -2
  173. data/src/core/lib/transport/metadata.cc +4 -4
  174. data/src/core/lib/transport/metadata_batch.cc +72 -16
  175. data/src/core/lib/transport/metadata_batch.h +38 -0
  176. data/src/core/lib/transport/static_metadata.cc +814 -1023
  177. data/src/core/lib/transport/static_metadata.h +271 -213
  178. data/src/core/lib/transport/transport.h +12 -0
  179. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  180. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +104 -76
  181. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -16
  182. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
  183. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +10 -6
  184. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +4 -3
  185. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +74 -48
  186. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +34 -26
  187. data/src/core/tsi/ssl_transport_security.cc +14 -6
  188. data/src/core/tsi/ssl_transport_security.h +4 -0
  189. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  190. data/src/ruby/ext/grpc/ext-export.gcc +6 -0
  191. data/src/ruby/ext/grpc/extconf.rb +5 -0
  192. data/src/ruby/ext/grpc/rb_enable_cpp.cc +22 -0
  193. data/src/ruby/ext/grpc/rb_grpc.c +1 -42
  194. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  195. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  196. data/src/ruby/lib/grpc.rb +2 -0
  197. data/src/ruby/lib/grpc/core/status_codes.rb +135 -0
  198. data/src/ruby/lib/grpc/errors.rb +4 -7
  199. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +9 -4
  200. data/src/ruby/lib/grpc/structs.rb +15 -0
  201. data/src/ruby/lib/grpc/version.rb +1 -1
  202. data/src/ruby/spec/errors_spec.rb +1 -0
  203. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto +22 -0
  204. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +34 -0
  205. data/src/ruby/spec/pb/codegen/package_option_spec.rb +53 -29
  206. data/third_party/upb/upb/decode.c +604 -0
  207. data/third_party/upb/upb/decode.h +21 -0
  208. data/third_party/upb/upb/encode.c +378 -0
  209. data/third_party/upb/upb/encode.h +21 -0
  210. data/third_party/upb/upb/generated_util.h +105 -0
  211. data/third_party/upb/upb/msg.c +111 -0
  212. data/third_party/upb/upb/msg.h +69 -0
  213. data/third_party/upb/upb/port.c +27 -0
  214. data/third_party/upb/upb/port_def.inc +152 -0
  215. data/third_party/upb/upb/port_undef.inc +21 -0
  216. data/third_party/upb/upb/table.c +911 -0
  217. data/third_party/upb/upb/table.int.h +507 -0
  218. data/third_party/upb/upb/upb.c +261 -0
  219. data/third_party/upb/upb/upb.h +364 -0
  220. metadata +134 -55
  221. data/src/core/ext/filters/client_channel/health/health.pb.c +0 -23
  222. data/src/core/ext/filters/client_channel/health/health.pb.h +0 -73
  223. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +0 -19
  224. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +0 -54
  225. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +0 -19
  226. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +0 -54
  227. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +0 -89
  228. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -164
  229. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +0 -520
  230. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +0 -323
  231. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +0 -145
  232. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +0 -149
  233. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -47
  234. data/src/core/tsi/alts/handshaker/altscontext.pb.h +0 -63
  235. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -122
  236. data/src/core/tsi/alts/handshaker/handshaker.pb.h +0 -254
  237. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -49
  238. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +0 -78
  239. data/third_party/nanopb/pb.h +0 -579
  240. data/third_party/nanopb/pb_common.c +0 -97
  241. data/third_party/nanopb/pb_common.h +0 -42
  242. data/third_party/nanopb/pb_decode.c +0 -1347
  243. data/third_party/nanopb/pb_decode.h +0 -149
  244. data/third_party/nanopb/pb_encode.c +0 -696
  245. data/third_party/nanopb/pb_encode.h +0 -154
@@ -21,9 +21,46 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <grpc/impl/codegen/gpr_types.h>
24
25
  #include <grpc/support/time.h>
25
26
 
27
+ // Depending on the platform gpr_get_cycle_counter() can have a resolution as
28
+ // low as a usec. Use other clock sources or gpr_precise_clock_now(),
29
+ // where you need high resolution clocks.
30
+ //
31
+ // Using gpr_get_cycle_counter() is preferred to using ExecCtx::Get()->Now()
32
+ // whenever possible.
33
+
34
+ #if GPR_CYCLE_COUNTER_RDTSC_32
35
+ typedef int64_t gpr_cycle_counter;
36
+ inline gpr_cycle_counter gpr_get_cycle_counter() {
37
+ int64_t ret;
38
+ __asm__ volatile("rdtsc" : "=A"(ret));
39
+ return ret;
40
+ }
41
+ #elif GPR_CYCLE_COUNTER_RDTSC_64
42
+ typedef int64_t gpr_cycle_counter;
43
+ inline gpr_cycle_counter gpr_get_cycle_counter() {
44
+ uint64_t low, high;
45
+ __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
46
+ return (high << 32) | low;
47
+ }
48
+ #elif GPR_CYCLE_COUNTER_FALLBACK
49
+ // TODO(soheil): add support for mrs on Arm.
50
+
51
+ // Real time in micros.
52
+ typedef double gpr_cycle_counter;
53
+ gpr_cycle_counter gpr_get_cycle_counter();
54
+ #else
55
+ #error Must define exactly one of \
56
+ GPR_CYCLE_COUNTER_RDTSC_32, \
57
+ GPR_CYCLE_COUNTER_RDTSC_64, or \
58
+ GPR_CYCLE_COUNTER_FALLBACK
59
+ #endif
60
+
26
61
  void gpr_precise_clock_init(void);
27
62
  void gpr_precise_clock_now(gpr_timespec* clk);
63
+ gpr_timespec gpr_cycle_counter_to_time(gpr_cycle_counter cycles);
64
+ gpr_timespec gpr_cycle_counter_sub(gpr_cycle_counter a, gpr_cycle_counter b);
28
65
 
29
66
  #endif /* GRPC_CORE_LIB_GPR_TIME_PRECISE_H */
@@ -19,6 +19,14 @@
19
19
  #ifndef GRPC_CORE_LIB_GPRPP_ABSTRACT_H
20
20
  #define GRPC_CORE_LIB_GPRPP_ABSTRACT_H
21
21
 
22
+ #if GRPC_USE_CPP_STD_LIB
23
+
24
+ #define GRPC_ABSTRACT_BASE_CLASS
25
+
26
+ #define GRPC_ABSTRACT = 0
27
+
28
+ #else
29
+
22
30
  // This is needed to support abstract base classes in the c core. Since gRPC
23
31
  // doesn't have a c++ runtime, it will hit a linker error on delete unless
24
32
  // we define a virtual operator delete. See this blog for more info:
@@ -34,4 +42,6 @@
34
42
  GPR_ASSERT(false); \
35
43
  }
36
44
 
45
+ #endif // GRPC_USE_CPP_STD_LIB
46
+
37
47
  #endif /* GRPC_CORE_LIB_GPRPP_ABSTRACT_H */
@@ -49,6 +49,10 @@ class Atomic {
49
49
  storage_.store(val, static_cast<std::memory_order>(order));
50
50
  }
51
51
 
52
+ T Exchange(T desired, MemoryOrder order) {
53
+ return storage_.exchange(desired, static_cast<std::memory_order>(order));
54
+ }
55
+
52
56
  bool CompareExchangeWeak(T* expected, T desired, MemoryOrder success,
53
57
  MemoryOrder failure) {
54
58
  return GPR_ATM_INC_CAS_THEN(storage_.compare_exchange_weak(
@@ -100,16 +100,22 @@ class InlinedVector {
100
100
  bool operator==(const InlinedVector& other) const {
101
101
  if (size_ != other.size_) return false;
102
102
  for (size_t i = 0; i < size_; ++i) {
103
- if (data()[i] != other.data()[i]) return false;
103
+ // Note that this uses == instead of != so that the data class doesn't
104
+ // have to implement !=.
105
+ if (!(data()[i] == other.data()[i])) return false;
104
106
  }
105
107
  return true;
106
108
  }
107
109
 
108
110
  void reserve(size_t capacity) {
109
111
  if (capacity > capacity_) {
110
- T* new_dynamic = static_cast<T*>(gpr_malloc(sizeof(T) * capacity));
112
+ T* new_dynamic =
113
+ std::alignment_of<T>::value == 0
114
+ ? static_cast<T*>(gpr_malloc(sizeof(T) * capacity))
115
+ : static_cast<T*>(gpr_malloc_aligned(
116
+ sizeof(T) * capacity, std::alignment_of<T>::value));
111
117
  move_elements(data(), new_dynamic, size_);
112
- gpr_free(dynamic_);
118
+ free_dynamic();
113
119
  dynamic_ = new_dynamic;
114
120
  capacity_ = capacity;
115
121
  }
@@ -194,7 +200,17 @@ class InlinedVector {
194
200
  T& value = data()[i];
195
201
  value.~T();
196
202
  }
197
- gpr_free(dynamic_);
203
+ free_dynamic();
204
+ }
205
+
206
+ void free_dynamic() {
207
+ if (dynamic_ != nullptr) {
208
+ if (std::alignment_of<T>::value == 0) {
209
+ gpr_free(dynamic_);
210
+ } else {
211
+ gpr_free_aligned(dynamic_);
212
+ }
213
+ }
198
214
  }
199
215
 
200
216
  typename std::aligned_storage<sizeof(T)>::type inline_[N];
@@ -27,28 +27,48 @@
27
27
  #include <functional>
28
28
  #include <iterator>
29
29
 
30
+ #if GRPC_USE_CPP_STD_LIB
31
+ #include <map>
32
+ #endif
33
+
30
34
  #include "src/core/lib/gpr/useful.h"
31
35
  #include "src/core/lib/gprpp/memory.h"
32
36
  #include "src/core/lib/gprpp/pair.h"
33
37
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
38
+ #include "src/core/lib/gprpp/string_view.h"
34
39
 
35
40
  namespace grpc_core {
41
+
36
42
  struct StringLess {
37
43
  bool operator()(const char* a, const char* b) const {
38
44
  return strcmp(a, b) < 0;
39
45
  }
40
- bool operator()(const UniquePtr<char>& k1, const UniquePtr<char>& k2) {
41
- return strcmp(k1.get(), k2.get()) < 0;
46
+ bool operator()(const UniquePtr<char>& a, const UniquePtr<char>& b) const {
47
+ return strcmp(a.get(), b.get()) < 0;
48
+ }
49
+ bool operator()(const StringView& a, const StringView& b) const {
50
+ const size_t min_size = std::min(a.size(), b.size());
51
+ int c = strncmp(a.data(), b.data(), min_size);
52
+ if (c != 0) return c < 0;
53
+ return a.size() < b.size();
42
54
  }
43
55
  };
44
56
 
45
57
  template <typename T>
46
58
  struct RefCountedPtrLess {
47
- bool operator()(const RefCountedPtr<T>& p1, const RefCountedPtr<T>& p2) {
59
+ bool operator()(const RefCountedPtr<T>& p1,
60
+ const RefCountedPtr<T>& p2) const {
48
61
  return p1.get() < p2.get();
49
62
  }
50
63
  };
51
64
 
65
+ #if GRPC_USE_CPP_STD_LIB
66
+
67
+ template <class Key, class T, class Compare = std::less<Key>>
68
+ using Map = std::map<Key, T, Compare>;
69
+
70
+ #else // GRPC_USE_CPP_STD_LIB
71
+
52
72
  namespace testing {
53
73
  class MapTest;
54
74
  }
@@ -62,6 +82,7 @@ class Map {
62
82
  typedef Pair<key_type, mapped_type> value_type;
63
83
  typedef Compare key_compare;
64
84
  class iterator;
85
+ class const_iterator;
65
86
 
66
87
  Map() = default;
67
88
  ~Map() { clear(); }
@@ -82,6 +103,22 @@ class Map {
82
103
  return *this;
83
104
  }
84
105
 
106
+ // Copyable.
107
+ Map(const Map& other) {
108
+ for (const auto& p : other) {
109
+ emplace(p);
110
+ }
111
+ }
112
+ Map& operator=(const Map& other) {
113
+ if (this != &other) {
114
+ clear();
115
+ for (const auto& p : other) {
116
+ emplace(p);
117
+ }
118
+ }
119
+ return *this;
120
+ }
121
+
85
122
  T& operator[](key_type&& key);
86
123
  T& operator[](const key_type& key);
87
124
  iterator find(const key_type& k);
@@ -89,7 +126,7 @@ class Map {
89
126
  // Removes the current entry and points to the next one
90
127
  iterator erase(iterator iter);
91
128
 
92
- size_t size() { return size_; }
129
+ size_t size() const { return size_; }
93
130
 
94
131
  template <class... Args>
95
132
  Pair<iterator, bool> emplace(Args&&... args);
@@ -116,8 +153,19 @@ class Map {
116
153
 
117
154
  iterator end() { return iterator(this, nullptr); }
118
155
 
156
+ const_iterator begin() const {
157
+ Entry* curr = GetMinEntry(root_);
158
+ return const_iterator(this, curr);
159
+ }
160
+
161
+ const_iterator end() const { return const_iterator(this, nullptr); }
162
+
119
163
  iterator lower_bound(const Key& k) {
120
- key_compare compare;
164
+ // This is a workaround for "const key_compare compare;"
165
+ // because some versions of compilers cannot build this by requiring
166
+ // a user-provided constructor. (ref: https://stackoverflow.com/q/7411515)
167
+ key_compare compare_tmp;
168
+ const key_compare& compare = compare_tmp;
121
169
  return std::find_if(begin(), end(), [&k, &compare](const value_type& v) {
122
170
  return !compare(v.first, k);
123
171
  });
@@ -204,6 +252,53 @@ class Map<Key, T, Compare>::iterator
204
252
  GrpcMap* map_;
205
253
  };
206
254
 
255
+ template <class Key, class T, class Compare>
256
+ class Map<Key, T, Compare>::const_iterator
257
+ : public std::iterator<std::input_iterator_tag, Pair<Key, T>, int32_t,
258
+ Pair<Key, T>*, Pair<Key, T>&> {
259
+ public:
260
+ const_iterator(const const_iterator& iter)
261
+ : curr_(iter.curr_), map_(iter.map_) {}
262
+ bool operator==(const const_iterator& rhs) const {
263
+ return (curr_ == rhs.curr_);
264
+ }
265
+ bool operator!=(const const_iterator& rhs) const {
266
+ return (curr_ != rhs.curr_);
267
+ }
268
+
269
+ const_iterator& operator++() {
270
+ curr_ = map_->InOrderSuccessor(curr_);
271
+ return *this;
272
+ }
273
+
274
+ const_iterator operator++(int) {
275
+ Entry* prev = curr_;
276
+ curr_ = map_->InOrderSuccessor(curr_);
277
+ return const_iterator(map_, prev);
278
+ }
279
+
280
+ const_iterator& operator=(const const_iterator& other) {
281
+ if (this != &other) {
282
+ this->curr_ = other.curr_;
283
+ this->map_ = other.map_;
284
+ }
285
+ return *this;
286
+ }
287
+
288
+ // operator*()
289
+ const value_type& operator*() const { return curr_->pair; }
290
+
291
+ // operator->()
292
+ const value_type* operator->() const { return &curr_->pair; }
293
+
294
+ private:
295
+ friend class Map<key_type, mapped_type, key_compare>;
296
+ using GrpcMap = typename ::grpc_core::Map<Key, T, Compare>;
297
+ const_iterator(const GrpcMap* map, Entry* curr) : curr_(curr), map_(map) {}
298
+ Entry* curr_;
299
+ const GrpcMap* map_;
300
+ };
301
+
207
302
  template <class Key, class T, class Compare>
208
303
  T& Map<Key, T, Compare>::operator[](key_type&& key) {
209
304
  auto iter = find(key);
@@ -448,7 +543,11 @@ Map<Key, T, Compare>::RemoveRecursive(Entry* root, const key_type& k) {
448
543
  template <class Key, class T, class Compare>
449
544
  int Map<Key, T, Compare>::CompareKeys(const key_type& lhs,
450
545
  const key_type& rhs) {
451
- key_compare compare;
546
+ // This is a workaround for "const key_compare compare;"
547
+ // because some versions of compilers cannot build this by requiring
548
+ // a user-provided constructor. (ref: https://stackoverflow.com/q/7411515)
549
+ key_compare compare_tmp;
550
+ const key_compare& compare = compare_tmp;
452
551
  bool left_comparison = compare(lhs, rhs);
453
552
  bool right_comparison = compare(rhs, lhs);
454
553
  // Both values are equal
@@ -457,5 +556,9 @@ int Map<Key, T, Compare>::CompareKeys(const key_type& lhs,
457
556
  }
458
557
  return left_comparison ? -1 : 1;
459
558
  }
559
+
560
+ #endif // GRPC_USE_CPP_STD_LIB
561
+
460
562
  } // namespace grpc_core
563
+
461
564
  #endif /* GRPC_CORE_LIB_GPRPP_MAP_H */
@@ -30,6 +30,9 @@
30
30
 
31
31
  // Add this to a class that want to use Delete(), but has a private or
32
32
  // protected destructor.
33
+ // Should not be used in new code.
34
+ // TODO(juanlishen): Remove this macro, and instead comment that the public dtor
35
+ // should not be used directly.
33
36
  #define GRPC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE \
34
37
  template <typename _Delete_T, bool _Delete_can_be_null> \
35
38
  friend void ::grpc_core::Delete(_Delete_T*); \
@@ -38,6 +41,9 @@
38
41
 
39
42
  // Add this to a class that want to use New(), but has a private or
40
43
  // protected constructor.
44
+ // Should not be used in new code.
45
+ // TODO(juanlishen): Remove this macro, and instead comment that the public dtor
46
+ // should not be used directly.
41
47
  #define GRPC_ALLOW_CLASS_TO_USE_NON_PUBLIC_NEW \
42
48
  template <typename _New_T, typename... _New_Args> \
43
49
  friend _New_T* grpc_core::New(_New_Args&&...);
@@ -103,6 +103,8 @@ class RefCountedPtr {
103
103
  if (value_ != nullptr) value_->Unref();
104
104
  }
105
105
 
106
+ void swap(RefCountedPtr& other) { std::swap(value_, other.value_); }
107
+
106
108
  // If value is non-null, we take ownership of a ref to it.
107
109
  void reset(T* value = nullptr) {
108
110
  if (value_ != nullptr) value_->Unref();
@@ -47,6 +47,7 @@
47
47
  #include "src/core/lib/gpr/useful.h"
48
48
  #include "src/core/lib/gprpp/inlined_vector.h"
49
49
  #include "src/core/lib/gprpp/manual_constructor.h"
50
+ #include "src/core/lib/gprpp/ref_counted.h"
50
51
  #include "src/core/lib/gprpp/sync.h"
51
52
  #include "src/core/lib/iomgr/block_annotate.h"
52
53
  #include "src/core/lib/iomgr/iomgr_internal.h"
@@ -89,7 +90,7 @@ typedef struct pollable pollable;
89
90
  /// - PO_MULTI - a pollable containing many fds
90
91
  struct pollable {
91
92
  pollable_type type; // immutable
92
- gpr_refcount refs;
93
+ grpc_core::RefCount refs;
93
94
 
94
95
  int epfd;
95
96
  grpc_wakeup_fd wakeup;
@@ -135,17 +136,26 @@ static char* pollable_desc(pollable* p) {
135
136
  static pollable* g_empty_pollable;
136
137
 
137
138
  static grpc_error* pollable_create(pollable_type type, pollable** p);
138
- #ifdef NDEBUG
139
- static pollable* pollable_ref(pollable* p);
140
- static void pollable_unref(pollable* p);
141
- #define POLLABLE_REF(p, r) pollable_ref(p)
142
- #define POLLABLE_UNREF(p, r) pollable_unref(p)
143
- #else
144
- static pollable* pollable_ref(pollable* p, int line, const char* reason);
145
- static void pollable_unref(pollable* p, int line, const char* reason);
146
- #define POLLABLE_REF(p, r) pollable_ref((p), __LINE__, (r))
147
- #define POLLABLE_UNREF(p, r) pollable_unref((p), __LINE__, (r))
148
- #endif
139
+ static pollable* pollable_ref(pollable* p,
140
+ const grpc_core::DebugLocation& dbg_loc,
141
+ const char* reason) {
142
+ p->refs.Ref(dbg_loc, reason);
143
+ return p;
144
+ }
145
+ static void pollable_unref(pollable* p, const grpc_core::DebugLocation& dbg_loc,
146
+ const char* reason) {
147
+ if (p == nullptr) return;
148
+ if (GPR_UNLIKELY(p != nullptr && p->refs.Unref(dbg_loc, reason))) {
149
+ GRPC_FD_TRACE("pollable_unref: Closing epfd: %d", p->epfd);
150
+ close(p->epfd);
151
+ grpc_wakeup_fd_destroy(&p->wakeup);
152
+ gpr_mu_destroy(&p->owner_orphan_mu);
153
+ gpr_mu_destroy(&p->mu);
154
+ gpr_free(p);
155
+ }
156
+ }
157
+ #define POLLABLE_REF(p, r) pollable_ref((p), DEBUG_LOCATION, (r))
158
+ #define POLLABLE_UNREF(p, r) pollable_unref((p), DEBUG_LOCATION, (r))
149
159
 
150
160
  /*******************************************************************************
151
161
  * Fd Declarations
@@ -283,7 +293,7 @@ struct grpc_pollset {
283
293
  */
284
294
 
285
295
  struct grpc_pollset_set {
286
- gpr_refcount refs;
296
+ grpc_core::RefCount refs;
287
297
  gpr_mu mu;
288
298
  grpc_pollset_set* parent;
289
299
 
@@ -568,7 +578,7 @@ static grpc_error* pollable_create(pollable_type type, pollable** p) {
568
578
  }
569
579
 
570
580
  (*p)->type = type;
571
- gpr_ref_init(&(*p)->refs, 1);
581
+ new (&(*p)->refs) grpc_core::RefCount(1, &grpc_trace_pollable_refcount);
572
582
  gpr_mu_init(&(*p)->mu);
573
583
  (*p)->epfd = epfd;
574
584
  (*p)->owner_fd = nullptr;
@@ -582,41 +592,6 @@ static grpc_error* pollable_create(pollable_type type, pollable** p) {
582
592
  return GRPC_ERROR_NONE;
583
593
  }
584
594
 
585
- #ifdef NDEBUG
586
- static pollable* pollable_ref(pollable* p) {
587
- #else
588
- static pollable* pollable_ref(pollable* p, int line, const char* reason) {
589
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_pollable_refcount)) {
590
- int r = static_cast<int> gpr_atm_no_barrier_load(&p->refs.count);
591
- gpr_log(__FILE__, line, GPR_LOG_SEVERITY_DEBUG,
592
- "POLLABLE:%p ref %d->%d %s", p, r, r + 1, reason);
593
- }
594
- #endif
595
- gpr_ref(&p->refs);
596
- return p;
597
- }
598
-
599
- #ifdef NDEBUG
600
- static void pollable_unref(pollable* p) {
601
- #else
602
- static void pollable_unref(pollable* p, int line, const char* reason) {
603
- if (p == nullptr) return;
604
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_pollable_refcount)) {
605
- int r = static_cast<int> gpr_atm_no_barrier_load(&p->refs.count);
606
- gpr_log(__FILE__, line, GPR_LOG_SEVERITY_DEBUG,
607
- "POLLABLE:%p unref %d->%d %s", p, r, r - 1, reason);
608
- }
609
- #endif
610
- if (p != nullptr && gpr_unref(&p->refs)) {
611
- GRPC_FD_TRACE("pollable_unref: Closing epfd: %d", p->epfd);
612
- close(p->epfd);
613
- grpc_wakeup_fd_destroy(&p->wakeup);
614
- gpr_mu_destroy(&p->owner_orphan_mu);
615
- gpr_mu_destroy(&p->mu);
616
- gpr_free(p);
617
- }
618
- }
619
-
620
595
  static grpc_error* pollable_add_fd(pollable* p, grpc_fd* fd) {
621
596
  grpc_error* error = GRPC_ERROR_NONE;
622
597
  static const char* err_desc = "pollable_add_fd";
@@ -1102,7 +1077,7 @@ static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
1102
1077
  }
1103
1078
 
1104
1079
  #ifndef NDEBUG
1105
- static long gettid(void) { return syscall(__NR_gettid); }
1080
+ static long sys_gettid(void) { return syscall(__NR_gettid); }
1106
1081
  #endif
1107
1082
 
1108
1083
  /* pollset->mu lock must be held by the caller before calling this.
@@ -1122,7 +1097,7 @@ static grpc_error* pollset_work(grpc_pollset* pollset,
1122
1097
  #define WORKER_PTR (&worker)
1123
1098
  #endif
1124
1099
  #ifndef NDEBUG
1125
- WORKER_PTR->originator = gettid();
1100
+ WORKER_PTR->originator = sys_gettid();
1126
1101
  #endif
1127
1102
  if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1128
1103
  gpr_log(GPR_INFO,
@@ -1331,13 +1306,13 @@ static grpc_pollset_set* pollset_set_create(void) {
1331
1306
  grpc_pollset_set* pss =
1332
1307
  static_cast<grpc_pollset_set*>(gpr_zalloc(sizeof(*pss)));
1333
1308
  gpr_mu_init(&pss->mu);
1334
- gpr_ref_init(&pss->refs, 1);
1309
+ new (&pss->refs) grpc_core::RefCount();
1335
1310
  return pss;
1336
1311
  }
1337
1312
 
1338
1313
  static void pollset_set_unref(grpc_pollset_set* pss) {
1339
1314
  if (pss == nullptr) return;
1340
- if (!gpr_unref(&pss->refs)) return;
1315
+ if (GPR_LIKELY(!pss->refs.Unref())) return;
1341
1316
  pollset_set_unref(pss->parent);
1342
1317
  gpr_mu_destroy(&pss->mu);
1343
1318
  for (size_t i = 0; i < pss->pollset_count; i++) {
@@ -1528,7 +1503,7 @@ static void pollset_set_add_pollset_set(grpc_pollset_set* a,
1528
1503
  if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1529
1504
  gpr_log(GPR_INFO, "PSS: parent %p to %p", b, a);
1530
1505
  }
1531
- gpr_ref(&a->refs);
1506
+ a->refs.Ref();
1532
1507
  b->parent = a;
1533
1508
  if (a->fd_capacity < a->fd_count + b->fd_count) {
1534
1509
  a->fd_capacity = GPR_MAX(2 * a->fd_capacity, a->fd_count + b->fd_count);