grpc 1.1.2 → 1.2.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1257 -404
  3. data/etc/roots.pem +189 -102
  4. data/include/grpc/census.h +7 -7
  5. data/include/grpc/compression.h +4 -4
  6. data/include/grpc/grpc.h +13 -7
  7. data/include/grpc/impl/codegen/atm_gcc_atomic.h +26 -9
  8. data/include/grpc/impl/codegen/grpc_types.h +39 -30
  9. data/include/grpc/impl/codegen/slice.h +24 -6
  10. data/include/grpc/impl/codegen/sync.h +8 -0
  11. data/include/grpc/load_reporting.h +63 -0
  12. data/include/grpc/slice.h +37 -1
  13. data/include/grpc/slice_buffer.h +7 -0
  14. data/include/grpc/support/alloc.h +3 -0
  15. data/include/grpc/support/useful.h +3 -0
  16. data/src/core/ext/census/gen/census.pb.h +1 -1
  17. data/src/core/ext/census/gen/trace_context.pb.c +9 -36
  18. data/src/core/ext/census/gen/trace_context.pb.h +20 -26
  19. data/src/core/ext/census/grpc_filter.c +3 -5
  20. data/src/core/ext/census/trace_context.c +1 -1
  21. data/src/core/ext/census/trace_context.h +3 -0
  22. data/src/core/ext/census/trace_label.h +61 -0
  23. data/src/core/ext/census/trace_propagation.h +63 -0
  24. data/src/core/ext/census/trace_status.h +45 -0
  25. data/src/core/ext/census/trace_string.h +50 -0
  26. data/src/core/ext/census/tracing.c +31 -11
  27. data/src/core/ext/census/tracing.h +124 -0
  28. data/src/core/ext/client_channel/client_channel.c +456 -368
  29. data/src/core/ext/client_channel/client_channel.h +4 -0
  30. data/src/core/ext/client_channel/client_channel_plugin.c +6 -1
  31. data/src/core/ext/client_channel/connector.c +3 -3
  32. data/src/core/ext/client_channel/connector.h +4 -3
  33. data/src/core/ext/client_channel/http_connect_handshaker.c +62 -72
  34. data/src/core/ext/client_channel/http_connect_handshaker.h +7 -10
  35. data/src/core/ext/client_channel/http_proxy.c +125 -0
  36. data/src/core/ext/client_channel/http_proxy.h +39 -0
  37. data/src/core/ext/client_channel/lb_policy.c +56 -35
  38. data/src/core/ext/client_channel/lb_policy.h +46 -39
  39. data/src/core/ext/client_channel/lb_policy_factory.h +1 -0
  40. data/src/core/ext/client_channel/parse_address.c +32 -6
  41. data/src/core/ext/client_channel/proxy_mapper.c +63 -0
  42. data/src/core/ext/client_channel/proxy_mapper.h +89 -0
  43. data/src/core/ext/client_channel/proxy_mapper_registry.c +133 -0
  44. data/src/core/ext/client_channel/proxy_mapper_registry.h +59 -0
  45. data/src/core/ext/client_channel/resolver.c +16 -9
  46. data/src/core/ext/client_channel/resolver.h +23 -12
  47. data/src/core/ext/client_channel/resolver_factory.h +1 -0
  48. data/src/core/ext/client_channel/resolver_registry.c +15 -11
  49. data/src/core/ext/client_channel/resolver_registry.h +5 -3
  50. data/src/core/ext/client_channel/subchannel.c +44 -27
  51. data/src/core/ext/client_channel/subchannel.h +6 -2
  52. data/src/core/ext/client_channel/uri_parser.c +26 -14
  53. data/src/core/ext/client_channel/uri_parser.h +3 -1
  54. data/src/core/ext/lb_policy/grpclb/grpclb.c +220 -209
  55. data/src/core/ext/lb_policy/grpclb/grpclb_channel.h +56 -0
  56. data/src/core/ext/lb_policy/grpclb/grpclb_channel_secure.c +107 -0
  57. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +3 -6
  58. data/src/core/ext/lb_policy/pick_first/pick_first.c +71 -116
  59. data/src/core/ext/lb_policy/round_robin/round_robin.c +52 -67
  60. data/src/core/ext/load_reporting/load_reporting.c +20 -0
  61. data/src/core/ext/load_reporting/load_reporting.h +1 -16
  62. data/src/core/ext/load_reporting/load_reporting_filter.c +28 -54
  63. data/src/core/ext/resolver/dns/native/dns_resolver.c +31 -45
  64. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +20 -29
  65. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +11 -8
  66. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +11 -2
  67. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +143 -46
  68. data/src/core/ext/transport/chttp2/server/chttp2_server.c +12 -50
  69. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +1 -1
  70. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +1 -1
  71. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +7 -7
  72. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +1 -2
  73. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -2
  74. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  75. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +606 -374
  76. data/src/core/ext/transport/chttp2/transport/frame_ping.c +17 -5
  77. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -2
  78. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +9 -13
  79. data/src/core/ext/transport/chttp2/transport/frame_settings.c +12 -11
  80. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -1
  81. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +5 -6
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +100 -53
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -2
  84. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +126 -70
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +13 -7
  86. data/src/core/ext/transport/chttp2/transport/hpack_table.c +22 -19
  87. data/src/core/ext/transport/chttp2/transport/hpack_table.h +6 -6
  88. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +23 -11
  89. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +6 -2
  90. data/src/core/ext/transport/chttp2/transport/internal.h +169 -42
  91. data/src/core/ext/transport/chttp2/transport/parsing.c +98 -41
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.c +29 -14
  93. data/src/core/ext/transport/chttp2/transport/writing.c +137 -15
  94. data/src/core/lib/channel/channel_stack.c +14 -44
  95. data/src/core/lib/channel/channel_stack.h +10 -17
  96. data/src/core/lib/channel/channel_stack_builder.c +2 -3
  97. data/src/core/lib/channel/compress_filter.c +54 -46
  98. data/src/core/lib/channel/connected_channel.c +4 -4
  99. data/src/core/lib/channel/connected_channel.h +5 -0
  100. data/src/core/lib/channel/context.h +3 -0
  101. data/src/core/lib/channel/deadline_filter.c +61 -61
  102. data/src/core/lib/channel/deadline_filter.h +8 -5
  103. data/src/core/lib/channel/handshaker.c +47 -7
  104. data/src/core/lib/channel/handshaker.h +21 -3
  105. data/src/core/lib/channel/http_client_filter.c +149 -99
  106. data/src/core/lib/channel/http_server_filter.c +163 -147
  107. data/src/core/lib/channel/message_size_filter.c +15 -10
  108. data/src/core/lib/compression/algorithm_metadata.h +4 -4
  109. data/src/core/lib/compression/compression.c +17 -23
  110. data/src/core/lib/http/httpcli.c +3 -2
  111. data/src/core/lib/http/httpcli.h +2 -1
  112. data/src/core/lib/http/httpcli_security_connector.c +2 -3
  113. data/src/core/lib/http/parser.c +2 -2
  114. data/src/core/lib/iomgr/closure.c +6 -3
  115. data/src/core/lib/iomgr/closure.h +4 -2
  116. data/src/core/lib/iomgr/combiner.c +35 -5
  117. data/src/core/lib/iomgr/combiner.h +21 -2
  118. data/src/core/lib/iomgr/endpoint.c +3 -2
  119. data/src/core/lib/iomgr/endpoint.h +3 -2
  120. data/src/core/lib/iomgr/error.c +60 -94
  121. data/src/core/lib/iomgr/error.h +7 -10
  122. data/src/core/lib/iomgr/error_internal.h +54 -0
  123. data/src/core/lib/iomgr/ev_epoll_linux.c +253 -109
  124. data/src/core/lib/iomgr/ev_poll_posix.c +61 -29
  125. data/src/core/lib/iomgr/ev_posix.c +7 -8
  126. data/src/core/lib/iomgr/ev_posix.h +4 -4
  127. data/src/core/lib/iomgr/exec_ctx.c +11 -6
  128. data/src/core/lib/iomgr/exec_ctx.h +11 -14
  129. data/src/core/lib/iomgr/executor.c +2 -2
  130. data/src/core/lib/iomgr/load_file.c +1 -1
  131. data/src/core/lib/iomgr/network_status_tracker.c +5 -81
  132. data/src/core/lib/iomgr/pollset.h +1 -3
  133. data/src/core/lib/iomgr/pollset_set.h +2 -1
  134. data/src/core/lib/iomgr/pollset_set_uv.c +2 -1
  135. data/src/core/lib/iomgr/pollset_set_windows.c +2 -1
  136. data/src/core/lib/iomgr/pollset_uv.c +25 -11
  137. data/src/core/lib/iomgr/pollset_windows.c +0 -11
  138. data/src/core/lib/iomgr/resolve_address_uv.c +50 -2
  139. data/src/core/lib/iomgr/resource_quota.c +41 -11
  140. data/src/core/lib/iomgr/resource_quota.h +6 -0
  141. data/src/core/lib/iomgr/sockaddr_utils.c +33 -17
  142. data/src/core/lib/iomgr/sockaddr_utils.h +4 -0
  143. data/src/core/lib/iomgr/tcp_client_posix.c +2 -3
  144. data/src/core/lib/iomgr/tcp_client_uv.c +1 -3
  145. data/src/core/lib/iomgr/tcp_client_windows.c +21 -6
  146. data/src/core/lib/iomgr/tcp_posix.c +4 -5
  147. data/src/core/lib/iomgr/tcp_server_posix.c +269 -94
  148. data/src/core/lib/iomgr/tcp_server_windows.c +1 -1
  149. data/src/core/lib/iomgr/tcp_uv.c +11 -5
  150. data/src/core/lib/iomgr/tcp_windows.c +20 -7
  151. data/src/core/lib/iomgr/timer_generic.c +15 -22
  152. data/src/core/lib/iomgr/timer_generic.h +1 -1
  153. data/src/core/lib/iomgr/timer_uv.c +10 -6
  154. data/src/core/lib/iomgr/timer_uv.h +1 -1
  155. data/src/core/lib/iomgr/udp_server.c +45 -6
  156. data/src/core/lib/iomgr/udp_server.h +7 -1
  157. data/src/core/lib/iomgr/unix_sockets_posix.c +11 -1
  158. data/src/core/lib/json/json.c +1 -2
  159. data/src/core/lib/profiling/basic_timers.c +17 -3
  160. data/src/core/lib/security/context/security_context.c +3 -10
  161. data/src/core/lib/security/credentials/composite/composite_credentials.c +4 -8
  162. data/src/core/lib/security/credentials/credentials.c +48 -2
  163. data/src/core/lib/security/credentials/credentials.h +13 -0
  164. data/src/core/lib/security/credentials/credentials_metadata.c +1 -2
  165. data/src/core/lib/security/credentials/fake/fake_credentials.c +6 -8
  166. data/src/core/lib/security/credentials/fake/fake_credentials.h +15 -0
  167. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +3 -3
  168. data/src/core/lib/security/credentials/iam/iam_credentials.c +1 -2
  169. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -2
  170. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +5 -8
  171. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  172. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +3 -5
  173. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +15 -13
  174. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +2 -4
  175. data/src/core/lib/security/transport/client_auth_filter.c +72 -47
  176. data/src/core/lib/security/transport/lb_targets_info.c +70 -0
  177. data/src/core/lib/security/transport/lb_targets_info.h +47 -0
  178. data/src/core/lib/security/transport/secure_endpoint.c +3 -3
  179. data/src/core/lib/security/transport/security_connector.c +125 -28
  180. data/src/core/lib/security/transport/security_connector.h +4 -3
  181. data/src/core/lib/security/transport/security_handshaker.c +13 -9
  182. data/src/core/lib/security/transport/server_auth_filter.c +31 -40
  183. data/src/core/lib/security/util/b64.c +1 -1
  184. data/src/core/lib/slice/slice.c +110 -20
  185. data/src/core/lib/slice/slice_buffer.c +92 -39
  186. data/src/core/lib/{transport/mdstr_hash_table.c → slice/slice_hash_table.c} +40 -33
  187. data/src/core/lib/{transport/mdstr_hash_table.h → slice/slice_hash_table.h} +21 -21
  188. data/src/core/lib/slice/slice_intern.c +346 -0
  189. data/src/core/lib/slice/slice_internal.h +15 -0
  190. data/src/core/lib/slice/slice_string_helpers.c +5 -0
  191. data/src/core/lib/slice/slice_string_helpers.h +5 -0
  192. data/src/core/lib/support/alloc.c +26 -1
  193. data/src/core/lib/support/cmdline.c +2 -4
  194. data/src/core/lib/support/cpu_posix.c +2 -7
  195. data/src/core/lib/support/histogram.c +1 -2
  196. data/src/core/lib/support/log_posix.c +8 -4
  197. data/src/core/lib/support/spinlock.h +52 -0
  198. data/src/core/lib/support/subprocess_posix.c +1 -2
  199. data/src/core/lib/support/sync.c +7 -1
  200. data/src/core/lib/support/sync_posix.c +9 -0
  201. data/src/core/lib/support/time_windows.c +7 -1
  202. data/src/core/lib/surface/call.c +647 -629
  203. data/src/core/lib/surface/call.h +4 -1
  204. data/src/core/lib/surface/call_details.c +8 -2
  205. data/src/core/lib/surface/call_log_batch.c +17 -6
  206. data/src/core/lib/surface/channel.c +49 -59
  207. data/src/core/lib/surface/channel.h +5 -6
  208. data/src/core/lib/surface/completion_queue.c +16 -45
  209. data/src/core/lib/surface/completion_queue.h +0 -3
  210. data/src/core/lib/surface/init.c +6 -2
  211. data/src/core/lib/surface/init_secure.c +1 -1
  212. data/src/core/lib/surface/lame_client.c +14 -4
  213. data/src/core/lib/surface/server.c +79 -82
  214. data/src/core/lib/surface/validate_metadata.c +46 -15
  215. data/src/core/lib/surface/validate_metadata.h +43 -0
  216. data/src/core/lib/surface/version.c +2 -2
  217. data/src/core/lib/transport/bdp_estimator.c +104 -0
  218. data/src/core/lib/transport/bdp_estimator.h +76 -0
  219. data/src/core/lib/transport/connectivity_state.c +33 -13
  220. data/src/core/lib/transport/connectivity_state.h +15 -5
  221. data/src/core/lib/transport/error_utils.c +124 -0
  222. data/src/core/lib/transport/error_utils.h +56 -0
  223. data/src/core/{ext/transport/chttp2 → lib}/transport/http2_errors.h +18 -18
  224. data/src/core/lib/transport/metadata.c +259 -503
  225. data/src/core/lib/transport/metadata.h +69 -68
  226. data/src/core/lib/transport/metadata_batch.c +183 -63
  227. data/src/core/lib/transport/metadata_batch.h +50 -26
  228. data/src/core/lib/transport/pid_controller.c +28 -8
  229. data/src/core/lib/transport/pid_controller.h +15 -2
  230. data/src/core/lib/transport/service_config.c +21 -18
  231. data/src/core/lib/transport/service_config.h +5 -5
  232. data/src/core/lib/transport/static_metadata.c +753 -112
  233. data/src/core/lib/transport/static_metadata.h +403 -264
  234. data/src/core/{ext/transport/chttp2 → lib}/transport/status_conversion.c +18 -20
  235. data/src/core/{ext/transport/chttp2 → lib}/transport/status_conversion.h +9 -10
  236. data/src/core/lib/transport/timeout_encoding.c +11 -9
  237. data/src/core/lib/transport/timeout_encoding.h +3 -1
  238. data/src/core/lib/transport/transport.c +47 -87
  239. data/src/core/lib/transport/transport.h +20 -25
  240. data/src/core/lib/transport/transport_op_string.c +7 -19
  241. data/src/core/lib/tsi/fake_transport_security.c +2 -4
  242. data/src/core/lib/tsi/ssl_transport_security.c +7 -16
  243. data/src/core/lib/tsi/transport_security.c +2 -4
  244. data/src/ruby/ext/grpc/extconf.rb +4 -1
  245. data/src/ruby/ext/grpc/rb_byte_buffer.c +7 -0
  246. data/src/ruby/ext/grpc/rb_byte_buffer.h +3 -0
  247. data/src/ruby/ext/grpc/rb_call.c +47 -46
  248. data/src/ruby/ext/grpc/rb_channel.c +21 -6
  249. data/src/ruby/ext/grpc/rb_compression_options.c +9 -6
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -2
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -8
  252. data/src/ruby/ext/grpc/rb_server.c +6 -4
  253. data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
  254. data/src/ruby/lib/grpc/version.rb +1 -1
  255. metadata +33 -9
@@ -61,7 +61,7 @@ typedef struct grpc_call_create_args {
61
61
 
62
62
  const void *server_transport_data;
63
63
 
64
- grpc_mdelem **add_initial_metadata;
64
+ grpc_mdelem *add_initial_metadata;
65
65
  size_t add_initial_metadata_count;
66
66
 
67
67
  gpr_timespec send_deadline;
@@ -110,6 +110,7 @@ void grpc_call_log_batch(char *file, int line, gpr_log_severity severity,
110
110
 
111
111
  /* Set a context pointer.
112
112
  No thread safety guarantees are made wrt this value. */
113
+ /* TODO(#9731): add exec_ctx to destroy */
113
114
  void grpc_call_context_set(grpc_call *call, grpc_context_index elem,
114
115
  void *value, void (*destroy)(void *value));
115
116
  /* Get a context pointer. */
@@ -125,6 +126,8 @@ uint8_t grpc_call_is_client(grpc_call *call);
125
126
  grpc_compression_algorithm grpc_call_compression_for_level(
126
127
  grpc_call *call, grpc_compression_level level);
127
128
 
129
+ extern int grpc_call_error_trace;
130
+
128
131
  #ifdef __cplusplus
129
132
  }
130
133
  #endif
@@ -36,15 +36,21 @@
36
36
 
37
37
  #include <string.h>
38
38
 
39
+ #include "src/core/lib/iomgr/exec_ctx.h"
40
+ #include "src/core/lib/slice/slice_internal.h"
39
41
  #include "src/core/lib/surface/api_trace.h"
40
42
 
41
43
  void grpc_call_details_init(grpc_call_details* cd) {
42
44
  GRPC_API_TRACE("grpc_call_details_init(cd=%p)", 1, (cd));
43
45
  memset(cd, 0, sizeof(*cd));
46
+ cd->method = grpc_empty_slice();
47
+ cd->host = grpc_empty_slice();
44
48
  }
45
49
 
46
50
  void grpc_call_details_destroy(grpc_call_details* cd) {
47
51
  GRPC_API_TRACE("grpc_call_details_destroy(cd=%p)", 1, (cd));
48
- gpr_free(cd->method);
49
- gpr_free(cd->host);
52
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
53
+ grpc_slice_unref_internal(&exec_ctx, cd->method);
54
+ grpc_slice_unref_internal(&exec_ctx, cd->host);
55
+ grpc_exec_ctx_finish(&exec_ctx);
50
56
  }
@@ -35,17 +35,22 @@
35
35
 
36
36
  #include <grpc/support/alloc.h>
37
37
  #include <grpc/support/string_util.h>
38
+ #include "src/core/lib/slice/slice_string_helpers.h"
38
39
  #include "src/core/lib/support/string.h"
39
40
 
40
41
  static void add_metadata(gpr_strvec *b, const grpc_metadata *md, size_t count) {
41
42
  size_t i;
43
+ if (md == NULL) {
44
+ gpr_strvec_add(b, gpr_strdup("(nil)"));
45
+ return;
46
+ }
42
47
  for (i = 0; i < count; i++) {
43
48
  gpr_strvec_add(b, gpr_strdup("\nkey="));
44
- gpr_strvec_add(b, gpr_strdup(md[i].key));
49
+ gpr_strvec_add(b, grpc_slice_to_c_string(md[i].key));
45
50
 
46
51
  gpr_strvec_add(b, gpr_strdup(" value="));
47
- gpr_strvec_add(b, gpr_dump(md[i].value, md[i].value_length,
48
- GPR_DUMP_HEX | GPR_DUMP_ASCII));
52
+ gpr_strvec_add(b,
53
+ grpc_dump_slice(md[i].value, GPR_DUMP_HEX | GPR_DUMP_ASCII));
49
54
  }
50
55
  }
51
56
 
@@ -71,10 +76,16 @@ char *grpc_op_string(const grpc_op *op) {
71
76
  gpr_strvec_add(&b, gpr_strdup("SEND_CLOSE_FROM_CLIENT"));
72
77
  break;
73
78
  case GRPC_OP_SEND_STATUS_FROM_SERVER:
74
- gpr_asprintf(&tmp, "SEND_STATUS_FROM_SERVER status=%d details=%s",
75
- op->data.send_status_from_server.status,
76
- op->data.send_status_from_server.status_details);
79
+ gpr_asprintf(&tmp, "SEND_STATUS_FROM_SERVER status=%d details=",
80
+ op->data.send_status_from_server.status);
77
81
  gpr_strvec_add(&b, tmp);
82
+ if (op->data.send_status_from_server.status_details != NULL) {
83
+ gpr_strvec_add(&b, grpc_dump_slice(
84
+ *op->data.send_status_from_server.status_details,
85
+ GPR_DUMP_ASCII));
86
+ } else {
87
+ gpr_strvec_add(&b, gpr_strdup("(null)"));
88
+ }
78
89
  add_metadata(&b, op->data.send_status_from_server.trailing_metadata,
79
90
  op->data.send_status_from_server.trailing_metadata_count);
80
91
  break;
@@ -43,6 +43,7 @@
43
43
 
44
44
  #include "src/core/lib/channel/channel_args.h"
45
45
  #include "src/core/lib/iomgr/iomgr.h"
46
+ #include "src/core/lib/slice/slice_internal.h"
46
47
  #include "src/core/lib/support/string.h"
47
48
  #include "src/core/lib/surface/api_trace.h"
48
49
  #include "src/core/lib/surface/call.h"
@@ -57,15 +58,15 @@
57
58
  #define NUM_CACHED_STATUS_ELEMS 3
58
59
 
59
60
  typedef struct registered_call {
60
- grpc_mdelem *path;
61
- grpc_mdelem *authority;
61
+ grpc_mdelem path;
62
+ grpc_mdelem authority;
62
63
  struct registered_call *next;
63
64
  } registered_call;
64
65
 
65
66
  struct grpc_channel {
66
67
  int is_client;
67
68
  grpc_compression_options compression_options;
68
- grpc_mdelem *default_authority;
69
+ grpc_mdelem default_authority;
69
70
 
70
71
  gpr_mu registered_call_mu;
71
72
  registered_call *registered_calls;
@@ -102,9 +103,8 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
102
103
  exec_ctx, builder, sizeof(grpc_channel), 1, destroy_channel, NULL,
103
104
  (void **)&channel);
104
105
  if (error != GRPC_ERROR_NONE) {
105
- const char *msg = grpc_error_string(error);
106
- gpr_log(GPR_ERROR, "channel stack builder failed: %s", msg);
107
- grpc_error_free_string(msg);
106
+ gpr_log(GPR_ERROR, "channel stack builder failed: %s",
107
+ grpc_error_string(error));
108
108
  GRPC_ERROR_UNREF(error);
109
109
  goto done;
110
110
  }
@@ -116,19 +116,20 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
116
116
  channel->registered_calls = NULL;
117
117
 
118
118
  grpc_compression_options_init(&channel->compression_options);
119
-
120
119
  for (size_t i = 0; i < args->num_args; i++) {
121
120
  if (0 == strcmp(args->args[i].key, GRPC_ARG_DEFAULT_AUTHORITY)) {
122
121
  if (args->args[i].type != GRPC_ARG_STRING) {
123
122
  gpr_log(GPR_ERROR, "%s ignored: it must be a string",
124
123
  GRPC_ARG_DEFAULT_AUTHORITY);
125
124
  } else {
126
- if (channel->default_authority) {
125
+ if (!GRPC_MDISNULL(channel->default_authority)) {
127
126
  /* setting this takes precedence over anything else */
128
127
  GRPC_MDELEM_UNREF(exec_ctx, channel->default_authority);
129
128
  }
130
- channel->default_authority = grpc_mdelem_from_strings(
131
- exec_ctx, ":authority", args->args[i].value.string);
129
+ channel->default_authority = grpc_mdelem_from_slices(
130
+ exec_ctx, GRPC_MDSTR_AUTHORITY,
131
+ grpc_slice_intern(
132
+ grpc_slice_from_static_string(args->args[i].value.string)));
132
133
  }
133
134
  } else if (0 ==
134
135
  strcmp(args->args[i].key, GRPC_SSL_TARGET_NAME_OVERRIDE_ARG)) {
@@ -136,14 +137,16 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
136
137
  gpr_log(GPR_ERROR, "%s ignored: it must be a string",
137
138
  GRPC_SSL_TARGET_NAME_OVERRIDE_ARG);
138
139
  } else {
139
- if (channel->default_authority) {
140
+ if (!GRPC_MDISNULL(channel->default_authority)) {
140
141
  /* other ways of setting this (notably ssl) take precedence */
141
142
  gpr_log(GPR_ERROR,
142
143
  "%s ignored: default host already set some other way",
143
144
  GRPC_SSL_TARGET_NAME_OVERRIDE_ARG);
144
145
  } else {
145
- channel->default_authority = grpc_mdelem_from_strings(
146
- exec_ctx, ":authority", args->args[i].value.string);
146
+ channel->default_authority = grpc_mdelem_from_slices(
147
+ exec_ctx, GRPC_MDSTR_AUTHORITY,
148
+ grpc_slice_intern(
149
+ grpc_slice_from_static_string(args->args[i].value.string)));
147
150
  }
148
151
  }
149
152
  } else if (0 == strcmp(args->args[i].key,
@@ -191,18 +194,18 @@ void grpc_channel_get_info(grpc_channel *channel,
191
194
  static grpc_call *grpc_channel_create_call_internal(
192
195
  grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_call *parent_call,
193
196
  uint32_t propagation_mask, grpc_completion_queue *cq,
194
- grpc_pollset_set *pollset_set_alternative, grpc_mdelem *path_mdelem,
195
- grpc_mdelem *authority_mdelem, gpr_timespec deadline) {
196
- grpc_mdelem *send_metadata[2];
197
+ grpc_pollset_set *pollset_set_alternative, grpc_mdelem path_mdelem,
198
+ grpc_mdelem authority_mdelem, gpr_timespec deadline) {
199
+ grpc_mdelem send_metadata[2];
197
200
  size_t num_metadata = 0;
198
201
 
199
202
  GPR_ASSERT(channel->is_client);
200
203
  GPR_ASSERT(!(cq != NULL && pollset_set_alternative != NULL));
201
204
 
202
205
  send_metadata[num_metadata++] = path_mdelem;
203
- if (authority_mdelem != NULL) {
206
+ if (!GRPC_MDISNULL(authority_mdelem)) {
204
207
  send_metadata[num_metadata++] = authority_mdelem;
205
- } else if (channel->default_authority != NULL) {
208
+ } else if (!GRPC_MDISNULL(channel->default_authority)) {
206
209
  send_metadata[num_metadata++] = GRPC_MDELEM_REF(channel->default_authority);
207
210
  }
208
211
 
@@ -227,27 +230,17 @@ grpc_call *grpc_channel_create_call(grpc_channel *channel,
227
230
  grpc_call *parent_call,
228
231
  uint32_t propagation_mask,
229
232
  grpc_completion_queue *cq,
230
- const char *method, const char *host,
233
+ grpc_slice method, const grpc_slice *host,
231
234
  gpr_timespec deadline, void *reserved) {
232
- GRPC_API_TRACE(
233
- "grpc_channel_create_call("
234
- "channel=%p, parent_call=%p, propagation_mask=%x, cq=%p, method=%s, "
235
- "host=%s, "
236
- "deadline=gpr_timespec { tv_sec: %" PRId64
237
- ", tv_nsec: %d, clock_type: %d }, "
238
- "reserved=%p)",
239
- 10,
240
- (channel, parent_call, (unsigned)propagation_mask, cq, method, host,
241
- deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type, reserved));
242
235
  GPR_ASSERT(!reserved);
243
236
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
244
237
  grpc_call *call = grpc_channel_create_call_internal(
245
238
  &exec_ctx, channel, parent_call, propagation_mask, cq, NULL,
246
- grpc_mdelem_from_metadata_strings(&exec_ctx, GRPC_MDSTR_PATH,
247
- grpc_mdstr_from_string(method)),
248
- host ? grpc_mdelem_from_metadata_strings(&exec_ctx, GRPC_MDSTR_AUTHORITY,
249
- grpc_mdstr_from_string(host))
250
- : NULL,
239
+ grpc_mdelem_from_slices(&exec_ctx, GRPC_MDSTR_PATH,
240
+ grpc_slice_ref_internal(method)),
241
+ host != NULL ? grpc_mdelem_from_slices(&exec_ctx, GRPC_MDSTR_AUTHORITY,
242
+ grpc_slice_ref_internal(*host))
243
+ : GRPC_MDNULL,
251
244
  deadline);
252
245
  grpc_exec_ctx_finish(&exec_ctx);
253
246
  return call;
@@ -255,17 +248,16 @@ grpc_call *grpc_channel_create_call(grpc_channel *channel,
255
248
 
256
249
  grpc_call *grpc_channel_create_pollset_set_call(
257
250
  grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_call *parent_call,
258
- uint32_t propagation_mask, grpc_pollset_set *pollset_set,
259
- const char *method, const char *host, gpr_timespec deadline,
260
- void *reserved) {
251
+ uint32_t propagation_mask, grpc_pollset_set *pollset_set, grpc_slice method,
252
+ const grpc_slice *host, gpr_timespec deadline, void *reserved) {
261
253
  GPR_ASSERT(!reserved);
262
254
  return grpc_channel_create_call_internal(
263
255
  exec_ctx, channel, parent_call, propagation_mask, NULL, pollset_set,
264
- grpc_mdelem_from_metadata_strings(exec_ctx, GRPC_MDSTR_PATH,
265
- grpc_mdstr_from_string(method)),
266
- host ? grpc_mdelem_from_metadata_strings(exec_ctx, GRPC_MDSTR_AUTHORITY,
267
- grpc_mdstr_from_string(host))
268
- : NULL,
256
+ grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_PATH,
257
+ grpc_slice_ref_internal(method)),
258
+ host != NULL ? grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_AUTHORITY,
259
+ grpc_slice_ref_internal(*host))
260
+ : GRPC_MDNULL,
269
261
  deadline);
270
262
  }
271
263
 
@@ -277,12 +269,15 @@ void *grpc_channel_register_call(grpc_channel *channel, const char *method,
277
269
  4, (channel, method, host, reserved));
278
270
  GPR_ASSERT(!reserved);
279
271
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
280
- rc->path = grpc_mdelem_from_metadata_strings(&exec_ctx, GRPC_MDSTR_PATH,
281
- grpc_mdstr_from_string(method));
272
+
273
+ rc->path = grpc_mdelem_from_slices(
274
+ &exec_ctx, GRPC_MDSTR_PATH,
275
+ grpc_slice_intern(grpc_slice_from_static_string(method)));
282
276
  rc->authority =
283
- host ? grpc_mdelem_from_metadata_strings(&exec_ctx, GRPC_MDSTR_AUTHORITY,
284
- grpc_mdstr_from_string(host))
285
- : NULL;
277
+ host ? grpc_mdelem_from_slices(
278
+ &exec_ctx, GRPC_MDSTR_AUTHORITY,
279
+ grpc_slice_intern(grpc_slice_from_static_string(host)))
280
+ : GRPC_MDNULL;
286
281
  gpr_mu_lock(&channel->registered_call_mu);
287
282
  rc->next = channel->registered_calls;
288
283
  channel->registered_calls = rc;
@@ -310,8 +305,7 @@ grpc_call *grpc_channel_create_registered_call(
310
305
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
311
306
  grpc_call *call = grpc_channel_create_call_internal(
312
307
  &exec_ctx, channel, parent_call, propagation_mask, completion_queue, NULL,
313
- GRPC_MDELEM_REF(rc->path),
314
- rc->authority ? GRPC_MDELEM_REF(rc->authority) : NULL, deadline);
308
+ GRPC_MDELEM_REF(rc->path), GRPC_MDELEM_REF(rc->authority), deadline);
315
309
  grpc_exec_ctx_finish(&exec_ctx);
316
310
  return call;
317
311
  }
@@ -340,14 +334,10 @@ static void destroy_channel(grpc_exec_ctx *exec_ctx, void *arg,
340
334
  registered_call *rc = channel->registered_calls;
341
335
  channel->registered_calls = rc->next;
342
336
  GRPC_MDELEM_UNREF(exec_ctx, rc->path);
343
- if (rc->authority) {
344
- GRPC_MDELEM_UNREF(exec_ctx, rc->authority);
345
- }
337
+ GRPC_MDELEM_UNREF(exec_ctx, rc->authority);
346
338
  gpr_free(rc);
347
339
  }
348
- if (channel->default_authority != NULL) {
349
- GRPC_MDELEM_UNREF(exec_ctx, channel->default_authority);
350
- }
340
+ GRPC_MDELEM_UNREF(exec_ctx, channel->default_authority);
351
341
  gpr_mu_destroy(&channel->registered_call_mu);
352
342
  gpr_free(channel->target);
353
343
  gpr_free(channel);
@@ -376,8 +366,8 @@ grpc_compression_options grpc_channel_compression_options(
376
366
  return channel->compression_options;
377
367
  }
378
368
 
379
- grpc_mdelem *grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
380
- grpc_channel *channel, int i) {
369
+ grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
370
+ grpc_channel *channel, int i) {
381
371
  char tmp[GPR_LTOA_MIN_BUFSIZE];
382
372
  switch (i) {
383
373
  case 0:
@@ -388,6 +378,6 @@ grpc_mdelem *grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
388
378
  return GRPC_MDELEM_GRPC_STATUS_2;
389
379
  }
390
380
  gpr_ltoa(i, tmp);
391
- return grpc_mdelem_from_metadata_strings(exec_ctx, GRPC_MDSTR_GRPC_STATUS,
392
- grpc_mdstr_from_string(tmp));
381
+ return grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_STATUS,
382
+ grpc_slice_from_copied_string(tmp));
393
383
  }
@@ -52,9 +52,8 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target,
52
52
  value of \a propagation_mask (see propagation_bits.h for possible values) */
53
53
  grpc_call *grpc_channel_create_pollset_set_call(
54
54
  grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_call *parent_call,
55
- uint32_t propagation_mask, grpc_pollset_set *pollset_set,
56
- const char *method, const char *host, gpr_timespec deadline,
57
- void *reserved);
55
+ uint32_t propagation_mask, grpc_pollset_set *pollset_set, grpc_slice method,
56
+ const grpc_slice *host, gpr_timespec deadline, void *reserved);
58
57
 
59
58
  /** Get a (borrowed) pointer to this channels underlying channel stack */
60
59
  grpc_channel_stack *grpc_channel_get_channel_stack(grpc_channel *channel);
@@ -63,9 +62,9 @@ grpc_channel_stack *grpc_channel_get_channel_stack(grpc_channel *channel);
63
62
  status_code.
64
63
 
65
64
  The returned elem is owned by the caller. */
66
- grpc_mdelem *grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
67
- grpc_channel *channel,
68
- int status_code);
65
+ grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx,
66
+ grpc_channel *channel,
67
+ int status_code);
69
68
 
70
69
  #ifdef GRPC_STREAM_REFCOUNT_DEBUG
71
70
  void grpc_channel_internal_ref(grpc_channel *channel, const char *reason);
@@ -96,9 +96,6 @@ struct grpc_completion_queue {
96
96
  #define POLLSET_FROM_CQ(cq) ((grpc_pollset *)(cq + 1))
97
97
  #define CQ_FROM_POLLSET(ps) (((grpc_completion_queue *)ps) - 1)
98
98
 
99
- static gpr_mu g_freelist_mu;
100
- static grpc_completion_queue *g_freelist;
101
-
102
99
  int grpc_cq_pluck_trace;
103
100
  int grpc_cq_event_timeout_trace;
104
101
 
@@ -113,21 +110,6 @@ int grpc_cq_event_timeout_trace;
113
110
  static void on_pollset_shutdown_done(grpc_exec_ctx *exec_ctx, void *cc,
114
111
  grpc_error *error);
115
112
 
116
- void grpc_cq_global_init(void) { gpr_mu_init(&g_freelist_mu); }
117
-
118
- void grpc_cq_global_shutdown(void) {
119
- gpr_mu_destroy(&g_freelist_mu);
120
- while (g_freelist) {
121
- grpc_completion_queue *next = g_freelist->next_free;
122
- grpc_pollset_destroy(POLLSET_FROM_CQ(g_freelist));
123
- #ifndef NDEBUG
124
- gpr_free(g_freelist->outstanding_tags);
125
- #endif
126
- gpr_free(g_freelist);
127
- g_freelist = next;
128
- }
129
- }
130
-
131
113
  grpc_completion_queue *grpc_completion_queue_create(void *reserved) {
132
114
  grpc_completion_queue *cc;
133
115
  GPR_ASSERT(!reserved);
@@ -136,22 +118,12 @@ grpc_completion_queue *grpc_completion_queue_create(void *reserved) {
136
118
 
137
119
  GRPC_API_TRACE("grpc_completion_queue_create(reserved=%p)", 1, (reserved));
138
120
 
139
- gpr_mu_lock(&g_freelist_mu);
140
- if (g_freelist == NULL) {
141
- gpr_mu_unlock(&g_freelist_mu);
142
-
143
- cc = gpr_malloc(sizeof(grpc_completion_queue) + grpc_pollset_size());
144
- grpc_pollset_init(POLLSET_FROM_CQ(cc), &cc->mu);
121
+ cc = gpr_zalloc(sizeof(grpc_completion_queue) + grpc_pollset_size());
122
+ grpc_pollset_init(POLLSET_FROM_CQ(cc), &cc->mu);
145
123
  #ifndef NDEBUG
146
- cc->outstanding_tags = NULL;
147
- cc->outstanding_tag_capacity = 0;
124
+ cc->outstanding_tags = NULL;
125
+ cc->outstanding_tag_capacity = 0;
148
126
  #endif
149
- } else {
150
- cc = g_freelist;
151
- g_freelist = g_freelist->next_free;
152
- gpr_mu_unlock(&g_freelist_mu);
153
- /* pollset already initialized */
154
- }
155
127
 
156
128
  /* Initial ref is dropped by grpc_completion_queue_shutdown */
157
129
  gpr_ref_init(&cc->pending_events, 1);
@@ -203,11 +175,11 @@ void grpc_cq_internal_unref(grpc_completion_queue *cc) {
203
175
  #endif
204
176
  if (gpr_unref(&cc->owning_refs)) {
205
177
  GPR_ASSERT(cc->completed_head.next == (uintptr_t)&cc->completed_head);
206
- grpc_pollset_reset(POLLSET_FROM_CQ(cc));
207
- gpr_mu_lock(&g_freelist_mu);
208
- cc->next_free = g_freelist;
209
- g_freelist = cc;
210
- gpr_mu_unlock(&g_freelist_mu);
178
+ grpc_pollset_destroy(POLLSET_FROM_CQ(cc));
179
+ #ifndef NDEBUG
180
+ gpr_free(cc->outstanding_tags);
181
+ #endif
182
+ gpr_free(cc);
211
183
  }
212
184
  }
213
185
 
@@ -253,7 +225,6 @@ void grpc_cq_end_op(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc,
253
225
  if (grpc_trace_operation_failures && error != GRPC_ERROR_NONE) {
254
226
  gpr_log(GPR_ERROR, "Operation failed: tag=%p, error=%s", tag, errmsg);
255
227
  }
256
- grpc_error_free_string(errmsg);
257
228
  }
258
229
 
259
230
  storage->tag = tag;
@@ -294,7 +265,7 @@ void grpc_cq_end_op(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc,
294
265
  if (kick_error != GRPC_ERROR_NONE) {
295
266
  const char *msg = grpc_error_string(kick_error);
296
267
  gpr_log(GPR_ERROR, "Kick failed: %s", msg);
297
- grpc_error_free_string(msg);
268
+
298
269
  GRPC_ERROR_UNREF(kick_error);
299
270
  }
300
271
  } else {
@@ -403,8 +374,8 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
403
374
  .stolen_completion = NULL,
404
375
  .tag = NULL,
405
376
  .first_loop = true};
406
- grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT_WITH_FINISH_CHECK(
407
- cq_is_next_finished, &is_finished_arg);
377
+ grpc_exec_ctx exec_ctx =
378
+ GRPC_EXEC_CTX_INITIALIZER(0, cq_is_next_finished, &is_finished_arg);
408
379
  for (;;) {
409
380
  if (is_finished_arg.stolen_completion != NULL) {
410
381
  gpr_mu_unlock(cc->mu);
@@ -461,7 +432,7 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
461
432
  gpr_mu_unlock(cc->mu);
462
433
  const char *msg = grpc_error_string(err);
463
434
  gpr_log(GPR_ERROR, "Completion queue next failed: %s", msg);
464
- grpc_error_free_string(msg);
435
+
465
436
  GRPC_ERROR_UNREF(err);
466
437
  memset(&ret, 0, sizeof(ret));
467
438
  ret.type = GRPC_QUEUE_TIMEOUT;
@@ -572,8 +543,8 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
572
543
  .stolen_completion = NULL,
573
544
  .tag = tag,
574
545
  .first_loop = true};
575
- grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT_WITH_FINISH_CHECK(
576
- cq_is_pluck_finished, &is_finished_arg);
546
+ grpc_exec_ctx exec_ctx =
547
+ GRPC_EXEC_CTX_INITIALIZER(0, cq_is_pluck_finished, &is_finished_arg);
577
548
  for (;;) {
578
549
  if (is_finished_arg.stolen_completion != NULL) {
579
550
  gpr_mu_unlock(cc->mu);
@@ -647,7 +618,7 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
647
618
  gpr_mu_unlock(cc->mu);
648
619
  const char *msg = grpc_error_string(err);
649
620
  gpr_log(GPR_ERROR, "Completion queue next failed: %s", msg);
650
- grpc_error_free_string(msg);
621
+
651
622
  GRPC_ERROR_UNREF(err);
652
623
  memset(&ret, 0, sizeof(ret));
653
624
  ret.type = GRPC_QUEUE_TIMEOUT;