grpc 1.22.0 → 1.23.0

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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +487 -649
  3. data/include/grpc/grpc_security.h +25 -0
  4. data/include/grpc/impl/codegen/grpc_types.h +11 -2
  5. data/include/grpc/impl/codegen/port_platform.h +12 -0
  6. data/src/core/ext/filters/client_channel/backup_poller.cc +4 -2
  7. data/src/core/ext/filters/client_channel/client_channel.cc +477 -182
  8. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +25 -16
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +11 -6
  10. data/src/core/ext/filters/client_channel/connector.h +10 -2
  11. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -3
  12. data/src/core/ext/filters/client_channel/http_proxy.cc +9 -10
  13. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -17
  14. data/src/core/ext/filters/client_channel/lb_policy.h +36 -8
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +22 -8
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +86 -52
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +7 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +73 -72
  19. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +8 -12
  20. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +25 -101
  21. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +5 -5
  22. data/src/core/ext/filters/client_channel/parse_address.cc +29 -26
  23. data/src/core/ext/filters/client_channel/resolver.h +3 -11
  24. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -3
  25. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +405 -82
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +44 -51
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -1
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -1
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +11 -6
  30. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +130 -65
  31. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +8 -3
  32. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +31 -14
  33. data/src/core/ext/filters/client_channel/resolver_factory.h +4 -0
  34. data/src/core/ext/filters/client_channel/resolver_registry.cc +11 -0
  35. data/src/core/ext/filters/client_channel/resolver_registry.h +3 -0
  36. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +10 -49
  37. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +1 -14
  38. data/src/core/ext/filters/client_channel/retry_throttle.h +2 -3
  39. data/src/core/ext/filters/client_channel/subchannel.cc +65 -58
  40. data/src/core/ext/filters/client_channel/subchannel.h +65 -45
  41. data/src/core/ext/filters/client_channel/subchannel_interface.h +15 -30
  42. data/src/core/ext/filters/client_idle/client_idle_filter.cc +262 -0
  43. data/src/core/ext/filters/http/client/http_client_filter.cc +4 -5
  44. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  45. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +140 -152
  46. data/src/core/ext/filters/max_age/max_age_filter.cc +3 -3
  47. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +3 -4
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -6
  49. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +63 -38
  50. data/src/core/ext/transport/chttp2/transport/context_list.cc +3 -1
  51. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  52. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +1 -1
  53. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -0
  55. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +7 -0
  56. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +1 -0
  57. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +37 -22
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -81
  59. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -0
  60. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -166
  61. data/src/core/ext/transport/chttp2/transport/hpack_table.h +41 -15
  62. data/src/core/ext/transport/chttp2/transport/internal.h +13 -2
  63. data/src/core/ext/transport/chttp2/transport/parsing.cc +35 -22
  64. data/src/core/ext/transport/chttp2/transport/stream_map.cc +28 -18
  65. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -0
  66. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  67. data/src/core/lib/channel/channelz.cc +80 -33
  68. data/src/core/lib/channel/channelz.h +28 -13
  69. data/src/core/lib/compression/compression.cc +1 -2
  70. data/src/core/lib/compression/compression_args.cc +13 -6
  71. data/src/core/lib/compression/compression_args.h +3 -2
  72. data/src/core/lib/compression/compression_internal.cc +1 -1
  73. data/src/core/lib/gpr/env_linux.cc +10 -21
  74. data/src/core/lib/gpr/env_posix.cc +0 -5
  75. data/src/core/lib/gpr/string.cc +7 -2
  76. data/src/core/lib/gpr/string.h +1 -0
  77. data/src/core/lib/gpr/sync_posix.cc +0 -129
  78. data/src/core/lib/gprpp/debug_location.h +3 -2
  79. data/src/core/lib/gprpp/fork.cc +14 -21
  80. data/src/core/lib/gprpp/fork.h +15 -4
  81. data/src/core/lib/gprpp/host_port.cc +118 -0
  82. data/src/core/lib/{gpr → gprpp}/host_port.h +27 -11
  83. data/src/core/lib/gprpp/map.h +25 -0
  84. data/src/core/lib/gprpp/memory.h +26 -9
  85. data/src/core/lib/gprpp/ref_counted.h +63 -21
  86. data/src/core/lib/gprpp/string_view.h +143 -0
  87. data/src/core/lib/gprpp/thd.h +10 -1
  88. data/src/core/lib/gprpp/thd_posix.cc +25 -0
  89. data/src/core/lib/gprpp/thd_windows.cc +9 -1
  90. data/src/core/lib/http/httpcli_security_connector.cc +3 -1
  91. data/src/core/lib/iomgr/cfstream_handle.cc +6 -1
  92. data/src/core/lib/iomgr/cfstream_handle.h +8 -2
  93. data/src/core/lib/iomgr/combiner.cc +4 -4
  94. data/src/core/lib/iomgr/error.cc +18 -8
  95. data/src/core/lib/iomgr/error.h +2 -0
  96. data/src/core/lib/iomgr/ev_posix.cc +4 -2
  97. data/src/core/lib/iomgr/executor.cc +4 -1
  98. data/src/core/lib/iomgr/executor/mpmcqueue.cc +183 -0
  99. data/src/core/lib/iomgr/executor/mpmcqueue.h +178 -0
  100. data/src/core/lib/iomgr/executor/threadpool.cc +138 -0
  101. data/src/core/lib/iomgr/executor/threadpool.h +153 -0
  102. data/src/core/lib/iomgr/fork_posix.cc +4 -2
  103. data/src/core/lib/iomgr/iocp_windows.cc +2 -2
  104. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +14 -0
  105. data/src/core/lib/iomgr/iomgr_uv.cc +3 -0
  106. data/src/core/lib/iomgr/lockfree_event.cc +3 -3
  107. data/src/core/lib/iomgr/resolve_address_custom.cc +16 -20
  108. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -10
  109. data/src/core/lib/iomgr/resolve_address_windows.cc +6 -8
  110. data/src/core/lib/iomgr/sockaddr_utils.cc +5 -3
  111. data/src/core/lib/iomgr/socket_utils_common_posix.cc +0 -1
  112. data/src/core/lib/iomgr/socket_windows.h +1 -1
  113. data/src/core/lib/iomgr/tcp_client_cfstream.cc +7 -6
  114. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -0
  115. data/src/core/lib/iomgr/tcp_custom.cc +4 -0
  116. data/src/core/lib/iomgr/tcp_posix.cc +8 -2
  117. data/src/core/lib/iomgr/tcp_server_custom.cc +1 -0
  118. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  119. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  120. data/src/core/lib/iomgr/timer_custom.cc +1 -0
  121. data/src/core/lib/iomgr/timer_manager.cc +0 -29
  122. data/src/core/lib/security/credentials/credentials.cc +84 -0
  123. data/src/core/lib/security/credentials/credentials.h +58 -2
  124. data/src/core/lib/security/credentials/jwt/json_token.cc +6 -2
  125. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  126. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +245 -24
  127. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +16 -0
  128. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -2
  129. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +21 -25
  130. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -2
  131. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  132. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  133. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +19 -19
  134. data/src/core/lib/security/security_connector/ssl_utils.cc +26 -31
  135. data/src/core/lib/security/security_connector/ssl_utils.h +11 -8
  136. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +16 -20
  137. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -3
  138. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  139. data/src/core/lib/security/util/json_util.cc +19 -5
  140. data/src/core/lib/security/util/json_util.h +3 -1
  141. data/src/core/lib/slice/slice.cc +69 -50
  142. data/src/core/lib/slice/slice_buffer.cc +6 -5
  143. data/src/core/lib/slice/slice_hash_table.h +3 -7
  144. data/src/core/lib/slice/slice_intern.cc +130 -39
  145. data/src/core/lib/slice/slice_internal.h +8 -0
  146. data/src/core/lib/slice/slice_utils.h +120 -0
  147. data/src/core/lib/slice/slice_weak_hash_table.h +2 -7
  148. data/src/core/lib/surface/call.cc +8 -3
  149. data/src/core/lib/surface/channel.cc +31 -8
  150. data/src/core/lib/surface/completion_queue.cc +17 -7
  151. data/src/core/lib/surface/init_secure.cc +4 -1
  152. data/src/core/lib/surface/lame_client.cc +2 -2
  153. data/src/core/lib/surface/server.cc +34 -35
  154. data/src/core/lib/surface/server.h +8 -17
  155. data/src/core/lib/surface/version.cc +1 -1
  156. data/src/core/lib/transport/byte_stream.cc +3 -5
  157. data/src/core/lib/transport/byte_stream.h +1 -2
  158. data/src/core/lib/transport/error_utils.cc +10 -1
  159. data/src/core/lib/transport/metadata.cc +202 -35
  160. data/src/core/lib/transport/metadata.h +81 -6
  161. data/src/core/lib/transport/static_metadata.cc +1257 -465
  162. data/src/core/lib/transport/static_metadata.h +190 -347
  163. data/src/core/lib/transport/timeout_encoding.cc +7 -0
  164. data/src/core/lib/transport/timeout_encoding.h +3 -2
  165. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  166. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +0 -1
  167. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -7
  168. data/src/core/tsi/ssl_transport_security.cc +35 -43
  169. data/src/core/tsi/ssl_transport_security.h +2 -1
  170. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  171. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  172. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  173. data/src/ruby/lib/grpc/grpc.rb +1 -1
  174. data/src/ruby/lib/grpc/version.rb +1 -1
  175. metadata +39 -33
  176. data/src/core/lib/gpr/host_port.cc +0 -98
@@ -25,10 +25,12 @@ namespace grpc_core {
25
25
  // No-op for non-debug builds.
26
26
  // Callers can use the DEBUG_LOCATION macro in either case.
27
27
  #ifndef NDEBUG
28
+ // TODO(roth): See if there's a way to automatically populate this,
29
+ // similarly to how absl::SourceLocation::current() works, so that
30
+ // callers don't need to explicitly pass DEBUG_LOCATION anywhere.
28
31
  class DebugLocation {
29
32
  public:
30
33
  DebugLocation(const char* file, int line) : file_(file), line_(line) {}
31
- bool Log() const { return true; }
32
34
  const char* file() const { return file_; }
33
35
  int line() const { return line_; }
34
36
 
@@ -40,7 +42,6 @@ class DebugLocation {
40
42
  #else
41
43
  class DebugLocation {
42
44
  public:
43
- bool Log() const { return false; }
44
45
  const char* file() const { return nullptr; }
45
46
  int line() const { return -1; }
46
47
  };
@@ -168,40 +168,33 @@ class ThreadState {
168
168
 
169
169
  void Fork::GlobalInit() {
170
170
  if (!override_enabled_) {
171
- support_enabled_ = GPR_GLOBAL_CONFIG_GET(grpc_enable_fork_support);
171
+ support_enabled_.Store(GPR_GLOBAL_CONFIG_GET(grpc_enable_fork_support),
172
+ MemoryOrder::RELAXED);
172
173
  }
173
- if (support_enabled_) {
174
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
174
175
  exec_ctx_state_ = grpc_core::New<internal::ExecCtxState>();
175
176
  thread_state_ = grpc_core::New<internal::ThreadState>();
176
177
  }
177
178
  }
178
179
 
179
180
  void Fork::GlobalShutdown() {
180
- if (support_enabled_) {
181
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
181
182
  grpc_core::Delete(exec_ctx_state_);
182
183
  grpc_core::Delete(thread_state_);
183
184
  }
184
185
  }
185
186
 
186
- bool Fork::Enabled() { return support_enabled_; }
187
+ bool Fork::Enabled() { return support_enabled_.Load(MemoryOrder::RELAXED); }
187
188
 
188
189
  // Testing Only
189
190
  void Fork::Enable(bool enable) {
190
191
  override_enabled_ = true;
191
- support_enabled_ = enable;
192
+ support_enabled_.Store(enable, MemoryOrder::RELAXED);
192
193
  }
193
194
 
194
- void Fork::IncExecCtxCount() {
195
- if (support_enabled_) {
196
- exec_ctx_state_->IncExecCtxCount();
197
- }
198
- }
195
+ void Fork::DoIncExecCtxCount() { exec_ctx_state_->IncExecCtxCount(); }
199
196
 
200
- void Fork::DecExecCtxCount() {
201
- if (support_enabled_) {
202
- exec_ctx_state_->DecExecCtxCount();
203
- }
204
- }
197
+ void Fork::DoDecExecCtxCount() { exec_ctx_state_->DecExecCtxCount(); }
205
198
 
206
199
  void Fork::SetResetChildPollingEngineFunc(
207
200
  Fork::child_postfork_func reset_child_polling_engine) {
@@ -212,38 +205,38 @@ Fork::child_postfork_func Fork::GetResetChildPollingEngineFunc() {
212
205
  }
213
206
 
214
207
  bool Fork::BlockExecCtx() {
215
- if (support_enabled_) {
208
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
216
209
  return exec_ctx_state_->BlockExecCtx();
217
210
  }
218
211
  return false;
219
212
  }
220
213
 
221
214
  void Fork::AllowExecCtx() {
222
- if (support_enabled_) {
215
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
223
216
  exec_ctx_state_->AllowExecCtx();
224
217
  }
225
218
  }
226
219
 
227
220
  void Fork::IncThreadCount() {
228
- if (support_enabled_) {
221
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
229
222
  thread_state_->IncThreadCount();
230
223
  }
231
224
  }
232
225
 
233
226
  void Fork::DecThreadCount() {
234
- if (support_enabled_) {
227
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
235
228
  thread_state_->DecThreadCount();
236
229
  }
237
230
  }
238
231
  void Fork::AwaitThreads() {
239
- if (support_enabled_) {
232
+ if (support_enabled_.Load(MemoryOrder::RELAXED)) {
240
233
  thread_state_->AwaitThreads();
241
234
  }
242
235
  }
243
236
 
244
237
  internal::ExecCtxState* Fork::exec_ctx_state_ = nullptr;
245
238
  internal::ThreadState* Fork::thread_state_ = nullptr;
246
- std::atomic<bool> Fork::support_enabled_;
239
+ Atomic<bool> Fork::support_enabled_(false);
247
240
  bool Fork::override_enabled_ = false;
248
241
  Fork::child_postfork_func Fork::reset_child_polling_engine_ = nullptr;
249
242
  } // namespace grpc_core
@@ -21,7 +21,7 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <atomic>
24
+ #include "src/core/lib/gprpp/atomic.h"
25
25
 
26
26
  /*
27
27
  * NOTE: FORKING IS NOT GENERALLY SUPPORTED, THIS IS ONLY INTENDED TO WORK
@@ -47,10 +47,18 @@ class Fork {
47
47
 
48
48
  // Increment the count of active ExecCtxs.
49
49
  // Will block until a pending fork is complete if one is in progress.
50
- static void IncExecCtxCount();
50
+ static void IncExecCtxCount() {
51
+ if (GPR_UNLIKELY(support_enabled_.Load(MemoryOrder::RELAXED))) {
52
+ DoIncExecCtxCount();
53
+ }
54
+ }
51
55
 
52
56
  // Decrement the count of active ExecCtxs
53
- static void DecExecCtxCount();
57
+ static void DecExecCtxCount() {
58
+ if (GPR_UNLIKELY(support_enabled_.Load(MemoryOrder::RELAXED))) {
59
+ DoDecExecCtxCount();
60
+ }
61
+ }
54
62
 
55
63
  // Provide a function that will be invoked in the child's postfork handler to
56
64
  // reset the polling engine's internal state.
@@ -80,9 +88,12 @@ class Fork {
80
88
  static void Enable(bool enable);
81
89
 
82
90
  private:
91
+ static void DoIncExecCtxCount();
92
+ static void DoDecExecCtxCount();
93
+
83
94
  static internal::ExecCtxState* exec_ctx_state_;
84
95
  static internal::ThreadState* thread_state_;
85
- static std::atomic<bool> support_enabled_;
96
+ static grpc_core::Atomic<bool> support_enabled_;
86
97
  static bool override_enabled_;
87
98
  static child_postfork_func reset_child_polling_engine_;
88
99
  };
@@ -0,0 +1,118 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/lib/gprpp/host_port.h"
22
+
23
+ #include <string.h>
24
+
25
+ #include <grpc/support/alloc.h>
26
+ #include <grpc/support/log.h>
27
+ #include <grpc/support/string_util.h>
28
+
29
+ #include "src/core/lib/gpr/string.h"
30
+ #include "src/core/lib/gprpp/string_view.h"
31
+
32
+ namespace grpc_core {
33
+ int JoinHostPort(UniquePtr<char>* out, const char* host, int port) {
34
+ char* tmp;
35
+ int ret;
36
+ if (host[0] != '[' && strchr(host, ':') != nullptr) {
37
+ /* IPv6 literals must be enclosed in brackets. */
38
+ ret = gpr_asprintf(&tmp, "[%s]:%d", host, port);
39
+ } else {
40
+ /* Ordinary non-bracketed host:port. */
41
+ ret = gpr_asprintf(&tmp, "%s:%d", host, port);
42
+ }
43
+ out->reset(tmp);
44
+ return ret;
45
+ }
46
+
47
+ namespace {
48
+ bool DoSplitHostPort(StringView name, StringView* host, StringView* port,
49
+ bool* has_port) {
50
+ *has_port = false;
51
+ if (name[0] == '[') {
52
+ /* Parse a bracketed host, typically an IPv6 literal. */
53
+ const size_t rbracket = name.find(']', 1);
54
+ if (rbracket == grpc_core::StringView::npos) {
55
+ /* Unmatched [ */
56
+ return false;
57
+ }
58
+ if (rbracket == name.size() - 1) {
59
+ /* ]<end> */
60
+ port->clear();
61
+ } else if (name[rbracket + 1] == ':') {
62
+ /* ]:<port?> */
63
+ *port = name.substr(rbracket + 2, name.size() - rbracket - 2);
64
+ *has_port = true;
65
+ } else {
66
+ /* ]<invalid> */
67
+ return false;
68
+ }
69
+ *host = name.substr(1, rbracket - 1);
70
+ if (host->find(':') == grpc_core::StringView::npos) {
71
+ /* Require all bracketed hosts to contain a colon, because a hostname or
72
+ IPv4 address should never use brackets. */
73
+ host->clear();
74
+ return false;
75
+ }
76
+ } else {
77
+ size_t colon = name.find(':');
78
+ if (colon != grpc_core::StringView::npos &&
79
+ name.find(':', colon + 1) == grpc_core::StringView::npos) {
80
+ /* Exactly 1 colon. Split into host:port. */
81
+ *host = name.substr(0, colon);
82
+ *port = name.substr(colon + 1, name.size() - colon - 1);
83
+ *has_port = true;
84
+ } else {
85
+ /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */
86
+ *host = name;
87
+ port->clear();
88
+ }
89
+ }
90
+ return true;
91
+ }
92
+ } // namespace
93
+
94
+ bool SplitHostPort(StringView name, StringView* host, StringView* port) {
95
+ bool unused;
96
+ return DoSplitHostPort(name, host, port, &unused);
97
+ }
98
+
99
+ bool SplitHostPort(StringView name, UniquePtr<char>* host,
100
+ UniquePtr<char>* port) {
101
+ GPR_DEBUG_ASSERT(host != nullptr && *host == nullptr);
102
+ GPR_DEBUG_ASSERT(port != nullptr && *port == nullptr);
103
+ StringView host_view;
104
+ StringView port_view;
105
+ bool has_port;
106
+ const bool ret = DoSplitHostPort(name, &host_view, &port_view, &has_port);
107
+ if (ret) {
108
+ // We always set the host, but port is set only when DoSplitHostPort find a
109
+ // port in the string, to remain backward compatible with the old
110
+ // gpr_split_host_port API.
111
+ *host = host_view.dup();
112
+ if (has_port) {
113
+ *port = port_view.dup();
114
+ }
115
+ }
116
+ return ret;
117
+ }
118
+ } // namespace grpc_core
@@ -16,28 +16,44 @@
16
16
  *
17
17
  */
18
18
 
19
- #ifndef GRPC_CORE_LIB_GPR_HOST_PORT_H
20
- #define GRPC_CORE_LIB_GPR_HOST_PORT_H
19
+ #ifndef GRPC_CORE_LIB_GPRPP_HOST_PORT_H
20
+ #define GRPC_CORE_LIB_GPRPP_HOST_PORT_H
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include "src/core/lib/gprpp/memory.h"
25
+ #include "src/core/lib/gprpp/string_view.h"
26
+
27
+ namespace grpc_core {
28
+
24
29
  /** Given a host and port, creates a newly-allocated string of the form
25
30
  "host:port" or "[ho:st]:port", depending on whether the host contains colons
26
31
  like an IPv6 literal. If the host is already bracketed, then additional
27
32
  brackets will not be added.
28
33
 
29
34
  Usage is similar to gpr_asprintf: returns the number of bytes written
30
- (excluding the final '\0'), and *out points to a string which must later be
31
- destroyed using gpr_free().
35
+ (excluding the final '\0'), and *out points to a string.
32
36
 
33
37
  In the unlikely event of an error, returns -1 and sets *out to NULL. */
34
- int gpr_join_host_port(char** out, const char* host, int port);
38
+ int JoinHostPort(UniquePtr<char>* out, const char* host, int port);
35
39
 
36
40
  /** Given a name in the form "host:port" or "[ho:st]:port", split into hostname
37
- and port number, into newly allocated strings, which must later be
38
- destroyed using gpr_free().
39
- Return 1 on success, 0 on failure. Guarantees *host and *port == NULL on
40
- failure. */
41
- int gpr_split_host_port(const char* name, char** host, char** port);
41
+ and port number.
42
+
43
+ There are two variants of this method:
44
+ 1) StringView output: port and host are returned as views on name.
45
+ 2) char* output: port and host are copied into newly allocated strings.
46
+
47
+ Prefer variant (1) over (2), because no allocation or copy is performed in
48
+ variant (1). Use (2) only when interacting with C API that mandate
49
+ null-terminated strings.
50
+
51
+ Return true on success, false on failure. Guarantees *host and *port are
52
+ cleared on failure. */
53
+ bool SplitHostPort(StringView name, StringView* host, StringView* port);
54
+ bool SplitHostPort(StringView name, UniquePtr<char>* host,
55
+ UniquePtr<char>* port);
56
+
57
+ } // namespace grpc_core
42
58
 
43
- #endif /* GRPC_CORE_LIB_GPR_HOST_PORT_H */
59
+ #endif /* GRPC_CORE_LIB_GPRPP_HOST_PORT_H */
@@ -30,6 +30,7 @@
30
30
  #include "src/core/lib/gpr/useful.h"
31
31
  #include "src/core/lib/gprpp/memory.h"
32
32
  #include "src/core/lib/gprpp/pair.h"
33
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
33
34
 
34
35
  namespace grpc_core {
35
36
  struct StringLess {
@@ -41,6 +42,13 @@ struct StringLess {
41
42
  }
42
43
  };
43
44
 
45
+ template <typename T>
46
+ struct RefCountedPtrLess {
47
+ bool operator()(const RefCountedPtr<T>& p1, const RefCountedPtr<T>& p2) {
48
+ return p1.get() < p2.get();
49
+ }
50
+ };
51
+
44
52
  namespace testing {
45
53
  class MapTest;
46
54
  }
@@ -55,8 +63,25 @@ class Map {
55
63
  typedef Compare key_compare;
56
64
  class iterator;
57
65
 
66
+ Map() = default;
58
67
  ~Map() { clear(); }
59
68
 
69
+ // Movable.
70
+ Map(Map&& other) : root_(other.root_), size_(other.size_) {
71
+ other.root_ = nullptr;
72
+ other.size_ = 0;
73
+ }
74
+ Map& operator=(Map&& other) {
75
+ if (this != &other) {
76
+ clear();
77
+ root_ = other.root_;
78
+ size_ = other.size_;
79
+ other.root_ = nullptr;
80
+ other.size_ = 0;
81
+ }
82
+ return *this;
83
+ }
84
+
60
85
  T& operator[](key_type&& key);
61
86
  T& operator[](const key_type& key);
62
87
  iterator find(const key_type& k);
@@ -22,6 +22,7 @@
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <grpc/support/alloc.h>
25
+ #include <grpc/support/log.h>
25
26
 
26
27
  #include <limits>
27
28
  #include <memory>
@@ -29,14 +30,17 @@
29
30
 
30
31
  // Add this to a class that want to use Delete(), but has a private or
31
32
  // protected destructor.
32
- #define GRPC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE \
33
- template <typename T> \
34
- friend void grpc_core::Delete(T*);
33
+ #define GRPC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE \
34
+ template <typename _Delete_T, bool _Delete_can_be_null> \
35
+ friend void ::grpc_core::Delete(_Delete_T*); \
36
+ template <typename _Delete_T> \
37
+ friend void ::grpc_core::Delete(_Delete_T*);
38
+
35
39
  // Add this to a class that want to use New(), but has a private or
36
40
  // protected constructor.
37
- #define GRPC_ALLOW_CLASS_TO_USE_NON_PUBLIC_NEW \
38
- template <typename T, typename... Args> \
39
- friend T* grpc_core::New(Args&&...);
41
+ #define GRPC_ALLOW_CLASS_TO_USE_NON_PUBLIC_NEW \
42
+ template <typename _New_T, typename... _New_Args> \
43
+ friend _New_T* grpc_core::New(_New_Args&&...);
40
44
 
41
45
  namespace grpc_core {
42
46
 
@@ -48,17 +52,30 @@ inline T* New(Args&&... args) {
48
52
  }
49
53
 
50
54
  // Alternative to delete, since we cannot use it (for fear of libstdc++)
51
- template <typename T>
55
+ // We cannot add a default value for can_be_null, because they are used as
56
+ // as friend template methods where we cannot define a default value.
57
+ // Instead we simply define two variants, one with and one without the boolean
58
+ // argument.
59
+ template <typename T, bool can_be_null>
52
60
  inline void Delete(T* p) {
53
- if (p == nullptr) return;
61
+ GPR_DEBUG_ASSERT(can_be_null || p != nullptr);
62
+ if (can_be_null && p == nullptr) return;
54
63
  p->~T();
55
64
  gpr_free(p);
56
65
  }
66
+ template <typename T>
67
+ inline void Delete(T* p) {
68
+ Delete<T, /*can_be_null=*/true>(p);
69
+ }
57
70
 
58
71
  template <typename T>
59
72
  class DefaultDelete {
60
73
  public:
61
- void operator()(T* p) { Delete(p); }
74
+ void operator()(T* p) {
75
+ // std::unique_ptr is gauranteed not to call the deleter
76
+ // if the pointer is nullptr.
77
+ Delete<T, /*can_be_null=*/false>(p);
78
+ }
62
79
  };
63
80
 
64
81
  template <typename T, typename Deleter = DefaultDelete<T>>
@@ -89,72 +89,114 @@ class RefCount {
89
89
  }
90
90
 
91
91
  // Increases the ref-count by `n`.
92
- void Ref(Value n = 1) { value_.FetchAdd(n, MemoryOrder::RELAXED); }
92
+ void Ref(Value n = 1) {
93
+ #ifndef NDEBUG
94
+ const Value prior = value_.FetchAdd(n, MemoryOrder::RELAXED);
95
+ if (trace_flag_ != nullptr && trace_flag_->enabled()) {
96
+ gpr_log(GPR_INFO, "%s:%p ref %" PRIdPTR " -> %" PRIdPTR,
97
+ trace_flag_->name(), this, prior, prior + n);
98
+ }
99
+ #else
100
+ value_.FetchAdd(n, MemoryOrder::RELAXED);
101
+ #endif
102
+ }
93
103
  void Ref(const DebugLocation& location, const char* reason, Value n = 1) {
94
104
  #ifndef NDEBUG
95
- if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) {
96
- const RefCount::Value old_refs = get();
105
+ const Value prior = value_.FetchAdd(n, MemoryOrder::RELAXED);
106
+ if (trace_flag_ != nullptr && trace_flag_->enabled()) {
97
107
  gpr_log(GPR_INFO, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s",
98
108
  trace_flag_->name(), this, location.file(), location.line(),
99
- old_refs, old_refs + n, reason);
109
+ prior, prior + n, reason);
100
110
  }
111
+ #else
112
+ value_.FetchAdd(n, MemoryOrder::RELAXED);
101
113
  #endif
102
- Ref(n);
103
114
  }
104
115
 
105
116
  // Similar to Ref() with an assert on the ref-count being non-zero.
106
117
  void RefNonZero() {
107
118
  #ifndef NDEBUG
108
119
  const Value prior = value_.FetchAdd(1, MemoryOrder::RELAXED);
120
+ if (trace_flag_ != nullptr && trace_flag_->enabled()) {
121
+ gpr_log(GPR_INFO, "%s:%p ref %" PRIdPTR " -> %" PRIdPTR,
122
+ trace_flag_->name(), this, prior, prior + 1);
123
+ }
109
124
  assert(prior > 0);
110
125
  #else
111
- Ref();
126
+ value_.FetchAdd(1, MemoryOrder::RELAXED);
112
127
  #endif
113
128
  }
114
129
  void RefNonZero(const DebugLocation& location, const char* reason) {
115
130
  #ifndef NDEBUG
116
- if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) {
117
- const RefCount::Value old_refs = get();
131
+ const Value prior = value_.FetchAdd(1, MemoryOrder::RELAXED);
132
+ if (trace_flag_ != nullptr && trace_flag_->enabled()) {
118
133
  gpr_log(GPR_INFO, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s",
119
134
  trace_flag_->name(), this, location.file(), location.line(),
120
- old_refs, old_refs + 1, reason);
135
+ prior, prior + 1, reason);
121
136
  }
122
- #endif
137
+ assert(prior > 0);
138
+ #else
123
139
  RefNonZero();
140
+ #endif
124
141
  }
125
142
 
126
- bool RefIfNonZero() { return value_.IncrementIfNonzero(); }
127
-
143
+ bool RefIfNonZero() {
144
+ #ifndef NDEBUG
145
+ if (trace_flag_ != nullptr && trace_flag_->enabled()) {
146
+ const Value prior = get();
147
+ gpr_log(GPR_INFO, "%s:%p ref_if_non_zero %" PRIdPTR " -> %" PRIdPTR,
148
+ trace_flag_->name(), this, prior, prior + 1);
149
+ }
150
+ #endif
151
+ return value_.IncrementIfNonzero();
152
+ }
128
153
  bool RefIfNonZero(const DebugLocation& location, const char* reason) {
129
154
  #ifndef NDEBUG
130
- if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) {
131
- const RefCount::Value old_refs = get();
155
+ if (trace_flag_ != nullptr && trace_flag_->enabled()) {
156
+ const Value prior = get();
132
157
  gpr_log(GPR_INFO,
133
158
  "%s:%p %s:%d ref_if_non_zero "
134
159
  "%" PRIdPTR " -> %" PRIdPTR " %s",
135
160
  trace_flag_->name(), this, location.file(), location.line(),
136
- old_refs, old_refs + 1, reason);
161
+ prior, prior + 1, reason);
137
162
  }
138
163
  #endif
139
- return RefIfNonZero();
164
+ return value_.IncrementIfNonzero();
140
165
  }
141
166
 
142
167
  // Decrements the ref-count and returns true if the ref-count reaches 0.
143
168
  bool Unref() {
169
+ #ifndef NDEBUG
170
+ // Grab a copy of the trace flag before the atomic change, since we
171
+ // can't safely access it afterwards if we're going to be freed.
172
+ auto* trace_flag = trace_flag_;
173
+ #endif
144
174
  const Value prior = value_.FetchSub(1, MemoryOrder::ACQ_REL);
175
+ #ifndef NDEBUG
176
+ if (trace_flag != nullptr && trace_flag->enabled()) {
177
+ gpr_log(GPR_INFO, "%s:%p unref %" PRIdPTR " -> %" PRIdPTR,
178
+ trace_flag->name(), this, prior, prior - 1);
179
+ }
145
180
  GPR_DEBUG_ASSERT(prior > 0);
181
+ #endif
146
182
  return prior == 1;
147
183
  }
148
184
  bool Unref(const DebugLocation& location, const char* reason) {
149
185
  #ifndef NDEBUG
150
- if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) {
151
- const RefCount::Value old_refs = get();
186
+ // Grab a copy of the trace flag before the atomic change, since we
187
+ // can't safely access it afterwards if we're going to be freed.
188
+ auto* trace_flag = trace_flag_;
189
+ #endif
190
+ const Value prior = value_.FetchSub(1, MemoryOrder::ACQ_REL);
191
+ #ifndef NDEBUG
192
+ if (trace_flag != nullptr && trace_flag->enabled()) {
152
193
  gpr_log(GPR_INFO, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s",
153
- trace_flag_->name(), this, location.file(), location.line(),
154
- old_refs, old_refs - 1, reason);
194
+ trace_flag->name(), this, location.file(), location.line(), prior,
195
+ prior - 1, reason);
155
196
  }
197
+ GPR_DEBUG_ASSERT(prior > 0);
156
198
  #endif
157
- return Unref();
199
+ return prior == 1;
158
200
  }
159
201
 
160
202
  private: