grpc 1.3.4 → 1.4.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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +581 -450
  3. data/include/grpc/census.h +49 -49
  4. data/include/grpc/grpc.h +16 -70
  5. data/include/grpc/grpc_security.h +59 -59
  6. data/include/grpc/grpc_security_constants.h +9 -9
  7. data/include/grpc/impl/codegen/atm.h +1 -1
  8. data/include/grpc/impl/codegen/atm_windows.h +4 -4
  9. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -2
  10. data/include/grpc/impl/codegen/compression_types.h +4 -5
  11. data/include/grpc/impl/codegen/gpr_slice.h +5 -5
  12. data/include/grpc/impl/codegen/gpr_types.h +6 -7
  13. data/include/grpc/impl/codegen/grpc_types.h +128 -59
  14. data/include/grpc/impl/codegen/port_platform.h +6 -0
  15. data/include/grpc/impl/codegen/propagation_bits.h +2 -2
  16. data/include/grpc/impl/codegen/slice.h +13 -12
  17. data/include/grpc/impl/codegen/status.h +23 -18
  18. data/include/grpc/impl/codegen/sync.h +1 -1
  19. data/include/grpc/load_reporting.h +6 -6
  20. data/include/grpc/slice.h +47 -25
  21. data/include/grpc/slice_buffer.h +18 -14
  22. data/include/grpc/support/alloc.h +7 -7
  23. data/include/grpc/support/cmdline.h +10 -10
  24. data/include/grpc/support/cpu.h +3 -3
  25. data/include/grpc/support/histogram.h +1 -1
  26. data/include/grpc/support/host_port.h +2 -2
  27. data/include/grpc/support/log.h +9 -9
  28. data/include/grpc/support/log_windows.h +1 -1
  29. data/include/grpc/support/string_util.h +3 -3
  30. data/include/grpc/support/subprocess.h +3 -3
  31. data/include/grpc/support/sync.h +31 -31
  32. data/include/grpc/support/thd.h +11 -11
  33. data/include/grpc/support/time.h +12 -12
  34. data/include/grpc/support/tls.h +1 -1
  35. data/include/grpc/support/tls_gcc.h +2 -2
  36. data/include/grpc/support/tls_msvc.h +1 -1
  37. data/include/grpc/support/tls_pthread.h +1 -1
  38. data/include/grpc/support/useful.h +2 -2
  39. data/include/grpc/support/workaround_list.h +46 -0
  40. data/src/core/ext/census/context.c +1 -1
  41. data/src/core/ext/census/intrusive_hash_map.c +319 -0
  42. data/src/core/ext/census/intrusive_hash_map.h +167 -0
  43. data/src/core/ext/census/intrusive_hash_map_internal.h +63 -0
  44. data/src/core/ext/census/resource.c +3 -1
  45. data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
  46. data/src/core/ext/filters/client_channel/client_channel.c +173 -103
  47. data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
  48. data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
  49. data/src/core/ext/filters/client_channel/lb_policy.h +8 -7
  50. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
  52. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +405 -102
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +90 -51
  56. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +7 -1
  57. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
  58. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
  59. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
  60. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +188 -294
  61. data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
  62. data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
  63. data/src/core/ext/filters/client_channel/parse_address.c +90 -59
  64. data/src/core/ext/filters/client_channel/parse_address.h +17 -8
  65. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +11 -7
  66. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +59 -14
  67. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +6 -0
  68. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
  69. data/src/core/ext/filters/client_channel/subchannel.c +20 -17
  70. data/src/core/ext/filters/client_channel/subchannel.h +1 -0
  71. data/src/core/ext/filters/client_channel/subchannel_index.c +11 -1
  72. data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
  73. data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
  74. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
  75. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
  76. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
  77. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
  78. data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
  79. data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
  80. data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
  81. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
  82. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
  83. data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
  84. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
  85. data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
  86. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
  87. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
  88. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.c +223 -0
  89. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +40 -0
  90. data/src/core/ext/filters/workarounds/workaround_utils.c +65 -0
  91. data/src/core/ext/filters/workarounds/workaround_utils.h +52 -0
  92. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.c +3 -2
  94. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
  95. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +319 -175
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  98. data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
  99. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
  100. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
  101. data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
  102. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
  103. data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
  105. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
  107. data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
  108. data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
  109. data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
  110. data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
  111. data/src/core/lib/channel/channel_args.c +30 -9
  112. data/src/core/lib/channel/channel_args.h +5 -1
  113. data/src/core/lib/channel/channel_stack.c +1 -1
  114. data/src/core/lib/channel/channel_stack.h +2 -2
  115. data/src/core/lib/channel/channel_stack_builder.c +13 -1
  116. data/src/core/lib/channel/channel_stack_builder.h +5 -1
  117. data/src/core/lib/channel/connected_channel.c +3 -1
  118. data/src/core/lib/channel/context.h +2 -2
  119. data/src/core/lib/compression/message_compress.c +2 -2
  120. data/src/core/lib/debug/trace.c +13 -6
  121. data/src/core/lib/debug/trace.h +27 -1
  122. data/src/core/lib/http/httpcli.c +1 -1
  123. data/src/core/lib/http/httpcli_security_connector.c +9 -11
  124. data/src/core/lib/http/parser.c +2 -2
  125. data/src/core/lib/http/parser.h +2 -1
  126. data/src/core/lib/iomgr/combiner.c +6 -6
  127. data/src/core/lib/iomgr/combiner.h +2 -1
  128. data/src/core/lib/iomgr/error.c +12 -5
  129. data/src/core/lib/iomgr/error.h +13 -13
  130. data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
  131. data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
  132. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
  133. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
  134. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
  135. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
  136. data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
  137. data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
  138. data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +41 -33
  139. data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
  140. data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
  141. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  142. data/src/core/lib/iomgr/ev_posix.c +22 -8
  143. data/src/core/lib/iomgr/ev_posix.h +4 -3
  144. data/src/core/lib/iomgr/ev_windows.c +43 -0
  145. data/src/core/lib/iomgr/exec_ctx.c +5 -0
  146. data/src/core/lib/iomgr/exec_ctx.h +2 -0
  147. data/src/core/lib/iomgr/iomgr.c +4 -0
  148. data/src/core/lib/iomgr/iomgr.h +3 -0
  149. data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
  150. data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
  151. data/src/core/lib/iomgr/lockfree_event.c +16 -0
  152. data/src/core/lib/iomgr/pollset.h +2 -5
  153. data/src/core/lib/iomgr/pollset_uv.c +1 -1
  154. data/src/core/lib/iomgr/pollset_windows.c +3 -3
  155. data/src/core/lib/iomgr/resource_quota.c +9 -8
  156. data/src/core/lib/iomgr/resource_quota.h +2 -1
  157. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  158. data/src/core/lib/iomgr/socket_mutator.h +2 -0
  159. data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
  160. data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
  161. data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
  162. data/src/core/lib/iomgr/tcp_posix.c +7 -7
  163. data/src/core/lib/iomgr/tcp_posix.h +2 -1
  164. data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
  165. data/src/core/lib/iomgr/tcp_uv.c +6 -6
  166. data/src/core/lib/iomgr/tcp_uv.h +2 -1
  167. data/src/core/lib/iomgr/tcp_windows.c +1 -1
  168. data/src/core/lib/iomgr/timer_generic.c +24 -25
  169. data/src/core/lib/iomgr/timer_manager.c +276 -0
  170. data/src/core/lib/iomgr/timer_manager.h +52 -0
  171. data/src/core/lib/iomgr/timer_uv.c +6 -0
  172. data/src/core/lib/iomgr/udp_server.c +42 -9
  173. data/src/core/lib/iomgr/udp_server.h +3 -1
  174. data/src/core/lib/security/credentials/credentials.c +0 -1
  175. data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
  176. data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
  177. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
  178. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
  179. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
  180. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
  181. data/src/core/lib/security/transport/client_auth_filter.c +9 -3
  182. data/src/core/lib/security/transport/secure_endpoint.c +7 -7
  183. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  184. data/src/core/lib/security/transport/security_connector.c +45 -57
  185. data/src/core/lib/security/transport/security_connector.h +10 -14
  186. data/src/core/lib/security/transport/security_handshaker.c +123 -97
  187. data/src/core/lib/slice/b64.c +1 -1
  188. data/src/core/lib/slice/percent_encoding.c +3 -3
  189. data/src/core/lib/slice/slice.c +66 -33
  190. data/src/core/lib/slice/slice_buffer.c +25 -6
  191. data/src/core/lib/slice/slice_hash_table.c +33 -35
  192. data/src/core/lib/slice/slice_hash_table.h +7 -12
  193. data/src/core/lib/support/atomic.h +45 -0
  194. data/src/core/lib/support/atomic_with_atm.h +70 -0
  195. data/src/core/lib/support/atomic_with_std.h +48 -0
  196. data/src/core/lib/support/avl.c +14 -14
  197. data/src/core/lib/support/cmdline.c +3 -3
  198. data/src/core/lib/support/histogram.c +2 -2
  199. data/src/core/lib/support/host_port.c +1 -1
  200. data/src/core/lib/support/memory.h +74 -0
  201. data/src/core/lib/support/mpscq.c +36 -2
  202. data/src/core/lib/support/mpscq.h +28 -1
  203. data/src/core/lib/support/stack_lockfree.c +3 -36
  204. data/src/core/lib/support/string.c +12 -12
  205. data/src/core/lib/support/string_posix.c +1 -1
  206. data/src/core/lib/support/subprocess_posix.c +2 -2
  207. data/src/core/lib/support/thd_posix.c +1 -1
  208. data/src/core/lib/support/time_posix.c +8 -0
  209. data/src/core/lib/support/tmpfile_posix.c +10 -10
  210. data/src/core/lib/surface/alarm.c +3 -1
  211. data/src/core/lib/surface/api_trace.c +2 -1
  212. data/src/core/lib/surface/api_trace.h +2 -2
  213. data/src/core/lib/surface/byte_buffer_reader.c +1 -1
  214. data/src/core/lib/surface/call.c +65 -22
  215. data/src/core/lib/surface/call.h +4 -2
  216. data/src/core/lib/surface/channel_init.c +2 -19
  217. data/src/core/lib/surface/channel_stack_type.c +18 -0
  218. data/src/core/lib/surface/channel_stack_type.h +2 -0
  219. data/src/core/lib/surface/completion_queue.c +694 -247
  220. data/src/core/lib/surface/completion_queue.h +30 -13
  221. data/src/core/lib/surface/completion_queue_factory.c +24 -9
  222. data/src/core/lib/surface/init.c +1 -52
  223. data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
  224. data/src/core/lib/surface/server.c +79 -110
  225. data/src/core/lib/surface/server.h +2 -1
  226. data/src/core/lib/surface/version.c +2 -2
  227. data/src/core/lib/transport/bdp_estimator.c +25 -9
  228. data/src/core/lib/transport/bdp_estimator.h +7 -1
  229. data/src/core/lib/transport/byte_stream.c +23 -9
  230. data/src/core/lib/transport/byte_stream.h +15 -6
  231. data/src/core/lib/transport/connectivity_state.c +6 -6
  232. data/src/core/lib/transport/connectivity_state.h +2 -1
  233. data/src/core/lib/transport/service_config.c +6 -13
  234. data/src/core/lib/transport/service_config.h +2 -2
  235. data/src/core/lib/transport/static_metadata.c +403 -389
  236. data/src/core/lib/transport/static_metadata.h +127 -114
  237. data/src/core/plugin_registry/grpc_plugin_registry.c +16 -0
  238. data/src/core/tsi/fake_transport_security.c +5 -4
  239. data/src/core/tsi/ssl_transport_security.c +71 -82
  240. data/src/core/tsi/ssl_transport_security.h +39 -61
  241. data/src/core/tsi/transport_security.c +83 -2
  242. data/src/core/tsi/transport_security.h +27 -2
  243. data/src/core/tsi/transport_security_adapter.c +236 -0
  244. data/src/core/tsi/transport_security_adapter.h +62 -0
  245. data/src/core/tsi/transport_security_interface.h +179 -66
  246. data/src/ruby/ext/grpc/extconf.rb +2 -1
  247. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
  248. data/src/ruby/ext/grpc/rb_call.c +56 -48
  249. data/src/ruby/ext/grpc/rb_call.h +3 -4
  250. data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
  251. data/src/ruby/ext/grpc/rb_channel.c +2 -3
  252. data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
  253. data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
  254. data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
  255. data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
  256. data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
  257. data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
  258. data/src/ruby/ext/grpc/rb_grpc.c +11 -15
  259. data/src/ruby/ext/grpc/rb_grpc.h +2 -2
  260. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +16 -6
  261. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +25 -10
  262. data/src/ruby/ext/grpc/rb_server.c +26 -28
  263. data/src/ruby/lib/grpc/grpc.rb +1 -1
  264. data/src/ruby/lib/grpc/version.rb +1 -1
  265. data/third_party/cares/config_linux/ares_config.h +36 -2
  266. data/third_party/zlib/adler32.c +14 -7
  267. data/third_party/zlib/compress.c +24 -18
  268. data/third_party/zlib/crc32.c +29 -12
  269. data/third_party/zlib/deflate.c +499 -303
  270. data/third_party/zlib/deflate.h +19 -16
  271. data/third_party/zlib/gzguts.h +16 -7
  272. data/third_party/zlib/gzlib.c +17 -14
  273. data/third_party/zlib/gzread.c +108 -48
  274. data/third_party/zlib/gzwrite.c +210 -122
  275. data/third_party/zlib/infback.c +2 -2
  276. data/third_party/zlib/inffast.c +34 -51
  277. data/third_party/zlib/inflate.c +86 -37
  278. data/third_party/zlib/inflate.h +7 -4
  279. data/third_party/zlib/inftrees.c +12 -14
  280. data/third_party/zlib/trees.c +38 -61
  281. data/third_party/zlib/uncompr.c +66 -32
  282. data/third_party/zlib/zconf.h +32 -9
  283. data/third_party/zlib/zlib.h +298 -154
  284. data/third_party/zlib/zutil.c +25 -24
  285. data/third_party/zlib/zutil.h +35 -17
  286. metadata +63 -30
@@ -0,0 +1,276 @@
1
+ /*
2
+ *
3
+ * Copyright 2017, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/lib/iomgr/timer_manager.h"
35
+
36
+ #include <grpc/support/alloc.h>
37
+ #include <grpc/support/log.h>
38
+ #include <grpc/support/thd.h>
39
+
40
+ #include "src/core/lib/debug/trace.h"
41
+ #include "src/core/lib/iomgr/timer.h"
42
+
43
+ typedef struct completed_thread {
44
+ gpr_thd_id t;
45
+ struct completed_thread *next;
46
+ } completed_thread;
47
+
48
+ extern grpc_tracer_flag grpc_timer_check_trace;
49
+
50
+ // global mutex
51
+ static gpr_mu g_mu;
52
+ // are we multi-threaded
53
+ static bool g_threaded;
54
+ // cv to wait until a thread is needed
55
+ static gpr_cv g_cv_wait;
56
+ // cv for notification when threading ends
57
+ static gpr_cv g_cv_shutdown;
58
+ // number of threads in the system
59
+ static int g_thread_count;
60
+ // number of threads sitting around waiting
61
+ static int g_waiter_count;
62
+ // linked list of threads that have completed (and need joining)
63
+ static completed_thread *g_completed_threads;
64
+ // was the manager kicked by the timer system
65
+ static bool g_kicked;
66
+ // is there a thread waiting until the next timer should fire?
67
+ static bool g_has_timed_waiter;
68
+ // generation counter to track which thread is waiting for the next timer
69
+ static uint64_t g_timed_waiter_generation;
70
+
71
+ static void timer_thread(void *unused);
72
+
73
+ static void gc_completed_threads(void) {
74
+ if (g_completed_threads != NULL) {
75
+ completed_thread *to_gc = g_completed_threads;
76
+ g_completed_threads = NULL;
77
+ gpr_mu_unlock(&g_mu);
78
+ while (to_gc != NULL) {
79
+ gpr_thd_join(to_gc->t);
80
+ completed_thread *next = to_gc->next;
81
+ gpr_free(to_gc);
82
+ to_gc = next;
83
+ }
84
+ gpr_mu_lock(&g_mu);
85
+ }
86
+ }
87
+
88
+ static void start_timer_thread_and_unlock(void) {
89
+ GPR_ASSERT(g_threaded);
90
+ ++g_waiter_count;
91
+ ++g_thread_count;
92
+ gpr_mu_unlock(&g_mu);
93
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
94
+ gpr_log(GPR_DEBUG, "Spawn timer thread");
95
+ }
96
+ gpr_thd_id thd;
97
+ gpr_thd_options opt = gpr_thd_options_default();
98
+ gpr_thd_options_set_joinable(&opt);
99
+ gpr_thd_new(&thd, timer_thread, NULL, &opt);
100
+ }
101
+
102
+ void grpc_timer_manager_tick() {
103
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
104
+ gpr_timespec next = gpr_inf_future(GPR_CLOCK_MONOTONIC);
105
+ gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
106
+ grpc_timer_check(&exec_ctx, now, &next);
107
+ grpc_exec_ctx_finish(&exec_ctx);
108
+ }
109
+
110
+ static void timer_thread(void *unused) {
111
+ // this threads exec_ctx: we try to run things through to completion here
112
+ // since it's easy to spin up new threads
113
+ grpc_exec_ctx exec_ctx =
114
+ GRPC_EXEC_CTX_INITIALIZER(0, grpc_never_ready_to_finish, NULL);
115
+ const gpr_timespec inf_future = gpr_inf_future(GPR_CLOCK_MONOTONIC);
116
+ for (;;) {
117
+ gpr_timespec next = inf_future;
118
+ gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
119
+ // check timer state, updates next to the next time to run a check
120
+ if (grpc_timer_check(&exec_ctx, now, &next)) {
121
+ // if there's something to execute...
122
+ gpr_mu_lock(&g_mu);
123
+ // remove a waiter from the pool, and start another thread if necessary
124
+ --g_waiter_count;
125
+ if (g_waiter_count == 0 && g_threaded) {
126
+ start_timer_thread_and_unlock();
127
+ } else {
128
+ // if there's no thread waiting with a timeout, kick an existing waiter
129
+ // so that the next deadline is not missed
130
+ if (!g_has_timed_waiter) {
131
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
132
+ gpr_log(GPR_DEBUG, "kick untimed waiter");
133
+ }
134
+ gpr_cv_signal(&g_cv_wait);
135
+ }
136
+ gpr_mu_unlock(&g_mu);
137
+ }
138
+ // without our lock, flush the exec_ctx
139
+ grpc_exec_ctx_flush(&exec_ctx);
140
+ gpr_mu_lock(&g_mu);
141
+ // garbage collect any threads hanging out that are dead
142
+ gc_completed_threads();
143
+ // get ready to wait again
144
+ ++g_waiter_count;
145
+ gpr_mu_unlock(&g_mu);
146
+ } else {
147
+ gpr_mu_lock(&g_mu);
148
+ // if we're not threaded anymore, leave
149
+ if (!g_threaded) break;
150
+ // if there's no timed waiter, we should become one: that waiter waits
151
+ // only until the next timer should expire
152
+ // all other timers wait forever
153
+ uint64_t my_timed_waiter_generation = g_timed_waiter_generation - 1;
154
+ if (!g_has_timed_waiter) {
155
+ g_has_timed_waiter = true;
156
+ // we use a generation counter to track the timed waiter so we can
157
+ // cancel an existing one quickly (and when it actually times out it'll
158
+ // figure stuff out instead of incurring a wakeup)
159
+ my_timed_waiter_generation = ++g_timed_waiter_generation;
160
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
161
+ gpr_log(GPR_DEBUG, "sleep for a while");
162
+ }
163
+ } else {
164
+ next = inf_future;
165
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
166
+ gpr_log(GPR_DEBUG, "sleep until kicked");
167
+ }
168
+ }
169
+ gpr_cv_wait(&g_cv_wait, &g_mu, next);
170
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
171
+ gpr_log(GPR_DEBUG, "wait ended: was_timed:%d kicked:%d",
172
+ my_timed_waiter_generation == g_timed_waiter_generation,
173
+ g_kicked);
174
+ }
175
+ // if this was the timed waiter, then we need to check timers, and flag
176
+ // that there's now no timed waiter... we'll look for a replacement if
177
+ // there's work to do after checking timers (code above)
178
+ if (my_timed_waiter_generation == g_timed_waiter_generation) {
179
+ g_has_timed_waiter = false;
180
+ }
181
+ // if this was a kick from the timer system, consume it (and don't stop
182
+ // this thread yet)
183
+ if (g_kicked) {
184
+ grpc_timer_consume_kick();
185
+ g_kicked = false;
186
+ }
187
+ gpr_mu_unlock(&g_mu);
188
+ }
189
+ }
190
+ // terminate the thread: drop the waiter count, thread count, and let whomever
191
+ // stopped the threading stuff know that we're done
192
+ --g_waiter_count;
193
+ --g_thread_count;
194
+ if (0 == g_thread_count) {
195
+ gpr_cv_signal(&g_cv_shutdown);
196
+ }
197
+ completed_thread *ct = gpr_malloc(sizeof(*ct));
198
+ ct->t = gpr_thd_currentid();
199
+ ct->next = g_completed_threads;
200
+ g_completed_threads = ct;
201
+ gpr_mu_unlock(&g_mu);
202
+ grpc_exec_ctx_finish(&exec_ctx);
203
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
204
+ gpr_log(GPR_DEBUG, "End timer thread");
205
+ }
206
+ }
207
+
208
+ static void start_threads(void) {
209
+ gpr_mu_lock(&g_mu);
210
+ if (!g_threaded) {
211
+ g_threaded = true;
212
+ start_timer_thread_and_unlock();
213
+ } else {
214
+ g_threaded = false;
215
+ gpr_mu_unlock(&g_mu);
216
+ }
217
+ }
218
+
219
+ void grpc_timer_manager_init(void) {
220
+ gpr_mu_init(&g_mu);
221
+ gpr_cv_init(&g_cv_wait);
222
+ gpr_cv_init(&g_cv_shutdown);
223
+ g_threaded = false;
224
+ g_thread_count = 0;
225
+ g_waiter_count = 0;
226
+ g_completed_threads = NULL;
227
+
228
+ start_threads();
229
+ }
230
+
231
+ static void stop_threads(void) {
232
+ gpr_mu_lock(&g_mu);
233
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
234
+ gpr_log(GPR_DEBUG, "stop timer threads: threaded=%d", g_threaded);
235
+ }
236
+ if (g_threaded) {
237
+ g_threaded = false;
238
+ gpr_cv_broadcast(&g_cv_wait);
239
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
240
+ gpr_log(GPR_DEBUG, "num timer threads: %d", g_thread_count);
241
+ }
242
+ while (g_thread_count > 0) {
243
+ gpr_cv_wait(&g_cv_shutdown, &g_mu, gpr_inf_future(GPR_CLOCK_REALTIME));
244
+ if (GRPC_TRACER_ON(grpc_timer_check_trace)) {
245
+ gpr_log(GPR_DEBUG, "num timer threads: %d", g_thread_count);
246
+ }
247
+ gc_completed_threads();
248
+ }
249
+ }
250
+ gpr_mu_unlock(&g_mu);
251
+ }
252
+
253
+ void grpc_timer_manager_shutdown(void) {
254
+ stop_threads();
255
+
256
+ gpr_mu_destroy(&g_mu);
257
+ gpr_cv_destroy(&g_cv_wait);
258
+ gpr_cv_destroy(&g_cv_shutdown);
259
+ }
260
+
261
+ void grpc_timer_manager_set_threading(bool threaded) {
262
+ if (threaded) {
263
+ start_threads();
264
+ } else {
265
+ stop_threads();
266
+ }
267
+ }
268
+
269
+ void grpc_kick_poller(void) {
270
+ gpr_mu_lock(&g_mu);
271
+ g_kicked = true;
272
+ g_has_timed_waiter = false;
273
+ ++g_timed_waiter_generation;
274
+ gpr_cv_signal(&g_cv_wait);
275
+ gpr_mu_unlock(&g_mu);
276
+ }
@@ -0,0 +1,52 @@
1
+ /*
2
+ *
3
+ * Copyright 2017, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #ifndef GRPC_CORE_LIB_IOMGR_TIMER_MANAGER_H
35
+ #define GRPC_CORE_LIB_IOMGR_TIMER_MANAGER_H
36
+
37
+ #include <stdbool.h>
38
+
39
+ /* Timer Manager tries to keep one thread waiting for the next timeout at all
40
+ times */
41
+
42
+ void grpc_timer_manager_init(void);
43
+ void grpc_timer_manager_shutdown(void);
44
+
45
+ /* enable/disable threading - must be called after grpc_timer_manager_init and
46
+ * before grpc_timer_manager_shutdown */
47
+ void grpc_timer_manager_set_threading(bool enabled);
48
+ /* explicitly perform one tick of the timer system - for when threading is
49
+ * disabled */
50
+ void grpc_timer_manager_tick(void);
51
+
52
+ #endif /* GRPC_CORE_LIB_IOMGR_TIMER_MANAGER_H */
@@ -38,10 +38,14 @@
38
38
  #include <grpc/support/alloc.h>
39
39
  #include <grpc/support/log.h>
40
40
 
41
+ #include "src/core/lib/debug/trace.h"
41
42
  #include "src/core/lib/iomgr/timer.h"
42
43
 
43
44
  #include <uv.h>
44
45
 
46
+ grpc_tracer_flag grpc_timer_trace = GRPC_TRACER_INITIALIZER(false);
47
+ grpc_tracer_flag grpc_timer_check_trace = GRPC_TRACER_INITIALIZER(false);
48
+
45
49
  static void timer_close_callback(uv_handle_t *handle) { gpr_free(handle); }
46
50
 
47
51
  static void stop_uv_timer(uv_timer_t *handle) {
@@ -100,4 +104,6 @@ bool grpc_timer_check(grpc_exec_ctx *exec_ctx, gpr_timespec now,
100
104
  void grpc_timer_list_init(gpr_timespec now) {}
101
105
  void grpc_timer_list_shutdown(grpc_exec_ctx *exec_ctx) {}
102
106
 
107
+ void grpc_timer_consume_kick(void) {}
108
+
103
109
  #endif /* GRPC_UV */
@@ -79,14 +79,24 @@ struct grpc_udp_listener {
79
79
  grpc_resolved_address addr;
80
80
  grpc_closure read_closure;
81
81
  grpc_closure write_closure;
82
+ // To be called when corresponding QuicGrpcServer closes all active
83
+ // connections.
84
+ grpc_closure orphan_fd_closure;
82
85
  grpc_closure destroyed_closure;
83
86
  grpc_udp_server_read_cb read_cb;
84
87
  grpc_udp_server_write_cb write_cb;
85
88
  grpc_udp_server_orphan_cb orphan_cb;
89
+ // True if orphan_cb is trigered.
90
+ bool orphan_notified;
86
91
 
87
92
  struct grpc_udp_listener *next;
88
93
  };
89
94
 
95
+ struct shutdown_fd_args {
96
+ grpc_fd *fd;
97
+ gpr_mu *server_mu;
98
+ };
99
+
90
100
  /* the overall server */
91
101
  struct grpc_udp_server {
92
102
  gpr_mu mu;
@@ -146,6 +156,19 @@ grpc_udp_server *grpc_udp_server_create(const grpc_channel_args *args) {
146
156
  return s;
147
157
  }
148
158
 
159
+ static void shutdown_fd(grpc_exec_ctx *exec_ctx, void *args,
160
+ grpc_error *error) {
161
+ struct shutdown_fd_args *shutdown_args = (struct shutdown_fd_args *)args;
162
+ gpr_mu_lock(shutdown_args->server_mu);
163
+ grpc_fd_shutdown(exec_ctx, shutdown_args->fd, GRPC_ERROR_REF(error));
164
+ gpr_mu_unlock(shutdown_args->server_mu);
165
+ gpr_free(shutdown_args);
166
+ }
167
+
168
+ static void dummy_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
169
+ // No-op.
170
+ }
171
+
149
172
  static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) {
150
173
  if (s->shutdown_complete != NULL) {
151
174
  grpc_closure_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE);
@@ -195,12 +218,16 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) {
195
218
 
196
219
  grpc_closure_init(&sp->destroyed_closure, destroyed_port, s,
197
220
  grpc_schedule_on_exec_ctx);
198
-
199
- /* Call the orphan_cb to signal that the FD is about to be closed and
200
- * should no longer be used. */
201
- GPR_ASSERT(sp->orphan_cb);
202
- sp->orphan_cb(exec_ctx, sp->emfd, sp->server->user_data);
203
-
221
+ if (!sp->orphan_notified) {
222
+ /* Call the orphan_cb to signal that the FD is about to be closed and
223
+ * should no longer be used. Because at this point, all listening ports
224
+ * have been shutdown already, no need to shutdown again.*/
225
+ grpc_closure_init(&sp->orphan_fd_closure, dummy_cb, sp->emfd,
226
+ grpc_schedule_on_exec_ctx);
227
+ GPR_ASSERT(sp->orphan_cb);
228
+ sp->orphan_cb(exec_ctx, sp->emfd, &sp->orphan_fd_closure,
229
+ sp->server->user_data);
230
+ }
204
231
  grpc_fd_orphan(exec_ctx, sp->emfd, &sp->destroyed_closure, NULL,
205
232
  "udp_listener_shutdown");
206
233
  }
@@ -225,9 +252,14 @@ void grpc_udp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_udp_server *s,
225
252
  if (s->active_ports) {
226
253
  for (sp = s->head; sp; sp = sp->next) {
227
254
  GPR_ASSERT(sp->orphan_cb);
228
- sp->orphan_cb(exec_ctx, sp->emfd, sp->server->user_data);
229
- grpc_fd_shutdown(exec_ctx, sp->emfd, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
230
- "Server destroyed"));
255
+ struct shutdown_fd_args *args = gpr_malloc(sizeof(*args));
256
+ args->fd = sp->emfd;
257
+ args->server_mu = &s->mu;
258
+ grpc_closure_init(&sp->orphan_fd_closure, shutdown_fd, args,
259
+ grpc_schedule_on_exec_ctx);
260
+ sp->orphan_cb(exec_ctx, sp->emfd, &sp->orphan_fd_closure,
261
+ sp->server->user_data);
262
+ sp->orphan_notified = true;
231
263
  }
232
264
  gpr_mu_unlock(&s->mu);
233
265
  } else {
@@ -391,6 +423,7 @@ static int add_socket_to_server(grpc_udp_server *s, int fd,
391
423
  sp->read_cb = read_cb;
392
424
  sp->write_cb = write_cb;
393
425
  sp->orphan_cb = orphan_cb;
426
+ sp->orphan_notified = false;
394
427
  GPR_ASSERT(sp->emfd);
395
428
  gpr_mu_unlock(&s->mu);
396
429
  gpr_free(name);
@@ -55,7 +55,9 @@ typedef void (*grpc_udp_server_write_cb)(grpc_exec_ctx *exec_ctx, grpc_fd *emfd,
55
55
 
56
56
  /* Called when the grpc_fd is about to be orphaned (and the FD closed). */
57
57
  typedef void (*grpc_udp_server_orphan_cb)(grpc_exec_ctx *exec_ctx,
58
- grpc_fd *emfd, void *user_data);
58
+ grpc_fd *emfd,
59
+ grpc_closure *shutdown_fd_callback,
60
+ void *user_data);
59
61
 
60
62
  /* Create a server, initially not bound to any ports */
61
63
  grpc_udp_server *grpc_udp_server_create(const grpc_channel_args *args);