Merge branch 'master' into gpr_review

pull/14184/head
Vijay Pai 7 years ago
commit 239b7d4b0b
  1. 3
      .github/CODEOWNERS
  2. 4
      .gitmodules
  3. 24
      BUILD
  4. 81
      CMakeLists.txt
  5. 73
      Makefile
  6. 8
      bazel/grpc_deps.bzl
  7. 19
      build.yaml
  8. 6
      cmake/ssl.cmake
  9. 5
      cmake/zlib.cmake
  10. 1
      config.m4
  11. 1
      config.w32
  12. 2
      doc/compression.md
  13. 4
      examples/python/interceptors/headers/generic_client_interceptor.py
  14. 2
      gRPC-C++.podspec
  15. 5
      gRPC-Core.podspec
  16. 4
      grpc.def
  17. 4
      grpc.gemspec
  18. 4
      grpc.gyp
  19. 19
      include/grpc++/generic/generic_stub.h
  20. 13
      include/grpc++/impl/codegen/client_context.h
  21. 115
      include/grpc++/impl/codegen/completion_queue.h
  22. 12
      include/grpc++/impl/codegen/proto_utils.h
  23. 9
      include/grpc++/impl/codegen/server_context.h
  24. 48
      include/grpc/compression_ruby.h
  25. 4
      include/grpc/impl/codegen/compression_types.h
  26. 2
      include/grpc/module.modulemap
  27. 4
      package.xml
  28. 2
      requirements.txt
  29. 36
      src/compiler/cpp_generator.cc
  30. 2
      src/compiler/cpp_generator.h
  31. 3
      src/compiler/cpp_plugin.cc
  32. 3
      src/core/ext/filters/client_channel/client_channel.cc
  33. 2
      src/core/ext/filters/client_channel/http_proxy.cc
  34. 2
      src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
  35. 80
      src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc
  36. 12
      src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc
  37. 2
      src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
  38. 3
      src/core/ext/filters/client_channel/parse_address.cc
  39. 2
      src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc
  40. 2
      src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc
  41. 2
      src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
  42. 71
      src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
  43. 15
      src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h
  44. 2
      src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc
  45. 6
      src/core/ext/filters/client_channel/subchannel.cc
  46. 4
      src/core/ext/filters/client_channel/subchannel.h
  47. 8
      src/core/ext/filters/client_channel/subchannel_index.cc
  48. 160
      src/core/ext/filters/max_age/max_age_filter.cc
  49. 2
      src/core/ext/transport/cronet/transport/cronet_transport.cc
  50. 15
      src/core/lib/avl/avl.cc
  51. 37
      src/core/lib/compression/compression.cc
  52. 8
      src/core/lib/compression/compression_internal.cc
  53. 65
      src/core/lib/compression/compression_ruby.cc
  54. 2
      src/core/lib/gpr/env.h
  55. 3
      src/core/lib/gpr/host_port.cc
  56. 18
      src/core/lib/gpr/host_port.h
  57. 41
      src/core/lib/gprpp/orphanable.h
  58. 40
      src/core/lib/gprpp/ref_counted.h
  59. 18
      src/core/lib/gprpp/ref_counted_ptr.h
  60. 6
      src/core/lib/iomgr/ev_epollex_linux.cc
  61. 12
      src/core/lib/iomgr/ev_poll_posix.cc
  62. 2
      src/core/lib/iomgr/resolve_address_posix.cc
  63. 2
      src/core/lib/iomgr/resolve_address_uv.cc
  64. 3
      src/core/lib/iomgr/resolve_address_windows.cc
  65. 2
      src/core/lib/iomgr/sockaddr_utils.cc
  66. 3
      src/core/lib/iomgr/socket_utils_common_posix.cc
  67. 5
      src/core/lib/security/transport/client_auth_filter.cc
  68. 2
      src/core/lib/security/transport/security_connector.cc
  69. 1
      src/core/lib/surface/call.cc
  70. 2
      src/core/lib/surface/version.cc
  71. 457
      src/core/lib/transport/static_metadata.cc
  72. 147
      src/core/lib/transport/static_metadata.h
  73. 27
      src/core/tsi/alts_transport_security.cc
  74. 7
      src/core/tsi/alts_transport_security.h
  75. 1
      src/cpp/client/client_context.cc
  76. 1
      src/cpp/server/server_context.cc
  77. 2
      src/csharp/Grpc.Core/Internal/NativeExtension.cs
  78. 2
      src/csharp/Grpc.Core/SourceLink.csproj.include
  79. 2
      src/csharp/Grpc.IntegrationTesting/InteropClient.cs
  80. 4
      src/objective-c/GRPCClient/GRPCCall+ChannelArg.m
  81. 2
      src/objective-c/GRPCClient/private/GRPCHost.m
  82. 3
      src/objective-c/ProtoRPC/ProtoMethod.m
  83. 3
      src/objective-c/ProtoRPC/ProtoRPC.m
  84. 3
      src/objective-c/ProtoRPC/ProtoService.m
  85. 8
      src/objective-c/RxLibrary/GRXConcurrentWriteable.m
  86. 2
      src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.mm
  87. 2
      src/objective-c/tests/CronetUnitTests/CronetUnitTests.m
  88. 4
      src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi
  89. 4
      src/python/grpcio/grpc/_cython/_cygrpc/records.pyx.pxi
  90. 1
      src/python/grpcio/grpc_core_dependencies.py
  91. 2
      src/python/grpcio_tests/tests/unit/_reconnect_test.py
  92. 2
      src/ruby/bin/apis/pubsub_demo.rb
  93. 4
      src/ruby/ext/grpc/rb_channel.c
  94. 5
      src/ruby/ext/grpc/rb_compression_options.c
  95. 8
      src/ruby/ext/grpc/rb_grpc_imports.generated.c
  96. 14
      src/ruby/ext/grpc/rb_grpc_imports.generated.h
  97. 2
      src/ruby/pb/test/client.rb
  98. 2
      src/ruby/pb/test/server.rb
  99. 8
      templates/CMakeLists.txt.template
  100. 5
      templates/tools/dockerfile/grpc_clang_format/Dockerfile.template
  101. Some files were not shown because too many files have changed in this diff Show More

@ -5,5 +5,6 @@
/bazel/** @nicolasnoble @dgquintas @a11r @vjpai /bazel/** @nicolasnoble @dgquintas @a11r @vjpai
/cmake/** @jtattermusch @nicolasnoble @matt-kwong /cmake/** @jtattermusch @nicolasnoble @matt-kwong
/src/core/ext/filters/client_channel/** @markdroth @dgquintas @a11r /src/core/ext/filters/client_channel/** @markdroth @dgquintas @a11r
/test/cpp/end2end/** @vjpai @yang-g @y-zeng
/tools/dockerfile/** @jtattermusch @matt-kwong @nicolasnoble /tools/dockerfile/** @jtattermusch @matt-kwong @nicolasnoble
/tools/run_tests/performance/** @ncteisen @matt-kwong @ctiller /tools/run_tests/performance/** @ncteisen @matt-kwong @jtattermusch

4
.gitmodules vendored

@ -1,6 +1,10 @@
[submodule "third_party/zlib"] [submodule "third_party/zlib"]
path = third_party/zlib path = third_party/zlib
url = https://github.com/madler/zlib url = https://github.com/madler/zlib
# When using CMake to build, the zlib submodule ends up with a
# generated file that makes Git consider the submodule dirty. This
# state can be ignored for day-to-day development on gRPC.
ignore = dirty
[submodule "third_party/protobuf"] [submodule "third_party/protobuf"]
path = third_party/protobuf path = third_party/protobuf
url = https://github.com/google/protobuf.git url = https://github.com/google/protobuf.git

24
BUILD

@ -68,7 +68,6 @@ GPR_PUBLIC_HDRS = [
"include/grpc/support/atm_windows.h", "include/grpc/support/atm_windows.h",
"include/grpc/support/cmdline.h", "include/grpc/support/cmdline.h",
"include/grpc/support/cpu.h", "include/grpc/support/cpu.h",
"include/grpc/support/host_port.h",
"include/grpc/support/log.h", "include/grpc/support/log.h",
"include/grpc/support/log_windows.h", "include/grpc/support/log_windows.h",
"include/grpc/support/port_platform.h", "include/grpc/support/port_platform.h",
@ -91,7 +90,6 @@ GRPC_PUBLIC_HDRS = [
"include/grpc/byte_buffer.h", "include/grpc/byte_buffer.h",
"include/grpc/byte_buffer_reader.h", "include/grpc/byte_buffer_reader.h",
"include/grpc/compression.h", "include/grpc/compression.h",
"include/grpc/compression_ruby.h",
"include/grpc/fork.h", "include/grpc/fork.h",
"include/grpc/grpc.h", "include/grpc/grpc.h",
"include/grpc/grpc_posix.h", "include/grpc/grpc_posix.h",
@ -451,8 +449,6 @@ grpc_cc_library(
grpc_cc_library( grpc_cc_library(
name = "gpr_base", name = "gpr_base",
srcs = [ srcs = [
"src/core/lib/profiling/basic_timers.cc",
"src/core/lib/profiling/stap_timers.cc",
"src/core/lib/gpr/alloc.cc", "src/core/lib/gpr/alloc.cc",
"src/core/lib/gpr/arena.cc", "src/core/lib/gpr/arena.cc",
"src/core/lib/gpr/atm.cc", "src/core/lib/gpr/atm.cc",
@ -494,13 +490,14 @@ grpc_cc_library(
"src/core/lib/gpr/tmpfile_posix.cc", "src/core/lib/gpr/tmpfile_posix.cc",
"src/core/lib/gpr/tmpfile_windows.cc", "src/core/lib/gpr/tmpfile_windows.cc",
"src/core/lib/gpr/wrap_memcpy.cc", "src/core/lib/gpr/wrap_memcpy.cc",
"src/core/lib/profiling/basic_timers.cc",
"src/core/lib/profiling/stap_timers.cc",
], ],
hdrs = [ hdrs = [
"src/core/lib/profiling/timers.h",
"src/core/lib/gpr/arena.h", "src/core/lib/gpr/arena.h",
"src/core/lib/gpr/env.h", "src/core/lib/gpr/env.h",
"src/core/lib/gpr/fork.h", "src/core/lib/gpr/fork.h",
"src/core/lib/gpr/useful.h", "src/core/lib/gpr/host_port.h",
"src/core/lib/gpr/mpscq.h", "src/core/lib/gpr/mpscq.h",
"src/core/lib/gpr/murmur_hash.h", "src/core/lib/gpr/murmur_hash.h",
"src/core/lib/gpr/spinlock.h", "src/core/lib/gpr/spinlock.h",
@ -509,6 +506,8 @@ grpc_cc_library(
"src/core/lib/gpr/thd_internal.h", "src/core/lib/gpr/thd_internal.h",
"src/core/lib/gpr/time_precise.h", "src/core/lib/gpr/time_precise.h",
"src/core/lib/gpr/tmpfile.h", "src/core/lib/gpr/tmpfile.h",
"src/core/lib/gpr/useful.h",
"src/core/lib/profiling/timers.h",
], ],
language = "c++", language = "c++",
public_hdrs = GPR_PUBLIC_HDRS, public_hdrs = GPR_PUBLIC_HDRS,
@ -561,14 +560,14 @@ grpc_cc_library(
grpc_cc_library( grpc_cc_library(
name = "atomic", name = "atomic",
language = "c++",
public_hdrs = [
"src/core/lib/gprpp/atomic.h",
],
hdrs = [ hdrs = [
"src/core/lib/gprpp/atomic_with_atm.h", "src/core/lib/gprpp/atomic_with_atm.h",
"src/core/lib/gprpp/atomic_with_std.h", "src/core/lib/gprpp/atomic_with_std.h",
], ],
language = "c++",
public_hdrs = [
"src/core/lib/gprpp/atomic.h",
],
deps = [ deps = [
"gpr", "gpr",
], ],
@ -599,6 +598,7 @@ grpc_cc_library(
"debug_location", "debug_location",
"gpr++_base", "gpr++_base",
"grpc_trace", "grpc_trace",
"ref_counted_ptr",
], ],
) )
@ -610,6 +610,7 @@ grpc_cc_library(
"debug_location", "debug_location",
"gpr++_base", "gpr++_base",
"grpc_trace", "grpc_trace",
"ref_counted_ptr",
], ],
) )
@ -636,7 +637,6 @@ grpc_cc_library(
"src/core/lib/channel/handshaker_registry.cc", "src/core/lib/channel/handshaker_registry.cc",
"src/core/lib/compression/compression.cc", "src/core/lib/compression/compression.cc",
"src/core/lib/compression/compression_internal.cc", "src/core/lib/compression/compression_internal.cc",
"src/core/lib/compression/compression_ruby.cc",
"src/core/lib/compression/message_compress.cc", "src/core/lib/compression/message_compress.cc",
"src/core/lib/compression/stream_compression.cc", "src/core/lib/compression/stream_compression.cc",
"src/core/lib/compression/stream_compression_gzip.cc", "src/core/lib/compression/stream_compression_gzip.cc",
@ -888,8 +888,8 @@ grpc_cc_library(
language = "c++", language = "c++",
public_hdrs = GRPC_PUBLIC_HDRS, public_hdrs = GRPC_PUBLIC_HDRS,
deps = [ deps = [
"gpr_base",
"gpr++_base", "gpr++_base",
"gpr_base",
"grpc_codegen", "grpc_codegen",
"grpc_trace", "grpc_trace",
], ],

@ -30,10 +30,10 @@ set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}")
set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
project(${PACKAGE_NAME} C CXX) project(${PACKAGE_NAME} C CXX)
set(gRPC_INSTALL_BINDIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables")
set(gRPC_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries")
set(gRPC_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") set(gRPC_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers")
set(gRPC_INSTALL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/lib/cmake/${PACKAGE_NAME}" CACHE PATH "Installation directory for cmake config files") set(gRPC_INSTALL_CMAKEDIR "lib/cmake/${PACKAGE_NAME}" CACHE STRING "Installation directory for cmake config files")
# Options # Options
option(gRPC_BUILD_TESTS "Build tests" OFF) option(gRPC_BUILD_TESTS "Build tests" OFF)
@ -316,7 +316,6 @@ add_dependencies(buildtests_c json_rewrite_test)
add_dependencies(buildtests_c json_stream_error_test) add_dependencies(buildtests_c json_stream_error_test)
add_dependencies(buildtests_c json_test) add_dependencies(buildtests_c json_test)
add_dependencies(buildtests_c lame_client_test) add_dependencies(buildtests_c lame_client_test)
add_dependencies(buildtests_c lb_policies_test)
add_dependencies(buildtests_c load_file_test) add_dependencies(buildtests_c load_file_test)
add_dependencies(buildtests_c memory_profile_client) add_dependencies(buildtests_c memory_profile_client)
add_dependencies(buildtests_c memory_profile_server) add_dependencies(buildtests_c memory_profile_server)
@ -389,6 +388,7 @@ endif()
add_dependencies(buildtests_c public_headers_must_be_c89) add_dependencies(buildtests_c public_headers_must_be_c89)
add_dependencies(buildtests_c badreq_bad_client_test) add_dependencies(buildtests_c badreq_bad_client_test)
add_dependencies(buildtests_c connection_prefix_bad_client_test) add_dependencies(buildtests_c connection_prefix_bad_client_test)
add_dependencies(buildtests_c duplicate_header_bad_client_test)
add_dependencies(buildtests_c head_of_line_blocking_bad_client_test) add_dependencies(buildtests_c head_of_line_blocking_bad_client_test)
add_dependencies(buildtests_c headers_bad_client_test) add_dependencies(buildtests_c headers_bad_client_test)
add_dependencies(buildtests_c initial_settings_frame_bad_client_test) add_dependencies(buildtests_c initial_settings_frame_bad_client_test)
@ -705,7 +705,6 @@ foreach(_hdr
include/grpc/support/atm_windows.h include/grpc/support/atm_windows.h
include/grpc/support/cmdline.h include/grpc/support/cmdline.h
include/grpc/support/cpu.h include/grpc/support/cpu.h
include/grpc/support/host_port.h
include/grpc/support/log.h include/grpc/support/log.h
include/grpc/support/log_windows.h include/grpc/support/log_windows.h
include/grpc/support/port_platform.h include/grpc/support/port_platform.h
@ -802,7 +801,6 @@ add_library(grpc
src/core/lib/channel/handshaker_registry.cc src/core/lib/channel/handshaker_registry.cc
src/core/lib/compression/compression.cc src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_ruby.cc
src/core/lib/compression/message_compress.cc src/core/lib/compression/message_compress.cc
src/core/lib/compression/stream_compression.cc src/core/lib/compression/stream_compression.cc
src/core/lib/compression/stream_compression_gzip.cc src/core/lib/compression/stream_compression_gzip.cc
@ -1103,7 +1101,6 @@ foreach(_hdr
include/grpc/byte_buffer.h include/grpc/byte_buffer.h
include/grpc/byte_buffer_reader.h include/grpc/byte_buffer_reader.h
include/grpc/compression.h include/grpc/compression.h
include/grpc/compression_ruby.h
include/grpc/fork.h include/grpc/fork.h
include/grpc/grpc.h include/grpc/grpc.h
include/grpc/grpc_posix.h include/grpc/grpc_posix.h
@ -1145,7 +1142,6 @@ add_library(grpc_cronet
src/core/lib/channel/handshaker_registry.cc src/core/lib/channel/handshaker_registry.cc
src/core/lib/compression/compression.cc src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_ruby.cc
src/core/lib/compression/message_compress.cc src/core/lib/compression/message_compress.cc
src/core/lib/compression/stream_compression.cc src/core/lib/compression/stream_compression.cc
src/core/lib/compression/stream_compression_gzip.cc src/core/lib/compression/stream_compression_gzip.cc
@ -1470,7 +1466,6 @@ add_library(grpc_test_util
src/core/lib/channel/handshaker_registry.cc src/core/lib/channel/handshaker_registry.cc
src/core/lib/compression/compression.cc src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_ruby.cc
src/core/lib/compression/message_compress.cc src/core/lib/compression/message_compress.cc
src/core/lib/compression/stream_compression.cc src/core/lib/compression/stream_compression.cc
src/core/lib/compression/stream_compression_gzip.cc src/core/lib/compression/stream_compression_gzip.cc
@ -1739,7 +1734,6 @@ add_library(grpc_test_util_unsecure
src/core/lib/channel/handshaker_registry.cc src/core/lib/channel/handshaker_registry.cc
src/core/lib/compression/compression.cc src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_ruby.cc
src/core/lib/compression/message_compress.cc src/core/lib/compression/message_compress.cc
src/core/lib/compression/stream_compression.cc src/core/lib/compression/stream_compression.cc
src/core/lib/compression/stream_compression_gzip.cc src/core/lib/compression/stream_compression_gzip.cc
@ -1991,7 +1985,6 @@ add_library(grpc_unsecure
src/core/lib/channel/handshaker_registry.cc src/core/lib/channel/handshaker_registry.cc
src/core/lib/compression/compression.cc src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_ruby.cc
src/core/lib/compression/message_compress.cc src/core/lib/compression/message_compress.cc
src/core/lib/compression/stream_compression.cc src/core/lib/compression/stream_compression.cc
src/core/lib/compression/stream_compression_gzip.cc src/core/lib/compression/stream_compression_gzip.cc
@ -2258,7 +2251,6 @@ foreach(_hdr
include/grpc/byte_buffer.h include/grpc/byte_buffer.h
include/grpc/byte_buffer_reader.h include/grpc/byte_buffer_reader.h
include/grpc/compression.h include/grpc/compression.h
include/grpc/compression_ruby.h
include/grpc/fork.h include/grpc/fork.h
include/grpc/grpc.h include/grpc/grpc.h
include/grpc/grpc_posix.h include/grpc/grpc_posix.h
@ -2498,7 +2490,6 @@ foreach(_hdr
include/grpc/support/atm_windows.h include/grpc/support/atm_windows.h
include/grpc/support/cmdline.h include/grpc/support/cmdline.h
include/grpc/support/cpu.h include/grpc/support/cpu.h
include/grpc/support/host_port.h
include/grpc/support/log.h include/grpc/support/log.h
include/grpc/support/log_windows.h include/grpc/support/log_windows.h
include/grpc/support/port_platform.h include/grpc/support/port_platform.h
@ -2531,7 +2522,6 @@ foreach(_hdr
include/grpc/byte_buffer.h include/grpc/byte_buffer.h
include/grpc/byte_buffer_reader.h include/grpc/byte_buffer_reader.h
include/grpc/compression.h include/grpc/compression.h
include/grpc/compression_ruby.h
include/grpc/fork.h include/grpc/fork.h
include/grpc/grpc.h include/grpc/grpc.h
include/grpc/grpc_posix.h include/grpc/grpc_posix.h
@ -2724,7 +2714,6 @@ add_library(grpc++_cronet
src/core/lib/channel/handshaker_registry.cc src/core/lib/channel/handshaker_registry.cc
src/core/lib/compression/compression.cc src/core/lib/compression/compression.cc
src/core/lib/compression/compression_internal.cc src/core/lib/compression/compression_internal.cc
src/core/lib/compression/compression_ruby.cc
src/core/lib/compression/message_compress.cc src/core/lib/compression/message_compress.cc
src/core/lib/compression/stream_compression.cc src/core/lib/compression/stream_compression.cc
src/core/lib/compression/stream_compression_gzip.cc src/core/lib/compression/stream_compression_gzip.cc
@ -2972,7 +2961,6 @@ foreach(_hdr
include/grpc/support/atm_windows.h include/grpc/support/atm_windows.h
include/grpc/support/cmdline.h include/grpc/support/cmdline.h
include/grpc/support/cpu.h include/grpc/support/cpu.h
include/grpc/support/host_port.h
include/grpc/support/log.h include/grpc/support/log.h
include/grpc/support/log_windows.h include/grpc/support/log_windows.h
include/grpc/support/port_platform.h include/grpc/support/port_platform.h
@ -3005,7 +2993,6 @@ foreach(_hdr
include/grpc/byte_buffer.h include/grpc/byte_buffer.h
include/grpc/byte_buffer_reader.h include/grpc/byte_buffer_reader.h
include/grpc/compression.h include/grpc/compression.h
include/grpc/compression_ruby.h
include/grpc/fork.h include/grpc/fork.h
include/grpc/grpc.h include/grpc/grpc.h
include/grpc/grpc_posix.h include/grpc/grpc_posix.h
@ -3701,7 +3688,6 @@ foreach(_hdr
include/grpc/support/atm_windows.h include/grpc/support/atm_windows.h
include/grpc/support/cmdline.h include/grpc/support/cmdline.h
include/grpc/support/cpu.h include/grpc/support/cpu.h
include/grpc/support/host_port.h
include/grpc/support/log.h include/grpc/support/log.h
include/grpc/support/log_windows.h include/grpc/support/log_windows.h
include/grpc/support/port_platform.h include/grpc/support/port_platform.h
@ -3734,7 +3720,6 @@ foreach(_hdr
include/grpc/byte_buffer.h include/grpc/byte_buffer.h
include/grpc/byte_buffer_reader.h include/grpc/byte_buffer_reader.h
include/grpc/compression.h include/grpc/compression.h
include/grpc/compression_ruby.h
include/grpc/fork.h include/grpc/fork.h
include/grpc/grpc.h include/grpc/grpc.h
include/grpc/grpc_posix.h include/grpc/grpc_posix.h
@ -6988,33 +6973,6 @@ target_link_libraries(lame_client_test
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
add_executable(lb_policies_test
test/core/client_channel/lb_policies_test.cc
)
target_include_directories(lb_policies_test
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR}
PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR}
PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR}
PRIVATE ${_gRPC_CARES_INCLUDE_DIR}
PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR}
)
target_link_libraries(lb_policies_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
grpc
gpr_test_util
gpr
)
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
add_executable(load_file_test add_executable(load_file_test
test/core/iomgr/load_file_test.cc test/core/iomgr/load_file_test.cc
) )
@ -12355,6 +12313,35 @@ target_link_libraries(connection_prefix_bad_client_test
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
add_executable(duplicate_header_bad_client_test
test/core/bad_client/tests/duplicate_header.cc
)
target_include_directories(duplicate_header_bad_client_test
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR}
PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR}
PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR}
PRIVATE ${_gRPC_CARES_INCLUDE_DIR}
PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR}
)
target_link_libraries(duplicate_header_bad_client_test
${_gRPC_SSL_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
bad_client_test
grpc_test_util_unsecure
grpc_unsecure
gpr_test_util
gpr
)
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
add_executable(head_of_line_blocking_bad_client_test add_executable(head_of_line_blocking_bad_client_test
test/core/bad_client/tests/head_of_line_blocking.cc test/core/bad_client/tests/head_of_line_blocking.cc
) )

@ -1039,7 +1039,6 @@ json_rewrite_test: $(BINDIR)/$(CONFIG)/json_rewrite_test
json_stream_error_test: $(BINDIR)/$(CONFIG)/json_stream_error_test json_stream_error_test: $(BINDIR)/$(CONFIG)/json_stream_error_test
json_test: $(BINDIR)/$(CONFIG)/json_test json_test: $(BINDIR)/$(CONFIG)/json_test
lame_client_test: $(BINDIR)/$(CONFIG)/lame_client_test lame_client_test: $(BINDIR)/$(CONFIG)/lame_client_test
lb_policies_test: $(BINDIR)/$(CONFIG)/lb_policies_test
load_file_test: $(BINDIR)/$(CONFIG)/load_file_test load_file_test: $(BINDIR)/$(CONFIG)/load_file_test
low_level_ping_pong_benchmark: $(BINDIR)/$(CONFIG)/low_level_ping_pong_benchmark low_level_ping_pong_benchmark: $(BINDIR)/$(CONFIG)/low_level_ping_pong_benchmark
memory_profile_client: $(BINDIR)/$(CONFIG)/memory_profile_client memory_profile_client: $(BINDIR)/$(CONFIG)/memory_profile_client
@ -1245,6 +1244,7 @@ boringssl_span_test: $(BINDIR)/$(CONFIG)/boringssl_span_test
boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test
badreq_bad_client_test: $(BINDIR)/$(CONFIG)/badreq_bad_client_test badreq_bad_client_test: $(BINDIR)/$(CONFIG)/badreq_bad_client_test
connection_prefix_bad_client_test: $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test connection_prefix_bad_client_test: $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test
duplicate_header_bad_client_test: $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test
head_of_line_blocking_bad_client_test: $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test head_of_line_blocking_bad_client_test: $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test
headers_bad_client_test: $(BINDIR)/$(CONFIG)/headers_bad_client_test headers_bad_client_test: $(BINDIR)/$(CONFIG)/headers_bad_client_test
initial_settings_frame_bad_client_test: $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test initial_settings_frame_bad_client_test: $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test
@ -1447,7 +1447,6 @@ buildtests_c: privatelibs_c \
$(BINDIR)/$(CONFIG)/json_stream_error_test \ $(BINDIR)/$(CONFIG)/json_stream_error_test \
$(BINDIR)/$(CONFIG)/json_test \ $(BINDIR)/$(CONFIG)/json_test \
$(BINDIR)/$(CONFIG)/lame_client_test \ $(BINDIR)/$(CONFIG)/lame_client_test \
$(BINDIR)/$(CONFIG)/lb_policies_test \
$(BINDIR)/$(CONFIG)/load_file_test \ $(BINDIR)/$(CONFIG)/load_file_test \
$(BINDIR)/$(CONFIG)/memory_profile_client \ $(BINDIR)/$(CONFIG)/memory_profile_client \
$(BINDIR)/$(CONFIG)/memory_profile_server \ $(BINDIR)/$(CONFIG)/memory_profile_server \
@ -1498,6 +1497,7 @@ buildtests_c: privatelibs_c \
$(BINDIR)/$(CONFIG)/public_headers_must_be_c89 \ $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 \
$(BINDIR)/$(CONFIG)/badreq_bad_client_test \ $(BINDIR)/$(CONFIG)/badreq_bad_client_test \
$(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test \ $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test \
$(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test \
$(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test \ $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test \
$(BINDIR)/$(CONFIG)/headers_bad_client_test \ $(BINDIR)/$(CONFIG)/headers_bad_client_test \
$(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test \ $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test \
@ -2050,6 +2050,8 @@ test_c: buildtests_c
$(Q) $(BINDIR)/$(CONFIG)/badreq_bad_client_test || ( echo test badreq_bad_client_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/badreq_bad_client_test || ( echo test badreq_bad_client_test failed ; exit 1 )
$(E) "[RUN] Testing connection_prefix_bad_client_test" $(E) "[RUN] Testing connection_prefix_bad_client_test"
$(Q) $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test || ( echo test connection_prefix_bad_client_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test || ( echo test connection_prefix_bad_client_test failed ; exit 1 )
$(E) "[RUN] Testing duplicate_header_bad_client_test"
$(Q) $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test || ( echo test duplicate_header_bad_client_test failed ; exit 1 )
$(E) "[RUN] Testing head_of_line_blocking_bad_client_test" $(E) "[RUN] Testing head_of_line_blocking_bad_client_test"
$(Q) $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test || ( echo test head_of_line_blocking_bad_client_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test || ( echo test head_of_line_blocking_bad_client_test failed ; exit 1 )
$(E) "[RUN] Testing headers_bad_client_test" $(E) "[RUN] Testing headers_bad_client_test"
@ -2923,7 +2925,6 @@ PUBLIC_HEADERS_C += \
include/grpc/support/atm_windows.h \ include/grpc/support/atm_windows.h \
include/grpc/support/cmdline.h \ include/grpc/support/cmdline.h \
include/grpc/support/cpu.h \ include/grpc/support/cpu.h \
include/grpc/support/host_port.h \
include/grpc/support/log.h \ include/grpc/support/log.h \
include/grpc/support/log_windows.h \ include/grpc/support/log_windows.h \
include/grpc/support/port_platform.h \ include/grpc/support/port_platform.h \
@ -3029,7 +3030,6 @@ LIBGRPC_SRC = \
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \
@ -3297,7 +3297,6 @@ PUBLIC_HEADERS_C += \
include/grpc/byte_buffer.h \ include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \ include/grpc/compression.h \
include/grpc/compression_ruby.h \
include/grpc/fork.h \ include/grpc/fork.h \
include/grpc/grpc.h \ include/grpc/grpc.h \
include/grpc/grpc_posix.h \ include/grpc/grpc_posix.h \
@ -3374,7 +3373,6 @@ LIBGRPC_CRONET_SRC = \
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \
@ -3700,7 +3698,6 @@ LIBGRPC_TEST_UTIL_SRC = \
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \
@ -3962,7 +3959,6 @@ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \
@ -4194,7 +4190,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \
@ -4429,7 +4424,6 @@ PUBLIC_HEADERS_C += \
include/grpc/byte_buffer.h \ include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \ include/grpc/compression.h \
include/grpc/compression_ruby.h \
include/grpc/fork.h \ include/grpc/fork.h \
include/grpc/grpc.h \ include/grpc/grpc.h \
include/grpc/grpc_posix.h \ include/grpc/grpc_posix.h \
@ -4654,7 +4648,6 @@ PUBLIC_HEADERS_CXX += \
include/grpc/support/atm_windows.h \ include/grpc/support/atm_windows.h \
include/grpc/support/cmdline.h \ include/grpc/support/cmdline.h \
include/grpc/support/cpu.h \ include/grpc/support/cpu.h \
include/grpc/support/host_port.h \
include/grpc/support/log.h \ include/grpc/support/log.h \
include/grpc/support/log_windows.h \ include/grpc/support/log_windows.h \
include/grpc/support/port_platform.h \ include/grpc/support/port_platform.h \
@ -4687,7 +4680,6 @@ PUBLIC_HEADERS_CXX += \
include/grpc/byte_buffer.h \ include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \ include/grpc/compression.h \
include/grpc/compression_ruby.h \
include/grpc/fork.h \ include/grpc/fork.h \
include/grpc/grpc.h \ include/grpc/grpc.h \
include/grpc/grpc_posix.h \ include/grpc/grpc_posix.h \
@ -4928,7 +4920,6 @@ LIBGRPC++_CRONET_SRC = \
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \
@ -5141,7 +5132,6 @@ PUBLIC_HEADERS_CXX += \
include/grpc/support/atm_windows.h \ include/grpc/support/atm_windows.h \
include/grpc/support/cmdline.h \ include/grpc/support/cmdline.h \
include/grpc/support/cpu.h \ include/grpc/support/cpu.h \
include/grpc/support/host_port.h \
include/grpc/support/log.h \ include/grpc/support/log.h \
include/grpc/support/log_windows.h \ include/grpc/support/log_windows.h \
include/grpc/support/port_platform.h \ include/grpc/support/port_platform.h \
@ -5174,7 +5164,6 @@ PUBLIC_HEADERS_CXX += \
include/grpc/byte_buffer.h \ include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \ include/grpc/compression.h \
include/grpc/compression_ruby.h \
include/grpc/fork.h \ include/grpc/fork.h \
include/grpc/grpc.h \ include/grpc/grpc.h \
include/grpc/grpc_posix.h \ include/grpc/grpc_posix.h \
@ -5859,7 +5848,6 @@ PUBLIC_HEADERS_CXX += \
include/grpc/support/atm_windows.h \ include/grpc/support/atm_windows.h \
include/grpc/support/cmdline.h \ include/grpc/support/cmdline.h \
include/grpc/support/cpu.h \ include/grpc/support/cpu.h \
include/grpc/support/host_port.h \
include/grpc/support/log.h \ include/grpc/support/log.h \
include/grpc/support/log_windows.h \ include/grpc/support/log_windows.h \
include/grpc/support/port_platform.h \ include/grpc/support/port_platform.h \
@ -5892,7 +5880,6 @@ PUBLIC_HEADERS_CXX += \
include/grpc/byte_buffer.h \ include/grpc/byte_buffer.h \
include/grpc/byte_buffer_reader.h \ include/grpc/byte_buffer_reader.h \
include/grpc/compression.h \ include/grpc/compression.h \
include/grpc/compression_ruby.h \
include/grpc/fork.h \ include/grpc/fork.h \
include/grpc/grpc.h \ include/grpc/grpc.h \
include/grpc/grpc_posix.h \ include/grpc/grpc_posix.h \
@ -12106,38 +12093,6 @@ endif
endif endif
LB_POLICIES_TEST_SRC = \
test/core/client_channel/lb_policies_test.cc \
LB_POLICIES_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LB_POLICIES_TEST_SRC))))
ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/lb_policies_test: openssl_dep_error
else
$(BINDIR)/$(CONFIG)/lb_policies_test: $(LB_POLICIES_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(LB_POLICIES_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/lb_policies_test
endif
$(OBJDIR)/$(CONFIG)/test/core/client_channel/lb_policies_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_lb_policies_test: $(LB_POLICIES_TEST_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true)
-include $(LB_POLICIES_TEST_OBJS:.o=.dep)
endif
endif
LOAD_FILE_TEST_SRC = \ LOAD_FILE_TEST_SRC = \
test/core/iomgr/load_file_test.cc \ test/core/iomgr/load_file_test.cc \
@ -20143,6 +20098,26 @@ ifneq ($(NO_DEPS),true)
endif endif
DUPLICATE_HEADER_BAD_CLIENT_TEST_SRC = \
test/core/bad_client/tests/duplicate_header.cc \
DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DUPLICATE_HEADER_BAD_CLIENT_TEST_SRC))))
$(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test: $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test
$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/duplicate_header.o: $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_duplicate_header_bad_client_test: $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS:.o=.dep)
ifneq ($(NO_DEPS),true)
-include $(DUPLICATE_HEADER_BAD_CLIENT_TEST_OBJS:.o=.dep)
endif
HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_SRC = \ HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_SRC = \
test/core/bad_client/tests/head_of_line_blocking.cc \ test/core/bad_client/tests/head_of_line_blocking.cc \

@ -120,10 +120,10 @@ def grpc_deps():
if "com_github_bazelbuild_bazeltoolchains" not in native.existing_rules(): if "com_github_bazelbuild_bazeltoolchains" not in native.existing_rules():
native.http_archive( native.http_archive(
name = "com_github_bazelbuild_bazeltoolchains", name = "com_github_bazelbuild_bazeltoolchains",
strip_prefix = "bazel-toolchains-af4681c3d19f063f090222ec3d04108c4e0ca255", strip_prefix = "bazel-toolchains-f3b09700fae5d7b6e659d7cefe0dcc6e8498504c",
urls = [ urls = [
"https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/af4681c3d19f063f090222ec3d04108c4e0ca255.tar.gz", "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/f3b09700fae5d7b6e659d7cefe0dcc6e8498504c.tar.gz",
"https://github.com/bazelbuild/bazel-toolchains/archive/af4681c3d19f063f090222ec3d04108c4e0ca255.tar.gz", "https://github.com/bazelbuild/bazel-toolchains/archive/f3b09700fae5d7b6e659d7cefe0dcc6e8498504c.tar.gz",
], ],
sha256 = "d58bb2d6c8603f600d522b6104d6192a65339aa26cbba9f11ff5c4b36dedb928", sha256 = "ed829b5eea8af1f405f4cc3d6ecfc3b1365bb7843171036030a31b5127002311",
) )

@ -13,7 +13,7 @@ settings:
'#09': Per-language overrides are possible with (eg) ruby_version tag here '#09': Per-language overrides are possible with (eg) ruby_version tag here
'#10': See the expand_version.py for all the quirks here '#10': See the expand_version.py for all the quirks here
core_version: 6.0.0-dev core_version: 6.0.0-dev
g_stands_for: glossy g_stands_for: glamorous
version: 1.10.0-dev version: 1.10.0-dev
filegroups: filegroups:
- name: census - name: census
@ -80,7 +80,6 @@ filegroups:
- include/grpc/support/atm_windows.h - include/grpc/support/atm_windows.h
- include/grpc/support/cmdline.h - include/grpc/support/cmdline.h
- include/grpc/support/cpu.h - include/grpc/support/cpu.h
- include/grpc/support/host_port.h
- include/grpc/support/log.h - include/grpc/support/log.h
- include/grpc/support/log_windows.h - include/grpc/support/log_windows.h
- include/grpc/support/port_platform.h - include/grpc/support/port_platform.h
@ -101,6 +100,7 @@ filegroups:
- src/core/lib/gpr/arena.h - src/core/lib/gpr/arena.h
- src/core/lib/gpr/env.h - src/core/lib/gpr/env.h
- src/core/lib/gpr/fork.h - src/core/lib/gpr/fork.h
- src/core/lib/gpr/host_port.h
- src/core/lib/gpr/mpscq.h - src/core/lib/gpr/mpscq.h
- src/core/lib/gpr/murmur_hash.h - src/core/lib/gpr/murmur_hash.h
- src/core/lib/gpr/spinlock.h - src/core/lib/gpr/spinlock.h
@ -159,7 +159,6 @@ filegroups:
- src/core/lib/channel/handshaker_registry.cc - src/core/lib/channel/handshaker_registry.cc
- src/core/lib/compression/compression.cc - src/core/lib/compression/compression.cc
- src/core/lib/compression/compression_internal.cc - src/core/lib/compression/compression_internal.cc
- src/core/lib/compression/compression_ruby.cc
- src/core/lib/compression/message_compress.cc - src/core/lib/compression/message_compress.cc
- src/core/lib/compression/stream_compression.cc - src/core/lib/compression/stream_compression.cc
- src/core/lib/compression/stream_compression_gzip.cc - src/core/lib/compression/stream_compression_gzip.cc
@ -295,7 +294,6 @@ filegroups:
- include/grpc/byte_buffer.h - include/grpc/byte_buffer.h
- include/grpc/byte_buffer_reader.h - include/grpc/byte_buffer_reader.h
- include/grpc/compression.h - include/grpc/compression.h
- include/grpc/compression_ruby.h
- include/grpc/fork.h - include/grpc/fork.h
- include/grpc/grpc.h - include/grpc/grpc.h
- include/grpc/grpc_posix.h - include/grpc/grpc_posix.h
@ -2724,19 +2722,6 @@ targets:
- grpc - grpc
- gpr_test_util - gpr_test_util
- gpr - gpr
- name: lb_policies_test
cpu_cost: 0.1
build: test
run: false
language: c
src:
- test/core/client_channel/lb_policies_test.cc
deps:
- grpc_test_util
- grpc
- gpr_test_util
- gpr
uses_polling: false
- name: load_file_test - name: load_file_test
build: test build: test
language: c language: c

@ -32,7 +32,13 @@ if("${gRPC_SSL_PROVIDER}" STREQUAL "module")
endif() endif()
elseif("${gRPC_SSL_PROVIDER}" STREQUAL "package") elseif("${gRPC_SSL_PROVIDER}" STREQUAL "package")
find_package(OpenSSL REQUIRED) find_package(OpenSSL REQUIRED)
if(TARGET OpenSSL::SSL)
set(_gRPC_SSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
else()
set(_gRPC_SSL_LIBRARIES ${OPENSSL_LIBRARIES}) set(_gRPC_SSL_LIBRARIES ${OPENSSL_LIBRARIES})
endif()
set(_gRPC_SSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}) set(_gRPC_SSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR})
set(_gRPC_FIND_SSL "if(NOT OPENSSL_FOUND)\n find_package(OpenSSL)\nendif()") set(_gRPC_FIND_SSL "if(NOT OPENSSL_FOUND)\n find_package(OpenSSL)\nendif()")
endif() endif()

@ -34,7 +34,12 @@ if("${gRPC_ZLIB_PROVIDER}" STREQUAL "module")
endif() endif()
elseif("${gRPC_ZLIB_PROVIDER}" STREQUAL "package") elseif("${gRPC_ZLIB_PROVIDER}" STREQUAL "package")
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
if(TARGET ZLIB::ZLIB)
set(_gRPC_ZLIB_LIBRARIES ZLIB::ZLIB)
else()
set(_gRPC_ZLIB_LIBRARIES ${ZLIB_LIBRARIES}) set(_gRPC_ZLIB_LIBRARIES ${ZLIB_LIBRARIES})
endif()
set(_gRPC_ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS}) set(_gRPC_ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS})
set(_gRPC_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()") set(_gRPC_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()")
endif() endif()

@ -94,7 +94,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/channel/handshaker_registry.cc \ src/core/lib/channel/handshaker_registry.cc \
src/core/lib/compression/compression.cc \ src/core/lib/compression/compression.cc \
src/core/lib/compression/compression_internal.cc \ src/core/lib/compression/compression_internal.cc \
src/core/lib/compression/compression_ruby.cc \
src/core/lib/compression/message_compress.cc \ src/core/lib/compression/message_compress.cc \
src/core/lib/compression/stream_compression.cc \ src/core/lib/compression/stream_compression.cc \
src/core/lib/compression/stream_compression_gzip.cc \ src/core/lib/compression/stream_compression_gzip.cc \

@ -71,7 +71,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\channel\\handshaker_registry.cc " + "src\\core\\lib\\channel\\handshaker_registry.cc " +
"src\\core\\lib\\compression\\compression.cc " + "src\\core\\lib\\compression\\compression.cc " +
"src\\core\\lib\\compression\\compression_internal.cc " + "src\\core\\lib\\compression\\compression_internal.cc " +
"src\\core\\lib\\compression\\compression_ruby.cc " +
"src\\core\\lib\\compression\\message_compress.cc " + "src\\core\\lib\\compression\\message_compress.cc " +
"src\\core\\lib\\compression\\stream_compression.cc " + "src\\core\\lib\\compression\\stream_compression.cc " +
"src\\core\\lib\\compression\\stream_compression_gzip.cc " + "src\\core\\lib\\compression\\stream_compression_gzip.cc " +

@ -63,7 +63,7 @@ header received from the client), it SHALL send the message uncompressed.
If the user (through the previously described mechanisms) requests to disable If the user (through the previously described mechanisms) requests to disable
compression the next message MUST be sent uncompressed. This is instrumental in compression the next message MUST be sent uncompressed. This is instrumental in
preventing BEAST/CRIME attacks. This applies to both the the unary and streaming preventing BEAST/CRIME attacks. This applies to both the unary and streaming
cases. cases.
### Compression Levels and Algorithms ### Compression Levels and Algorithms

@ -33,14 +33,14 @@ class _GenericClientInterceptor(
request): request):
new_details, new_request_iterator, postprocess = self._fn( new_details, new_request_iterator, postprocess = self._fn(
client_call_details, iter((request,)), False, True) client_call_details, iter((request,)), False, True)
response_it = continuation(new_details, new_request_iterator) response_it = continuation(new_details, next(new_request_iterator))
return postprocess(response_it) if postprocess else response_it return postprocess(response_it) if postprocess else response_it
def intercept_stream_unary(self, continuation, client_call_details, def intercept_stream_unary(self, continuation, client_call_details,
request_iterator): request_iterator):
new_details, new_request_iterator, postprocess = self._fn( new_details, new_request_iterator, postprocess = self._fn(
client_call_details, request_iterator, True, False) client_call_details, request_iterator, True, False)
response = continuation(new_details, next(new_request_iterator)) response = continuation(new_details, new_request_iterator)
return postprocess(response) if postprocess else response return postprocess(response) if postprocess else response
def intercept_stream_stream(self, continuation, client_call_details, def intercept_stream_stream(self, continuation, client_call_details,

@ -206,6 +206,7 @@ Pod::Spec.new do |s|
'src/core/lib/gpr/arena.h', 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h', 'src/core/lib/gpr/env.h',
'src/core/lib/gpr/fork.h', 'src/core/lib/gpr/fork.h',
'src/core/lib/gpr/host_port.h',
'src/core/lib/gpr/mpscq.h', 'src/core/lib/gpr/mpscq.h',
'src/core/lib/gpr/murmur_hash.h', 'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h', 'src/core/lib/gpr/spinlock.h',
@ -453,6 +454,7 @@ Pod::Spec.new do |s|
'src/core/lib/gpr/arena.h', 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h', 'src/core/lib/gpr/env.h',
'src/core/lib/gpr/fork.h', 'src/core/lib/gpr/fork.h',
'src/core/lib/gpr/host_port.h',
'src/core/lib/gpr/mpscq.h', 'src/core/lib/gpr/mpscq.h',
'src/core/lib/gpr/murmur_hash.h', 'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h', 'src/core/lib/gpr/spinlock.h',

@ -116,7 +116,6 @@ Pod::Spec.new do |s|
'include/grpc/support/atm_windows.h', 'include/grpc/support/atm_windows.h',
'include/grpc/support/cmdline.h', 'include/grpc/support/cmdline.h',
'include/grpc/support/cpu.h', 'include/grpc/support/cpu.h',
'include/grpc/support/host_port.h',
'include/grpc/support/log.h', 'include/grpc/support/log.h',
'include/grpc/support/log_windows.h', 'include/grpc/support/log_windows.h',
'include/grpc/support/port_platform.h', 'include/grpc/support/port_platform.h',
@ -171,7 +170,6 @@ Pod::Spec.new do |s|
'include/grpc/byte_buffer.h', 'include/grpc/byte_buffer.h',
'include/grpc/byte_buffer_reader.h', 'include/grpc/byte_buffer_reader.h',
'include/grpc/compression.h', 'include/grpc/compression.h',
'include/grpc/compression_ruby.h',
'include/grpc/fork.h', 'include/grpc/fork.h',
'include/grpc/grpc.h', 'include/grpc/grpc.h',
'include/grpc/grpc_posix.h', 'include/grpc/grpc_posix.h',
@ -194,6 +192,7 @@ Pod::Spec.new do |s|
ss.source_files = 'src/core/lib/gpr/arena.h', ss.source_files = 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h', 'src/core/lib/gpr/env.h',
'src/core/lib/gpr/fork.h', 'src/core/lib/gpr/fork.h',
'src/core/lib/gpr/host_port.h',
'src/core/lib/gpr/mpscq.h', 'src/core/lib/gpr/mpscq.h',
'src/core/lib/gpr/murmur_hash.h', 'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h', 'src/core/lib/gpr/spinlock.h',
@ -481,7 +480,6 @@ Pod::Spec.new do |s|
'src/core/lib/channel/handshaker_registry.cc', 'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc', 'src/core/lib/compression/compression.cc',
'src/core/lib/compression/compression_internal.cc', 'src/core/lib/compression/compression_internal.cc',
'src/core/lib/compression/compression_ruby.cc',
'src/core/lib/compression/message_compress.cc', 'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc', 'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc', 'src/core/lib/compression/stream_compression_gzip.cc',
@ -723,6 +721,7 @@ Pod::Spec.new do |s|
ss.private_header_files = 'src/core/lib/gpr/arena.h', ss.private_header_files = 'src/core/lib/gpr/arena.h',
'src/core/lib/gpr/env.h', 'src/core/lib/gpr/env.h',
'src/core/lib/gpr/fork.h', 'src/core/lib/gpr/fork.h',
'src/core/lib/gpr/host_port.h',
'src/core/lib/gpr/mpscq.h', 'src/core/lib/gpr/mpscq.h',
'src/core/lib/gpr/murmur_hash.h', 'src/core/lib/gpr/murmur_hash.h',
'src/core/lib/gpr/spinlock.h', 'src/core/lib/gpr/spinlock.h',

@ -8,8 +8,6 @@ EXPORTS
grpc_compression_options_enable_algorithm grpc_compression_options_enable_algorithm
grpc_compression_options_disable_algorithm grpc_compression_options_disable_algorithm
grpc_compression_options_is_algorithm_enabled grpc_compression_options_is_algorithm_enabled
grpc_compression_algorithm_parse_ruby
grpc_compression_algorithm_name_ruby
grpc_metadata_array_init grpc_metadata_array_init
grpc_metadata_array_destroy grpc_metadata_array_destroy
grpc_call_details_init grpc_call_details_init
@ -189,8 +187,6 @@ EXPORTS
gpr_cmdline_usage_string gpr_cmdline_usage_string
gpr_cpu_num_cores gpr_cpu_num_cores
gpr_cpu_current_cpu gpr_cpu_current_cpu
gpr_join_host_port
gpr_split_host_port
gpr_log_severity_string gpr_log_severity_string
gpr_log gpr_log
gpr_log_message gpr_log_message

@ -51,7 +51,6 @@ Gem::Specification.new do |s|
s.files += %w( include/grpc/support/atm_windows.h ) s.files += %w( include/grpc/support/atm_windows.h )
s.files += %w( include/grpc/support/cmdline.h ) s.files += %w( include/grpc/support/cmdline.h )
s.files += %w( include/grpc/support/cpu.h ) s.files += %w( include/grpc/support/cpu.h )
s.files += %w( include/grpc/support/host_port.h )
s.files += %w( include/grpc/support/log.h ) s.files += %w( include/grpc/support/log.h )
s.files += %w( include/grpc/support/log_windows.h ) s.files += %w( include/grpc/support/log_windows.h )
s.files += %w( include/grpc/support/port_platform.h ) s.files += %w( include/grpc/support/port_platform.h )
@ -84,6 +83,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/gpr/arena.h ) s.files += %w( src/core/lib/gpr/arena.h )
s.files += %w( src/core/lib/gpr/env.h ) s.files += %w( src/core/lib/gpr/env.h )
s.files += %w( src/core/lib/gpr/fork.h ) s.files += %w( src/core/lib/gpr/fork.h )
s.files += %w( src/core/lib/gpr/host_port.h )
s.files += %w( src/core/lib/gpr/mpscq.h ) s.files += %w( src/core/lib/gpr/mpscq.h )
s.files += %w( src/core/lib/gpr/murmur_hash.h ) s.files += %w( src/core/lib/gpr/murmur_hash.h )
s.files += %w( src/core/lib/gpr/spinlock.h ) s.files += %w( src/core/lib/gpr/spinlock.h )
@ -168,7 +168,6 @@ Gem::Specification.new do |s|
s.files += %w( include/grpc/byte_buffer.h ) s.files += %w( include/grpc/byte_buffer.h )
s.files += %w( include/grpc/byte_buffer_reader.h ) s.files += %w( include/grpc/byte_buffer_reader.h )
s.files += %w( include/grpc/compression.h ) s.files += %w( include/grpc/compression.h )
s.files += %w( include/grpc/compression_ruby.h )
s.files += %w( include/grpc/fork.h ) s.files += %w( include/grpc/fork.h )
s.files += %w( include/grpc/grpc.h ) s.files += %w( include/grpc/grpc.h )
s.files += %w( include/grpc/grpc_posix.h ) s.files += %w( include/grpc/grpc_posix.h )
@ -411,7 +410,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/channel/handshaker_registry.cc ) s.files += %w( src/core/lib/channel/handshaker_registry.cc )
s.files += %w( src/core/lib/compression/compression.cc ) s.files += %w( src/core/lib/compression/compression.cc )
s.files += %w( src/core/lib/compression/compression_internal.cc ) s.files += %w( src/core/lib/compression/compression_internal.cc )
s.files += %w( src/core/lib/compression/compression_ruby.cc )
s.files += %w( src/core/lib/compression/message_compress.cc ) s.files += %w( src/core/lib/compression/message_compress.cc )
s.files += %w( src/core/lib/compression/stream_compression.cc ) s.files += %w( src/core/lib/compression/stream_compression.cc )
s.files += %w( src/core/lib/compression/stream_compression_gzip.cc ) s.files += %w( src/core/lib/compression/stream_compression_gzip.cc )

@ -235,7 +235,6 @@
'src/core/lib/channel/handshaker_registry.cc', 'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc', 'src/core/lib/compression/compression.cc',
'src/core/lib/compression/compression_internal.cc', 'src/core/lib/compression/compression_internal.cc',
'src/core/lib/compression/compression_ruby.cc',
'src/core/lib/compression/message_compress.cc', 'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc', 'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc', 'src/core/lib/compression/stream_compression_gzip.cc',
@ -531,7 +530,6 @@
'src/core/lib/channel/handshaker_registry.cc', 'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc', 'src/core/lib/compression/compression.cc',
'src/core/lib/compression/compression_internal.cc', 'src/core/lib/compression/compression_internal.cc',
'src/core/lib/compression/compression_ruby.cc',
'src/core/lib/compression/message_compress.cc', 'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc', 'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc', 'src/core/lib/compression/stream_compression_gzip.cc',
@ -745,7 +743,6 @@
'src/core/lib/channel/handshaker_registry.cc', 'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc', 'src/core/lib/compression/compression.cc',
'src/core/lib/compression/compression_internal.cc', 'src/core/lib/compression/compression_internal.cc',
'src/core/lib/compression/compression_ruby.cc',
'src/core/lib/compression/message_compress.cc', 'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc', 'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc', 'src/core/lib/compression/stream_compression_gzip.cc',
@ -941,7 +938,6 @@
'src/core/lib/channel/handshaker_registry.cc', 'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc', 'src/core/lib/compression/compression.cc',
'src/core/lib/compression/compression_internal.cc', 'src/core/lib/compression/compression_internal.cc',
'src/core/lib/compression/compression_ruby.cc',
'src/core/lib/compression/message_compress.cc', 'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc', 'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc', 'src/core/lib/compression/stream_compression_gzip.cc',

@ -37,15 +37,6 @@ class GenericStub final {
explicit GenericStub(std::shared_ptr<ChannelInterface> channel) explicit GenericStub(std::shared_ptr<ChannelInterface> channel)
: channel_(channel) {} : channel_(channel) {}
/// Begin a call to a named method \a method using \a context.
/// A tag \a tag will be delivered to \a cq when the call has been started
/// (i.e, initial metadata has been sent).
/// The return value only indicates whether or not registration of the call
/// succeeded (i.e. the call won't proceed if the return value is nullptr).
std::unique_ptr<GenericClientAsyncReaderWriter> Call(
ClientContext* context, const grpc::string& method, CompletionQueue* cq,
void* tag);
/// Setup a call to a named method \a method using \a context, but don't /// Setup a call to a named method \a method using \a context, but don't
/// start it. Let it be started explicitly with StartCall and a tag. /// start it. Let it be started explicitly with StartCall and a tag.
/// The return value only indicates whether or not registration of the call /// The return value only indicates whether or not registration of the call
@ -61,6 +52,16 @@ class GenericStub final {
ClientContext* context, const grpc::string& method, ClientContext* context, const grpc::string& method,
const ByteBuffer& request, CompletionQueue* cq); const ByteBuffer& request, CompletionQueue* cq);
/// DEPRECATED for multi-threaded use
/// Begin a call to a named method \a method using \a context.
/// A tag \a tag will be delivered to \a cq when the call has been started
/// (i.e, initial metadata has been sent).
/// The return value only indicates whether or not registration of the call
/// succeeded (i.e. the call won't proceed if the return value is nullptr).
std::unique_ptr<GenericClientAsyncReaderWriter> Call(
ClientContext* context, const grpc::string& method, CompletionQueue* cq,
void* tag);
private: private:
std::shared_ptr<ChannelInterface> channel_; std::shared_ptr<ChannelInterface> channel_;
}; };

@ -289,7 +289,9 @@ class ClientContext {
creds_ = creds; creds_ = creds;
} }
/// Return the compression algorithm to be used by the client call. /// Return the compression algorithm the client call will request be used.
/// Note that the gRPC runtime may decide to ignore this request, for example,
/// due to resource constraints.
grpc_compression_algorithm compression_algorithm() const { grpc_compression_algorithm compression_algorithm() const {
return compression_algorithm_; return compression_algorithm_;
} }
@ -302,7 +304,10 @@ class ClientContext {
/// Flag whether the initial metadata should be \a corked /// Flag whether the initial metadata should be \a corked
/// ///
/// If \a corked is true, then the initial metadata will be coalesced with the /// If \a corked is true, then the initial metadata will be coalesced with the
/// write of first message in the stream. /// write of first message in the stream. As a result, any tag set for the
/// initial metadata operation (starting a client-streaming or bidi-streaming
/// RPC) will not actually be sent to the completion queue or delivered
/// via Next.
/// ///
/// \param corked The flag indicating whether the initial metadata is to be /// \param corked The flag indicating whether the initial metadata is to be
/// corked or not. /// corked or not.
@ -330,6 +335,10 @@ class ClientContext {
/// already finished, it may still return success. /// already finished, it may still return success.
/// ///
/// There is no guarantee the call will be cancelled. /// There is no guarantee the call will be cancelled.
///
/// Note that TryCancel() does not change any of the tags that are pending
/// on the completion queue. All pending tags will still be delivered
/// (though their ok result may reflect the effect of cancellation).
void TryCancel(); void TryCancel();
/// Global Callbacks /// Global Callbacks

@ -111,12 +111,83 @@ class CompletionQueue : private GrpcLibraryCodegen {
/// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT. /// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT.
enum NextStatus { enum NextStatus {
SHUTDOWN, ///< The completion queue has been shutdown. SHUTDOWN, ///< The completion queue has been shutdown and fully-drained
GOT_EVENT, ///< Got a new event; \a tag will be filled in with its GOT_EVENT, ///< Got a new event; \a tag will be filled in with its
///< associated value; \a ok indicating its success. ///< associated value; \a ok indicating its success.
TIMEOUT ///< deadline was reached. TIMEOUT ///< deadline was reached.
}; };
/// Read from the queue, blocking until an event is available or the queue is
/// shutting down.
///
/// \param tag[out] Updated to point to the read event's tag.
/// \param ok[out] true if read a successful event, false otherwise.
///
/// Note that each tag sent to the completion queue (through RPC operations
/// or alarms) will be delivered out of the completion queue by a call to
/// Next (or a related method), regardless of whether the operation succeeded
/// or not. Success here means that this operation completed in the normal
/// valid manner.
///
/// Server-side RPC request: \a ok indicates that the RPC has indeed
/// been started. If it is false, the server has been Shutdown
/// before this particular call got matched to an incoming RPC.
///
/// Client-side StartCall/RPC invocation: \a ok indicates that the RPC is
/// going to go to the wire. If it is false, it not going to the wire. This
/// would happen if the channel is either permanently broken or
/// transiently broken but with the fail-fast option. (Note that async unary
/// RPCs don't post a CQ tag at this point, nor do client-streaming
/// or bidi-streaming RPCs that have the initial metadata corked option set.)
///
/// Client-side Write, Client-side WritesDone, Server-side Write,
/// Server-side Finish, Server-side SendInitialMetadata (which is
/// typically included in Write or Finish when not done explicitly):
/// \a ok means that the data/metadata/status/etc is going to go to the
/// wire. If it is false, it not going to the wire because the call
/// is already dead (i.e., canceled, deadline expired, other side
/// dropped the channel, etc).
///
/// Client-side Read, Server-side Read, Client-side
/// RecvInitialMetadata (which is typically included in Read if not
/// done explicitly): \a ok indicates whether there is a valid message
/// that got read. If not, you know that there are certainly no more
/// messages that can ever be read from this stream. For the client-side
/// operations, this only happens because the call is dead. For the
/// server-sider operation, though, this could happen because the client
/// has done a WritesDone already.
///
/// Client-side Finish: \a ok should always be true
///
/// Server-side AsyncNotifyWhenDone: \a ok should always be true
///
/// Alarm: \a ok is true if it expired, false if it was canceled
///
/// \return true if got an event, false if the queue is fully drained and
/// shut down.
bool Next(void** tag, bool* ok) {
return (AsyncNextInternal(tag, ok,
g_core_codegen_interface->gpr_inf_future(
GPR_CLOCK_REALTIME)) != SHUTDOWN);
}
/// Read from the queue, blocking up to \a deadline (or the queue's shutdown).
/// Both \a tag and \a ok are updated upon success (if an event is available
/// within the \a deadline). A \a tag points to an arbitrary location usually
/// employed to uniquely identify an event.
///
/// \param tag[out] Upon sucess, updated to point to the event's tag.
/// \param ok[out] Upon sucess, true if a successful event, false otherwise
/// See documentation for CompletionQueue::Next for explanation of ok
/// \param deadline[in] How long to block in wait for an event.
///
/// \return The type of event read.
template <typename T>
NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) {
TimePoint<T> deadline_tp(deadline);
return AsyncNextInternal(tag, ok, deadline_tp.raw_time());
}
/// EXPERIMENTAL /// EXPERIMENTAL
/// First executes \a F, then reads from the queue, blocking up to /// First executes \a F, then reads from the queue, blocking up to
/// \a deadline (or the queue's shutdown). /// \a deadline (or the queue's shutdown).
@ -141,44 +212,16 @@ class CompletionQueue : private GrpcLibraryCodegen {
} }
} }
/// Read from the queue, blocking up to \a deadline (or the queue's shutdown).
/// Both \a tag and \a ok are updated upon success (if an event is available
/// within the \a deadline). A \a tag points to an arbitrary location usually
/// employed to uniquely identify an event.
///
/// \param tag[out] Upon sucess, updated to point to the event's tag.
/// \param ok[out] Upon sucess, true if read a regular event, false otherwise.
/// \param deadline[in] How long to block in wait for an event.
///
/// \return The type of event read.
template <typename T>
NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) {
TimePoint<T> deadline_tp(deadline);
return AsyncNextInternal(tag, ok, deadline_tp.raw_time());
}
/// Read from the queue, blocking until an event is available or the queue is
/// shutting down.
///
/// \param tag[out] Updated to point to the read event's tag.
/// \param ok[out] true if read a regular event, false otherwise.
///
/// \return true if read a regular event, false if the queue is shutting down.
bool Next(void** tag, bool* ok) {
return (AsyncNextInternal(tag, ok,
g_core_codegen_interface->gpr_inf_future(
GPR_CLOCK_REALTIME)) != SHUTDOWN);
}
/// Request the shutdown of the queue. /// Request the shutdown of the queue.
/// ///
/// \warning This method must be called at some point if this completion queue /// \warning This method must be called at some point if this completion queue
/// is accessed with Next or AsyncNext. Once invoked, \a Next /// is accessed with Next or AsyncNext. \a Next will not return false
/// will start to return false and \a AsyncNext will return \a /// until this method has been called and all pending tags have been drained.
/// NextStatus::SHUTDOWN. Only once either one of these methods does that /// (Likewise for \a AsyncNext returning \a NextStatus::SHUTDOWN .)
/// (that is, once the queue has been \em drained) can an instance of this /// Only once either one of these methods does that (that is, once the queue
/// class be destroyed. Also note that applications must ensure that /// has been \em drained) can an instance of this class be destroyed.
/// no work is enqueued on this completion queue after this method is called. /// Also note that applications must ensure that no work is enqueued on this
/// completion queue after this method is called.
void Shutdown(); void Shutdown();
/// Returns a \em raw pointer to the underlying \a grpc_completion_queue /// Returns a \em raw pointer to the underlying \a grpc_completion_queue

@ -59,17 +59,21 @@ class GrpcBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream {
bool Next(void** data, int* size) override { bool Next(void** data, int* size) override {
// Protobuf should not ask for more memory than total_size_. // Protobuf should not ask for more memory than total_size_.
GPR_CODEGEN_ASSERT(byte_count_ < total_size_); GPR_CODEGEN_ASSERT(byte_count_ < total_size_);
size_t remain = total_size_ - byte_count_;
if (have_backup_) { if (have_backup_) {
slice_ = backup_slice_; slice_ = backup_slice_;
have_backup_ = false; have_backup_ = false;
if (GRPC_SLICE_LENGTH(slice_) > remain) {
GRPC_SLICE_SET_LENGTH(slice_, remain);
}
} else { } else {
// When less than a whole block is needed, only allocate that much. // When less than a whole block is needed, only allocate that much.
// But make sure the allocated slice is not inlined. // But make sure the allocated slice is not inlined.
size_t remain = total_size_ - byte_count_ > block_size_ size_t allocate_length =
? block_size_ remain > static_cast<size_t>(block_size_) ? block_size_ : remain;
: total_size_ - byte_count_;
slice_ = g_core_codegen_interface->grpc_slice_malloc( slice_ = g_core_codegen_interface->grpc_slice_malloc(
remain > GRPC_SLICE_INLINED_SIZE ? remain allocate_length > GRPC_SLICE_INLINED_SIZE
? allocate_length
: GRPC_SLICE_INLINED_SIZE + 1); : GRPC_SLICE_INLINED_SIZE + 1);
} }
*data = GRPC_SLICE_START_PTR(slice_); *data = GRPC_SLICE_START_PTR(slice_);

@ -151,6 +151,10 @@ class ServerContext {
/// The only exception is that if the serverhandler is already returning an /// The only exception is that if the serverhandler is already returning an
/// error status code, it is ok to not return Status::CANCELLED even if /// error status code, it is ok to not return Status::CANCELLED even if
/// TryCancel() was called. /// TryCancel() was called.
///
/// Note that TryCancel() does not change any of the tags that are pending
/// on the completion queue. All pending tags will still be delivered
/// (though their ok result may reflect the effect of cancellation).
void TryCancel() const; void TryCancel() const;
/// Return a collection of initial metadata key-value pairs sent from the /// Return a collection of initial metadata key-value pairs sent from the
@ -185,7 +189,10 @@ class ServerContext {
/// \a set_compression_level. /// \a set_compression_level.
bool compression_level_set() const { return compression_level_set_; } bool compression_level_set() const { return compression_level_set_; }
/// Return the compression algorithm to be used by the server call. /// Return the compression algorithm the server call will request be used.
/// Note that the gRPC runtime may decide to ignore this request, for example,
/// due to resource constraints, or if the server is aware the client doesn't
/// support the requested algorithm.
grpc_compression_algorithm compression_algorithm() const { grpc_compression_algorithm compression_algorithm() const {
return compression_algorithm_; return compression_algorithm_;
} }

@ -1,48 +0,0 @@
/*
*
* Copyright 2017 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef GRPC_COMPRESSION_RUBY_H
#define GRPC_COMPRESSION_RUBY_H
#include <grpc/impl/codegen/port_platform.h>
#include <grpc/impl/codegen/compression_types.h>
#include <grpc/slice.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Parses the \a slice as a grpc_compression_algorithm instance and updating \a
* algorithm following algorithm names compatible with Ruby. Returns 1 upon
* success, 0 otherwise. */
GRPCAPI int grpc_compression_algorithm_parse_ruby(
grpc_slice value, grpc_compression_algorithm* algorithm);
/** Updates \a name with the encoding name corresponding to a valid \a
* algorithm. The \a name follows names compatible with Ruby. Note that \a name
* is statically allocated and must *not* be freed. Returns 1 upon success, 0
* otherwise. */
GRPCAPI int grpc_compression_algorithm_name_ruby(
grpc_compression_algorithm algorithm, const char** name);
#ifdef __cplusplus
}
#endif
#endif /* GRPC_COMPRESSION_RUBY_H */

@ -55,8 +55,8 @@ extern "C" {
/** The various compression algorithms supported by gRPC */ /** The various compression algorithms supported by gRPC */
typedef enum { typedef enum {
GRPC_COMPRESS_NONE = 0, GRPC_COMPRESS_NONE = 0,
GRPC_COMPRESS_MESSAGE_DEFLATE, GRPC_COMPRESS_DEFLATE,
GRPC_COMPRESS_MESSAGE_GZIP, GRPC_COMPRESS_GZIP,
GRPC_COMPRESS_STREAM_GZIP, GRPC_COMPRESS_STREAM_GZIP,
/* TODO(ctiller): snappy */ /* TODO(ctiller): snappy */
GRPC_COMPRESS_ALGORITHMS_COUNT GRPC_COMPRESS_ALGORITHMS_COUNT

@ -6,7 +6,6 @@ framework module grpc {
header "support/atm.h" header "support/atm.h"
header "support/cmdline.h" header "support/cmdline.h"
header "support/cpu.h" header "support/cpu.h"
header "support/host_port.h"
header "support/log.h" header "support/log.h"
header "support/log_windows.h" header "support/log_windows.h"
header "support/port_platform.h" header "support/port_platform.h"
@ -43,7 +42,6 @@ framework module grpc {
header "byte_buffer.h" header "byte_buffer.h"
header "byte_buffer_reader.h" header "byte_buffer_reader.h"
header "compression.h" header "compression.h"
header "compression_ruby.h"
header "fork.h" header "fork.h"
header "grpc.h" header "grpc.h"
header "grpc_posix.h" header "grpc_posix.h"

@ -58,7 +58,6 @@
<file baseinstalldir="/" name="include/grpc/support/atm_windows.h" role="src" /> <file baseinstalldir="/" name="include/grpc/support/atm_windows.h" role="src" />
<file baseinstalldir="/" name="include/grpc/support/cmdline.h" role="src" /> <file baseinstalldir="/" name="include/grpc/support/cmdline.h" role="src" />
<file baseinstalldir="/" name="include/grpc/support/cpu.h" role="src" /> <file baseinstalldir="/" name="include/grpc/support/cpu.h" role="src" />
<file baseinstalldir="/" name="include/grpc/support/host_port.h" role="src" />
<file baseinstalldir="/" name="include/grpc/support/log.h" role="src" /> <file baseinstalldir="/" name="include/grpc/support/log.h" role="src" />
<file baseinstalldir="/" name="include/grpc/support/log_windows.h" role="src" /> <file baseinstalldir="/" name="include/grpc/support/log_windows.h" role="src" />
<file baseinstalldir="/" name="include/grpc/support/port_platform.h" role="src" /> <file baseinstalldir="/" name="include/grpc/support/port_platform.h" role="src" />
@ -91,6 +90,7 @@
<file baseinstalldir="/" name="src/core/lib/gpr/arena.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gpr/arena.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/env.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gpr/env.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/fork.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gpr/fork.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/host_port.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/mpscq.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gpr/mpscq.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/murmur_hash.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gpr/murmur_hash.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gpr/spinlock.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/gpr/spinlock.h" role="src" />
@ -175,7 +175,6 @@
<file baseinstalldir="/" name="include/grpc/byte_buffer.h" role="src" /> <file baseinstalldir="/" name="include/grpc/byte_buffer.h" role="src" />
<file baseinstalldir="/" name="include/grpc/byte_buffer_reader.h" role="src" /> <file baseinstalldir="/" name="include/grpc/byte_buffer_reader.h" role="src" />
<file baseinstalldir="/" name="include/grpc/compression.h" role="src" /> <file baseinstalldir="/" name="include/grpc/compression.h" role="src" />
<file baseinstalldir="/" name="include/grpc/compression_ruby.h" role="src" />
<file baseinstalldir="/" name="include/grpc/fork.h" role="src" /> <file baseinstalldir="/" name="include/grpc/fork.h" role="src" />
<file baseinstalldir="/" name="include/grpc/grpc.h" role="src" /> <file baseinstalldir="/" name="include/grpc/grpc.h" role="src" />
<file baseinstalldir="/" name="include/grpc/grpc_posix.h" role="src" /> <file baseinstalldir="/" name="include/grpc/grpc_posix.h" role="src" />
@ -418,7 +417,6 @@
<file baseinstalldir="/" name="src/core/lib/channel/handshaker_registry.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/channel/handshaker_registry.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/compression.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/compression.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/compression_internal.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/compression_internal.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/compression_ruby.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/message_compress.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/message_compress.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/stream_compression.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/stream_compression.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/compression/stream_compression_gzip.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/stream_compression_gzip.cc" role="src" />

@ -1,6 +1,6 @@
# GRPC Python setup requirements # GRPC Python setup requirements
coverage>=4.0 coverage>=4.0
cython>=0.23 cython>=0.27
enum34>=1.0.4 enum34>=1.0.4
futures>=2.2.0 futures>=2.2.0
protobuf>=3.5.0.post1 protobuf>=3.5.0.post1

@ -64,16 +64,15 @@ T* array_end(T (&array)[N]) {
void PrintIncludes(grpc_generator::Printer* printer, void PrintIncludes(grpc_generator::Printer* printer,
const std::vector<grpc::string>& headers, const std::vector<grpc::string>& headers,
const Parameters& params) { bool use_system_headers, const grpc::string& search_path) {
std::map<grpc::string, grpc::string> vars; std::map<grpc::string, grpc::string> vars;
vars["l"] = params.use_system_headers ? '<' : '"'; vars["l"] = use_system_headers ? '<' : '"';
vars["r"] = params.use_system_headers ? '>' : '"'; vars["r"] = use_system_headers ? '>' : '"';
auto& s = params.grpc_search_path; if (!search_path.empty()) {
if (!s.empty()) { vars["l"] += search_path;
vars["l"] += s; if (search_path[search_path.size() - 1] != '/') {
if (s[s.size() - 1] != '/') {
vars["l"] += '/'; vars["l"] += '/';
} }
} }
@ -124,6 +123,10 @@ grpc::string GetHeaderIncludes(grpc_generator::File* file,
auto printer = file->CreatePrinter(&output); auto printer = file->CreatePrinter(&output);
std::map<grpc::string, grpc::string> vars; std::map<grpc::string, grpc::string> vars;
if (!params.additional_header_includes.empty()) {
PrintIncludes(printer.get(), params.additional_header_includes, false,
"");
}
static const char* headers_strs[] = { static const char* headers_strs[] = {
"grpc++/impl/codegen/async_stream.h", "grpc++/impl/codegen/async_stream.h",
"grpc++/impl/codegen/async_unary_call.h", "grpc++/impl/codegen/async_unary_call.h",
@ -135,7 +138,8 @@ grpc::string GetHeaderIncludes(grpc_generator::File* file,
"grpc++/impl/codegen/stub_options.h", "grpc++/impl/codegen/stub_options.h",
"grpc++/impl/codegen/sync_stream.h"}; "grpc++/impl/codegen/sync_stream.h"};
std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));
PrintIncludes(printer.get(), headers, params); PrintIncludes(printer.get(), headers, params.use_system_headers,
params.grpc_search_path);
printer->Print(vars, "\n"); printer->Print(vars, "\n");
printer->Print(vars, "namespace grpc {\n"); printer->Print(vars, "namespace grpc {\n");
printer->Print(vars, "class CompletionQueue;\n"); printer->Print(vars, "class CompletionQueue;\n");
@ -1153,7 +1157,8 @@ grpc::string GetSourceIncludes(grpc_generator::File* file,
"grpc++/impl/codegen/service_type.h", "grpc++/impl/codegen/service_type.h",
"grpc++/impl/codegen/sync_stream.h"}; "grpc++/impl/codegen/sync_stream.h"};
std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));
PrintIncludes(printer.get(), headers, params); PrintIncludes(printer.get(), headers, params.use_system_headers,
params.grpc_search_path);
if (!file->package().empty()) { if (!file->package().empty()) {
std::vector<grpc::string> parts = file->package_parts(); std::vector<grpc::string> parts = file->package_parts();
@ -1570,20 +1575,19 @@ grpc::string GetMockIncludes(grpc_generator::File* file,
"grpc++/impl/codegen/sync_stream.h", "grpc++/impl/codegen/sync_stream.h",
}; };
std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));
PrintIncludes(printer.get(), headers, params); PrintIncludes(printer.get(), headers, params.use_system_headers,
params.grpc_search_path);
std::vector<grpc::string> gmock_header; std::vector<grpc::string> gmock_header;
if (params.gmock_search_path.empty()) { if (params.gmock_search_path.empty()) {
gmock_header.push_back("gmock/gmock.h"); gmock_header.push_back("gmock/gmock.h");
PrintIncludes(printer.get(), gmock_header, params); PrintIncludes(printer.get(), gmock_header, params.use_system_headers,
params.grpc_search_path);
} else { } else {
gmock_header.push_back("gmock.h"); gmock_header.push_back("gmock.h");
// Copy a params to generate gmock header.
Parameters gmock_params(params);
// We use local includes when a gmock_search_path is given // We use local includes when a gmock_search_path is given
gmock_params.use_system_headers = false; PrintIncludes(printer.get(), gmock_header, false,
gmock_params.grpc_search_path = params.gmock_search_path; params.gmock_search_path);
PrintIncludes(printer.get(), gmock_header, gmock_params);
} }
if (!file->package().empty()) { if (!file->package().empty()) {

@ -54,6 +54,8 @@ struct Parameters {
bool generate_mock_code; bool generate_mock_code;
// Google Mock search path, when non-empty, local includes will be used. // Google Mock search path, when non-empty, local includes will be used.
grpc::string gmock_search_path; grpc::string gmock_search_path;
// *EXPERIMENTAL* Additional include files in grpc.pb.h
std::vector<grpc::string> additional_header_includes;
}; };
// Return the prologue of the generated header file. // Return the prologue of the generated header file.

@ -80,6 +80,9 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
} }
} else if (param[0] == "gmock_search_path") { } else if (param[0] == "gmock_search_path") {
generator_parameters.gmock_search_path = param[1]; generator_parameters.gmock_search_path = param[1];
} else if (param[0] == "additional_header_includes") {
generator_parameters.additional_header_includes =
grpc_generator::tokenize(param[1], ":");
} else { } else {
*error = grpc::string("Unknown parameter: ") + *parameter_string; *error = grpc::string("Unknown parameter: ") + *parameter_string;
return false; return false;

@ -1094,6 +1094,7 @@ static void pick_callback_done_locked(void* arg, grpc_error* error) {
chand, calld); chand, calld);
} }
async_pick_done_locked(elem, GRPC_ERROR_REF(error)); async_pick_done_locked(elem, GRPC_ERROR_REF(error));
GRPC_CALL_STACK_UNREF(calld->owning_call, "pick_callback");
} }
// Takes a ref to chand->lb_policy and calls grpc_lb_policy_pick_locked(). // Takes a ref to chand->lb_policy and calls grpc_lb_policy_pick_locked().
@ -1133,6 +1134,7 @@ static bool pick_callback_start_locked(grpc_call_element* elem) {
GRPC_CLOSURE_INIT(&calld->lb_pick_closure, pick_callback_done_locked, elem, GRPC_CLOSURE_INIT(&calld->lb_pick_closure, pick_callback_done_locked, elem,
grpc_combiner_scheduler(chand->combiner)); grpc_combiner_scheduler(chand->combiner));
calld->pick.on_complete = &calld->lb_pick_closure; calld->pick.on_complete = &calld->lb_pick_closure;
GRPC_CALL_STACK_REF(calld->owning_call, "pick_callback");
const bool pick_done = const bool pick_done =
grpc_lb_policy_pick_locked(chand->lb_policy, &calld->pick); grpc_lb_policy_pick_locked(chand->lb_policy, &calld->pick);
if (pick_done) { if (pick_done) {
@ -1141,6 +1143,7 @@ static bool pick_callback_start_locked(grpc_call_element* elem) {
gpr_log(GPR_DEBUG, "chand=%p calld=%p: pick completed synchronously", gpr_log(GPR_DEBUG, "chand=%p calld=%p: pick completed synchronously",
chand, calld); chand, calld);
} }
GRPC_CALL_STACK_UNREF(calld->owning_call, "pick_callback");
} else { } else {
GRPC_CALL_STACK_REF(calld->owning_call, "pick_callback_cancel"); GRPC_CALL_STACK_REF(calld->owning_call, "pick_callback_cancel");
grpc_call_combiner_set_notify_on_cancel( grpc_call_combiner_set_notify_on_cancel(

@ -22,7 +22,6 @@
#include <string.h> #include <string.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
@ -31,6 +30,7 @@
#include "src/core/ext/filters/client_channel/uri_parser.h" #include "src/core/ext/filters/client_channel/uri_parser.h"
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/slice/b64.h" #include "src/core/lib/slice/b64.h"

@ -87,7 +87,6 @@
#include <grpc/byte_buffer_reader.h> #include <grpc/byte_buffer_reader.h>
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc/support/time.h> #include <grpc/support/time.h>
@ -106,6 +105,7 @@
#include "src/core/lib/backoff/backoff.h" #include "src/core/lib/backoff/backoff.h"
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/combiner.h"

@ -328,18 +328,11 @@ static void update_lb_connectivity_status_locked(grpc_lb_subchannel_data* sd,
* 2) RULE: ANY subchannel is CONNECTING => policy is CONNECTING. * 2) RULE: ANY subchannel is CONNECTING => policy is CONNECTING.
* CHECK: sd->curr_connectivity_state == CONNECTING. * CHECK: sd->curr_connectivity_state == CONNECTING.
* *
* 3) RULE: ALL subchannels are SHUTDOWN => policy is IDLE (and requests * 3) RULE: ALL subchannels are TRANSIENT_FAILURE => policy is
* re-resolution).
* CHECK: subchannel_list->num_shutdown ==
* subchannel_list->num_subchannels.
*
* 4) RULE: ALL subchannels are SHUTDOWN or TRANSIENT_FAILURE => policy is
* TRANSIENT_FAILURE. * TRANSIENT_FAILURE.
* CHECK: subchannel_list->num_shutdown + * CHECK: subchannel_list->num_transient_failures ==
* subchannel_list->num_transient_failures ==
* subchannel_list->num_subchannels. * subchannel_list->num_subchannels.
*/ */
// TODO(juanlishen): For rule 4, we may want to re-resolve instead.
grpc_lb_subchannel_list* subchannel_list = sd->subchannel_list; grpc_lb_subchannel_list* subchannel_list = sd->subchannel_list;
round_robin_lb_policy* p = (round_robin_lb_policy*)subchannel_list->policy; round_robin_lb_policy* p = (round_robin_lb_policy*)subchannel_list->policy;
GPR_ASSERT(sd->curr_connectivity_state != GRPC_CHANNEL_IDLE); GPR_ASSERT(sd->curr_connectivity_state != GRPC_CHANNEL_IDLE);
@ -351,22 +344,12 @@ static void update_lb_connectivity_status_locked(grpc_lb_subchannel_data* sd,
/* 2) CONNECTING */ /* 2) CONNECTING */
grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_CONNECTING, grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_CONNECTING,
GRPC_ERROR_NONE, "rr_connecting"); GRPC_ERROR_NONE, "rr_connecting");
} else if (subchannel_list->num_shutdown == } else if (subchannel_list->num_transient_failures ==
subchannel_list->num_subchannels) { subchannel_list->num_subchannels) {
/* 3) IDLE and re-resolve */ /* 3) TRANSIENT_FAILURE */
grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_IDLE, grpc_connectivity_state_set(
GRPC_ERROR_NONE, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
"rr_exhausted_subchannels+reresolve"); GRPC_ERROR_REF(error), "rr_exhausted_subchannels");
p->started_picking = false;
grpc_lb_policy_try_reresolve(&p->base, &grpc_lb_round_robin_trace,
GRPC_ERROR_NONE);
} else if (subchannel_list->num_shutdown +
subchannel_list->num_transient_failures ==
subchannel_list->num_subchannels) {
/* 4) TRANSIENT_FAILURE */
grpc_connectivity_state_set(&p->state_tracker,
GRPC_CHANNEL_TRANSIENT_FAILURE,
GRPC_ERROR_REF(error), "rr_transient_failure");
} }
GRPC_ERROR_UNREF(error); GRPC_ERROR_UNREF(error);
} }
@ -387,6 +370,7 @@ static void rr_connectivity_changed_locked(void* arg, grpc_error* error) {
p->shutdown, sd->subchannel_list->shutting_down, p->shutdown, sd->subchannel_list->shutting_down,
grpc_error_string(error)); grpc_error_string(error));
} }
GPR_ASSERT(sd->subchannel != nullptr);
// If the policy is shutting down, unref and return. // If the policy is shutting down, unref and return.
if (p->shutdown) { if (p->shutdown) {
grpc_lb_subchannel_data_stop_connectivity_watch(sd); grpc_lb_subchannel_data_stop_connectivity_watch(sd);
@ -412,14 +396,19 @@ static void rr_connectivity_changed_locked(void* arg, grpc_error* error) {
// state (which was set by the connectivity state watcher) to // state (which was set by the connectivity state watcher) to
// curr_connectivity_state, which is what we use inside of the combiner. // curr_connectivity_state, which is what we use inside of the combiner.
sd->curr_connectivity_state = sd->pending_connectivity_state_unsafe; sd->curr_connectivity_state = sd->pending_connectivity_state_unsafe;
// Update state counters and new overall state.
update_state_counters_locked(sd);
update_lb_connectivity_status_locked(sd, GRPC_ERROR_REF(error));
// If the sd's new state is TRANSIENT_FAILURE, unref the *connected* // If the sd's new state is TRANSIENT_FAILURE, unref the *connected*
// subchannel, if any. // subchannel, if any.
switch (sd->curr_connectivity_state) { switch (sd->curr_connectivity_state) {
case GRPC_CHANNEL_TRANSIENT_FAILURE: { case GRPC_CHANNEL_TRANSIENT_FAILURE: {
sd->connected_subchannel.reset(); sd->connected_subchannel.reset();
if (grpc_lb_round_robin_trace.enabled()) {
gpr_log(GPR_DEBUG,
"[RR %p] Subchannel %p has gone into TRANSIENT_FAILURE. "
"Requesting re-resolution",
p, sd->subchannel);
}
grpc_lb_policy_try_reresolve(&p->base, &grpc_lb_round_robin_trace,
GRPC_ERROR_NONE);
break; break;
} }
case GRPC_CHANNEL_READY: { case GRPC_CHANNEL_READY: {
@ -442,8 +431,8 @@ static void rr_connectivity_changed_locked(void* arg, grpc_error* error) {
gpr_log(GPR_DEBUG, gpr_log(GPR_DEBUG,
"[RR %p] phasing out subchannel list %p (size %lu) in favor " "[RR %p] phasing out subchannel list %p (size %lu) in favor "
"of %p (size %lu)", "of %p (size %lu)",
(void*)p, (void*)p->subchannel_list, num_subchannels, p, p->subchannel_list, num_subchannels, sd->subchannel_list,
(void*)sd->subchannel_list, num_subchannels); num_subchannels);
} }
if (p->subchannel_list != nullptr) { if (p->subchannel_list != nullptr) {
// dispose of the current subchannel_list // dispose of the current subchannel_list
@ -455,7 +444,8 @@ static void rr_connectivity_changed_locked(void* arg, grpc_error* error) {
} }
/* at this point we know there's at least one suitable subchannel. Go /* at this point we know there's at least one suitable subchannel. Go
* ahead and pick one and notify the pending suitors in * ahead and pick one and notify the pending suitors in
* p->pending_picks. This preemptively replicates rr_pick()'s actions. */ * p->pending_picks. This preemptively replicates rr_pick()'s actions.
*/
const size_t next_ready_index = get_next_ready_subchannel_index_locked(p); const size_t next_ready_index = get_next_ready_subchannel_index_locked(p);
GPR_ASSERT(next_ready_index < p->subchannel_list->num_subchannels); GPR_ASSERT(next_ready_index < p->subchannel_list->num_subchannels);
grpc_lb_subchannel_data* selected = grpc_lb_subchannel_data* selected =
@ -488,6 +478,12 @@ static void rr_connectivity_changed_locked(void* arg, grpc_error* error) {
case GRPC_CHANNEL_CONNECTING: case GRPC_CHANNEL_CONNECTING:
case GRPC_CHANNEL_IDLE:; // fallthrough case GRPC_CHANNEL_IDLE:; // fallthrough
} }
// Update state counters and new overall state.
update_state_counters_locked(sd);
// Only update connectivity based on the selected subchannel list.
if (sd->subchannel_list == p->subchannel_list) {
update_lb_connectivity_status_locked(sd, GRPC_ERROR_REF(error));
}
// Renew notification. // Renew notification.
grpc_lb_subchannel_data_start_connectivity_watch(sd); grpc_lb_subchannel_data_start_connectivity_watch(sd);
} }
@ -562,6 +558,30 @@ static void rr_update_locked(grpc_lb_policy* policy,
return; return;
} }
if (p->started_picking) { if (p->started_picking) {
for (size_t i = 0; i < subchannel_list->num_subchannels; ++i) {
const grpc_connectivity_state subchannel_state =
grpc_subchannel_check_connectivity(
subchannel_list->subchannels[i].subchannel, nullptr);
// Override the default setting of IDLE for connectivity notification
// purposes if the subchannel is already in transient failure. Otherwise
// we'd be immediately notified of the IDLE-TRANSIENT_FAILURE
// discrepancy, attempt to re-resolve and end up here again.
// TODO(roth): As part of C++-ifying the subchannel_list API, design a
// better API for notifying the LB policy of subchannel states, which can
// be used both for the subchannel's initial state and for subsequent
// state changes. This will allow us to handle this more generally instead
// of special-casing TRANSIENT_FAILURE (e.g., we can also distribute any
// pending picks across all READY subchannels rather than sending them all
// to the first one).
if (subchannel_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
subchannel_list->subchannels[i].pending_connectivity_state_unsafe =
subchannel_list->subchannels[i].curr_connectivity_state =
subchannel_list->subchannels[i].prev_connectivity_state =
subchannel_state;
--subchannel_list->num_idle;
++subchannel_list->num_transient_failures;
}
}
if (p->latest_pending_subchannel_list != nullptr) { if (p->latest_pending_subchannel_list != nullptr) {
if (grpc_lb_round_robin_trace.enabled()) { if (grpc_lb_round_robin_trace.enabled()) {
gpr_log(GPR_DEBUG, gpr_log(GPR_DEBUG,

@ -54,13 +54,15 @@ void grpc_lb_subchannel_data_unref_subchannel(grpc_lb_subchannel_data* sd,
void grpc_lb_subchannel_data_start_connectivity_watch( void grpc_lb_subchannel_data_start_connectivity_watch(
grpc_lb_subchannel_data* sd) { grpc_lb_subchannel_data* sd) {
if (sd->subchannel_list->tracer->enabled()) { if (sd->subchannel_list->tracer->enabled()) {
gpr_log(GPR_DEBUG, gpr_log(
GPR_DEBUG,
"[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
" (subchannel %p): requesting connectivity change notification", " (subchannel %p): requesting connectivity change "
"notification (from %s)",
sd->subchannel_list->tracer->name(), sd->subchannel_list->policy, sd->subchannel_list->tracer->name(), sd->subchannel_list->policy,
sd->subchannel_list, sd->subchannel_list, (size_t)(sd - sd->subchannel_list->subchannels),
(size_t)(sd - sd->subchannel_list->subchannels), sd->subchannel_list->num_subchannels, sd->subchannel,
sd->subchannel_list->num_subchannels, sd->subchannel); grpc_connectivity_state_name(sd->pending_connectivity_state_unsafe));
} }
sd->connectivity_notification_pending = true; sd->connectivity_notification_pending = true;
grpc_subchannel_notify_on_state_change( grpc_subchannel_notify_on_state_change(

@ -101,8 +101,6 @@ struct grpc_lb_subchannel_list {
size_t num_ready; size_t num_ready;
/** how many subchannels are in state TRANSIENT_FAILURE */ /** how many subchannels are in state TRANSIENT_FAILURE */
size_t num_transient_failures; size_t num_transient_failures;
/** how many subchannels are in state SHUTDOWN */
size_t num_shutdown;
/** how many subchannels are in state IDLE */ /** how many subchannels are in state IDLE */
size_t num_idle; size_t num_idle;

@ -26,9 +26,10 @@
#endif #endif
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#ifdef GRPC_HAVE_UNIX_SOCKET #ifdef GRPC_HAVE_UNIX_SOCKET

@ -25,7 +25,6 @@
#include <unistd.h> #include <unistd.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h" #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
@ -35,6 +34,7 @@
#include "src/core/lib/backoff/backoff.h" #include "src/core/lib/backoff/backoff.h"
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/combiner.h"

@ -28,13 +28,13 @@
#include <ares.h> #include <ares.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc/support/time.h> #include <grpc/support/time.h>
#include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/parse_address.h"
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/executor.h"

@ -23,7 +23,6 @@
#include <cstring> #include <cstring>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc/support/time.h> #include <grpc/support/time.h>
@ -32,6 +31,7 @@
#include "src/core/lib/backoff/backoff.h" #include "src/core/lib/backoff/backoff.h"
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/manual_constructor.h"
#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/combiner.h"

@ -24,7 +24,6 @@
#include <string.h> #include <string.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
@ -32,6 +31,7 @@
#include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/parse_address.h"
#include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/ext/filters/client_channel/resolver_registry.h"
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/combiner.h"
@ -47,10 +47,10 @@
// //
typedef struct { typedef struct {
// base class -- must be first // Base class -- must be first
grpc_resolver base; grpc_resolver base;
// passed-in parameters // Passed-in parameters
grpc_channel_args* channel_args; grpc_channel_args* channel_args;
// If not NULL, the next set of resolution results to be returned to // If not NULL, the next set of resolution results to be returned to
@ -61,9 +61,16 @@ typedef struct {
// fake_resolver_channel_saw_error_locked(). // fake_resolver_channel_saw_error_locked().
grpc_channel_args* results_upon_error; grpc_channel_args* results_upon_error;
// pending next completion, or NULL // TODO(juanlishen): This can go away once pick_first is changed to not throw
// away its subchannels, since that will eliminate its dependence on
// channel_saw_error_locked() causing an immediate resolver return.
// A copy of the most-recently used resolution results.
grpc_channel_args* last_used_results;
// Pending next completion, or NULL
grpc_closure* next_completion; grpc_closure* next_completion;
// target result address for next completion
// Target result address for next completion
grpc_channel_args** target_result; grpc_channel_args** target_result;
} fake_resolver; } fake_resolver;
@ -71,6 +78,7 @@ static void fake_resolver_destroy(grpc_resolver* gr) {
fake_resolver* r = (fake_resolver*)gr; fake_resolver* r = (fake_resolver*)gr;
grpc_channel_args_destroy(r->next_results); grpc_channel_args_destroy(r->next_results);
grpc_channel_args_destroy(r->results_upon_error); grpc_channel_args_destroy(r->results_upon_error);
grpc_channel_args_destroy(r->last_used_results);
grpc_channel_args_destroy(r->channel_args); grpc_channel_args_destroy(r->channel_args);
gpr_free(r); gpr_free(r);
} }
@ -98,9 +106,15 @@ static void fake_resolver_maybe_finish_next_locked(fake_resolver* r) {
static void fake_resolver_channel_saw_error_locked(grpc_resolver* resolver) { static void fake_resolver_channel_saw_error_locked(grpc_resolver* resolver) {
fake_resolver* r = (fake_resolver*)resolver; fake_resolver* r = (fake_resolver*)resolver;
if (r->next_results == nullptr && r->results_upon_error != nullptr) { // A resolution must have been returned before an error is seen.
// Pretend we re-resolved. GPR_ASSERT(r->last_used_results != nullptr);
grpc_channel_args_destroy(r->next_results);
if (r->results_upon_error != nullptr) {
r->next_results = grpc_channel_args_copy(r->results_upon_error); r->next_results = grpc_channel_args_copy(r->results_upon_error);
} else {
// If results_upon_error is unavailable, re-resolve with the most-recently
// used results to avoid a no-op re-resolution.
r->next_results = grpc_channel_args_copy(r->last_used_results);
} }
fake_resolver_maybe_finish_next_locked(r); fake_resolver_maybe_finish_next_locked(r);
} }
@ -149,35 +163,56 @@ void grpc_fake_resolver_response_generator_unref(
typedef struct set_response_closure_arg { typedef struct set_response_closure_arg {
grpc_closure set_response_closure; grpc_closure set_response_closure;
grpc_fake_resolver_response_generator* generator; grpc_fake_resolver_response_generator* generator;
grpc_channel_args* next_response; grpc_channel_args* response;
bool upon_error;
} set_response_closure_arg; } set_response_closure_arg;
static void set_response_closure_fn(void* arg, grpc_error* error) { static void set_response_closure_locked(void* arg, grpc_error* error) {
set_response_closure_arg* closure_arg = (set_response_closure_arg*)arg; set_response_closure_arg* closure_arg = (set_response_closure_arg*)arg;
grpc_fake_resolver_response_generator* generator = closure_arg->generator; grpc_fake_resolver_response_generator* generator = closure_arg->generator;
fake_resolver* r = generator->resolver; fake_resolver* r = generator->resolver;
if (r->next_results != nullptr) { if (!closure_arg->upon_error) {
grpc_channel_args_destroy(r->next_results); grpc_channel_args_destroy(r->next_results);
} r->next_results = closure_arg->response;
r->next_results = closure_arg->next_response; grpc_channel_args_destroy(r->last_used_results);
if (r->results_upon_error != nullptr) { r->last_used_results = grpc_channel_args_copy(closure_arg->response);
fake_resolver_maybe_finish_next_locked(r);
} else {
grpc_channel_args_destroy(r->results_upon_error); grpc_channel_args_destroy(r->results_upon_error);
r->results_upon_error = closure_arg->response;
} }
r->results_upon_error = grpc_channel_args_copy(closure_arg->next_response);
gpr_free(closure_arg); gpr_free(closure_arg);
fake_resolver_maybe_finish_next_locked(r);
} }
void grpc_fake_resolver_response_generator_set_response( void grpc_fake_resolver_response_generator_set_response(
grpc_fake_resolver_response_generator* generator, grpc_fake_resolver_response_generator* generator,
grpc_channel_args* next_response) { grpc_channel_args* response) {
GPR_ASSERT(generator->resolver != nullptr);
GPR_ASSERT(response != nullptr);
set_response_closure_arg* closure_arg =
(set_response_closure_arg*)gpr_zalloc(sizeof(*closure_arg));
closure_arg->generator = generator;
closure_arg->response = grpc_channel_args_copy(response);
closure_arg->upon_error = false;
GRPC_CLOSURE_SCHED(GRPC_CLOSURE_INIT(&closure_arg->set_response_closure,
set_response_closure_locked, closure_arg,
grpc_combiner_scheduler(
generator->resolver->base.combiner)),
GRPC_ERROR_NONE);
}
void grpc_fake_resolver_response_generator_set_response_upon_error(
grpc_fake_resolver_response_generator* generator,
grpc_channel_args* response) {
GPR_ASSERT(generator->resolver != nullptr); GPR_ASSERT(generator->resolver != nullptr);
set_response_closure_arg* closure_arg = set_response_closure_arg* closure_arg =
(set_response_closure_arg*)gpr_zalloc(sizeof(*closure_arg)); (set_response_closure_arg*)gpr_zalloc(sizeof(*closure_arg));
closure_arg->generator = generator; closure_arg->generator = generator;
closure_arg->next_response = grpc_channel_args_copy(next_response); closure_arg->response =
response != nullptr ? grpc_channel_args_copy(response) : nullptr;
closure_arg->upon_error = true;
GRPC_CLOSURE_SCHED(GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, GRPC_CLOSURE_SCHED(GRPC_CLOSURE_INIT(&closure_arg->set_response_closure,
set_response_closure_fn, closure_arg, set_response_closure_locked, closure_arg,
grpc_combiner_scheduler( grpc_combiner_scheduler(
generator->resolver->base.combiner)), generator->resolver->base.combiner)),
GRPC_ERROR_NONE); GRPC_ERROR_NONE);

@ -36,11 +36,20 @@ typedef struct grpc_fake_resolver_response_generator
grpc_fake_resolver_response_generator* grpc_fake_resolver_response_generator*
grpc_fake_resolver_response_generator_create(); grpc_fake_resolver_response_generator_create();
// Instruct the fake resolver associated with the \a response_generator instance // Set next response of the fake resolver associated with the \a
// to trigger a new resolution for \a uri and \a args. // response_generator instance and trigger a new resolution.
void grpc_fake_resolver_response_generator_set_response( void grpc_fake_resolver_response_generator_set_response(
grpc_fake_resolver_response_generator* generator, grpc_fake_resolver_response_generator* generator,
grpc_channel_args* next_response); grpc_channel_args* response);
// Set results_upon_error of the fake resolver associated with the \a
// response_generator instance. When fake_resolver_channel_saw_error_locked() is
// called, results_upon_error will be returned as long as it's non-NULL,
// otherwise the last value set by
// grpc_fake_resolver_response_generator_set_response() will be returned.
void grpc_fake_resolver_response_generator_set_response_upon_error(
grpc_fake_resolver_response_generator* generator,
grpc_channel_args* response);
// Return a \a grpc_arg for a \a grpc_fake_resolver_response_generator instance. // Return a \a grpc_arg for a \a grpc_fake_resolver_response_generator instance.
grpc_arg grpc_fake_resolver_response_generator_arg( grpc_arg grpc_fake_resolver_response_generator_arg(

@ -22,7 +22,6 @@
#include <string.h> #include <string.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
@ -30,6 +29,7 @@
#include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/parse_address.h"
#include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/ext/filters/client_channel/resolver_registry.h"
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/combiner.h"
#include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/resolve_address.h"

@ -737,8 +737,9 @@ grpc_arg grpc_create_subchannel_address_arg(const grpc_resolved_address* addr) {
} }
namespace grpc_core { namespace grpc_core {
ConnectedSubchannel::ConnectedSubchannel(grpc_channel_stack* channel_stack) ConnectedSubchannel::ConnectedSubchannel(grpc_channel_stack* channel_stack)
: grpc_core::RefCountedWithTracing(&grpc_trace_stream_refcount), : RefCountedWithTracing<ConnectedSubchannel>(&grpc_trace_stream_refcount),
channel_stack_(channel_stack) {} channel_stack_(channel_stack) {}
ConnectedSubchannel::~ConnectedSubchannel() { ConnectedSubchannel::~ConnectedSubchannel() {
@ -773,7 +774,9 @@ grpc_error* ConnectedSubchannel::CreateCall(const CallArgs& args,
args.arena, args.arena,
sizeof(grpc_subchannel_call) + channel_stack_->call_stack_size); sizeof(grpc_subchannel_call) + channel_stack_->call_stack_size);
grpc_call_stack* callstk = SUBCHANNEL_CALL_TO_CALL_STACK(*call); grpc_call_stack* callstk = SUBCHANNEL_CALL_TO_CALL_STACK(*call);
RefCountedPtr<ConnectedSubchannel> connection =
Ref(DEBUG_LOCATION, "subchannel_call"); Ref(DEBUG_LOCATION, "subchannel_call");
connection.release(); // Ref is passed to the grpc_subchannel_call object.
(*call)->connection = this; (*call)->connection = this;
const grpc_call_element_args call_args = { const grpc_call_element_args call_args = {
callstk, /* call_stack */ callstk, /* call_stack */
@ -795,4 +798,5 @@ grpc_error* ConnectedSubchannel::CreateCall(const CallArgs& args,
grpc_call_stack_set_pollset_or_pollset_set(callstk, args.pollent); grpc_call_stack_set_pollset_or_pollset_set(callstk, args.pollent);
return GRPC_ERROR_NONE; return GRPC_ERROR_NONE;
} }
} // namespace grpc_core } // namespace grpc_core

@ -68,7 +68,8 @@ typedef struct grpc_subchannel_key grpc_subchannel_key;
#endif #endif
namespace grpc_core { namespace grpc_core {
class ConnectedSubchannel : public grpc_core::RefCountedWithTracing {
class ConnectedSubchannel : public RefCountedWithTracing<ConnectedSubchannel> {
public: public:
struct CallArgs { struct CallArgs {
grpc_polling_entity* pollent; grpc_polling_entity* pollent;
@ -93,6 +94,7 @@ class ConnectedSubchannel : public grpc_core::RefCountedWithTracing {
private: private:
grpc_channel_stack* channel_stack_; grpc_channel_stack* channel_stack_;
}; };
} // namespace grpc_core } // namespace grpc_core
grpc_subchannel* grpc_subchannel_ref( grpc_subchannel* grpc_subchannel_ref(

@ -25,8 +25,8 @@
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc/support/tls.h> #include <grpc/support/tls.h>
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/avl/avl.h" #include "src/core/lib/avl/avl.h"
#include "src/core/lib/channel/channel_args.h"
// a map of subchannel_key --> subchannel, used for detecting connections // a map of subchannel_key --> subchannel, used for detecting connections
// to the same destination in order to share them // to the same destination in order to share them
@ -165,7 +165,8 @@ grpc_subchannel* grpc_subchannel_index_register(grpc_subchannel_key* key,
// Compare and swap loop: // Compare and swap loop:
// - take a reference to the current index // - take a reference to the current index
gpr_mu_lock(&g_mu); gpr_mu_lock(&g_mu);
grpc_avl index = grpc_avl_ref(g_subchannel_index, grpc_core::ExecCtx::Get()); grpc_avl index =
grpc_avl_ref(g_subchannel_index, grpc_core::ExecCtx::Get());
gpr_mu_unlock(&g_mu); gpr_mu_unlock(&g_mu);
// - Check to see if a subchannel already exists // - Check to see if a subchannel already exists
@ -213,7 +214,8 @@ void grpc_subchannel_index_unregister(grpc_subchannel_key* key,
// Compare and swap loop: // Compare and swap loop:
// - take a reference to the current index // - take a reference to the current index
gpr_mu_lock(&g_mu); gpr_mu_lock(&g_mu);
grpc_avl index = grpc_avl_ref(g_subchannel_index, grpc_core::ExecCtx::Get()); grpc_avl index =
grpc_avl_ref(g_subchannel_index, grpc_core::ExecCtx::Get());
gpr_mu_unlock(&g_mu); gpr_mu_unlock(&g_mu);
// Check to see if this key still refers to the previously // Check to see if this key still refers to the previously

@ -37,6 +37,12 @@
#define MAX_CONNECTION_IDLE_INTEGER_OPTIONS \ #define MAX_CONNECTION_IDLE_INTEGER_OPTIONS \
{ DEFAULT_MAX_CONNECTION_IDLE_MS, 1, INT_MAX } { DEFAULT_MAX_CONNECTION_IDLE_MS, 1, INT_MAX }
/* States for idle_state in channel_data */
#define MAX_IDLE_STATE_INIT ((gpr_atm)0)
#define MAX_IDLE_STATE_SEEN_EXIT_IDLE ((gpr_atm)1)
#define MAX_IDLE_STATE_SEEN_ENTER_IDLE ((gpr_atm)2)
#define MAX_IDLE_STATE_TIMER_SET ((gpr_atm)3)
namespace { namespace {
struct channel_data { struct channel_data {
/* We take a reference to the channel stack for the timer callback */ /* We take a reference to the channel stack for the timer callback */
@ -64,7 +70,7 @@ struct channel_data {
grpc_millis max_connection_age_grace; grpc_millis max_connection_age_grace;
/* Closure to run when the channel's idle duration reaches max_connection_idle /* Closure to run when the channel's idle duration reaches max_connection_idle
and should be closed gracefully */ and should be closed gracefully */
grpc_closure close_max_idle_channel; grpc_closure max_idle_timer_cb;
/* Closure to run when the channel reaches its max age and should be closed /* Closure to run when the channel reaches its max age and should be closed
gracefully */ gracefully */
grpc_closure close_max_age_channel; grpc_closure close_max_age_channel;
@ -85,26 +91,117 @@ struct channel_data {
grpc_connectivity_state connectivity_state; grpc_connectivity_state connectivity_state;
/* Number of active calls */ /* Number of active calls */
gpr_atm call_count; gpr_atm call_count;
/* TODO(zyc): C++lize this state machine */
/* 'idle_state' holds the states of max_idle_timer and channel idleness.
It can contain one of the following values:
+--------------------------------+----------------+---------+
| idle_state | max_idle_timer | channel |
+--------------------------------+----------------+---------+
| MAX_IDLE_STATE_INIT | unset | busy |
| MAX_IDLE_STATE_TIMER_SET | set, valid | idle |
| MAX_IDLE_STATE_SEEN_EXIT_IDLE | set, invalid | busy |
| MAX_IDLE_STATE_SEEN_ENTER_IDLE | set, invalid | idle |
+--------------------------------+----------------+---------+
MAX_IDLE_STATE_INIT: The initial and final state of 'idle_state'. The
channel has 1 or 1+ active calls, and the the timer is not set. Note that
we may put a virtual call to hold this state at channel initialization or
shutdown, so that the channel won't enter other states.
MAX_IDLE_STATE_TIMER_SET: The state after the timer is set and no calls
have arrived after the timer is set. The channel must have 0 active call in
this state. If the timer is fired in this state, we will close the channel
due to idleness.
MAX_IDLE_STATE_SEEN_EXIT_IDLE: The state after the timer is set and at
least one call has arrived after the timer is set. The channel must have 1
or 1+ active calls in this state. If the timer is fired in this state, we
won't reschudle it.
MAX_IDLE_STATE_SEEN_ENTER_IDLE: The state after the timer is set and the at
least one call has arrived after the timer is set, BUT the channel
currently has 1 or 1+ active calls. If the timer is fired in this state, we
will reschudle it.
max_idle_timer will not be cancelled (unless the channel is shutting down).
If the timer callback is called when the max_idle_timer is valid (i.e.
idle_state is MAX_IDLE_STATE_TIMER_SET), the channel will be closed due to
idleness, otherwise the channel won't be changed.
State transitions:
MAX_IDLE_STATE_INIT <-------3------ MAX_IDLE_STATE_SEEN_EXIT_IDLE
^ | ^ ^ |
| | | | |
1 2 +-----------4------------+ 6 7
| | | | |
| v | | v
MAX_IDLE_STATE_TIMER_SET <----5------ MAX_IDLE_STATE_SEEN_ENTER_IDLE
For 1, 3, 5 : See max_idle_timer_cb() function
For 2, 7 : See decrease_call_count() function
For 4, 6 : See increase_call_count() function */
gpr_atm idle_state;
/* Time when the channel finished its last outstanding call, in grpc_millis */
gpr_atm last_enter_idle_time_millis;
}; };
} // namespace } // namespace
/* Increase the nubmer of active calls. Before the increasement, if there are no /* Increase the nubmer of active calls. Before the increasement, if there are no
calls, the max_idle_timer should be cancelled. */ calls, the max_idle_timer should be cancelled. */
static void increase_call_count(channel_data* chand) { static void increase_call_count(channel_data* chand) {
/* Exit idle */
if (gpr_atm_full_fetch_add(&chand->call_count, 1) == 0) { if (gpr_atm_full_fetch_add(&chand->call_count, 1) == 0) {
grpc_timer_cancel(&chand->max_idle_timer); while (true) {
gpr_atm idle_state = gpr_atm_acq_load(&chand->idle_state);
switch (idle_state) {
case MAX_IDLE_STATE_TIMER_SET:
/* max_idle_timer_cb may have already set idle_state to
MAX_IDLE_STATE_INIT, in this case, we don't need to set it to
MAX_IDLE_STATE_SEEN_EXIT_IDLE */
gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_TIMER_SET,
MAX_IDLE_STATE_SEEN_EXIT_IDLE);
return;
case MAX_IDLE_STATE_SEEN_ENTER_IDLE:
gpr_atm_rel_store(&chand->idle_state, MAX_IDLE_STATE_SEEN_EXIT_IDLE);
return;
default:
/* try again */
break;
}
}
} }
} }
/* Decrease the nubmer of active calls. After the decrement, if there are no /* Decrease the nubmer of active calls. After the decrement, if there are no
calls, the max_idle_timer should be started. */ calls, the max_idle_timer should be started. */
static void decrease_call_count(channel_data* chand) { static void decrease_call_count(channel_data* chand) {
/* Enter idle */
if (gpr_atm_full_fetch_add(&chand->call_count, -1) == 1) { if (gpr_atm_full_fetch_add(&chand->call_count, -1) == 1) {
GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_idle_timer"); gpr_atm_no_barrier_store(&chand->last_enter_idle_time_millis,
(gpr_atm)grpc_core::ExecCtx::Get()->Now());
while (true) {
gpr_atm idle_state = gpr_atm_acq_load(&chand->idle_state);
switch (idle_state) {
case MAX_IDLE_STATE_INIT:
GRPC_CHANNEL_STACK_REF(chand->channel_stack,
"max_age max_idle_timer");
grpc_timer_init( grpc_timer_init(
&chand->max_idle_timer, &chand->max_idle_timer,
grpc_core::ExecCtx::Get()->Now() + chand->max_connection_idle, grpc_core::ExecCtx::Get()->Now() + chand->max_connection_idle,
&chand->close_max_idle_channel); &chand->max_idle_timer_cb);
gpr_atm_rel_store(&chand->idle_state, MAX_IDLE_STATE_TIMER_SET);
return;
case MAX_IDLE_STATE_SEEN_EXIT_IDLE:
if (gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_SEEN_EXIT_IDLE,
MAX_IDLE_STATE_SEEN_ENTER_IDLE)) {
return;
}
break;
default:
/* try again */
break;
}
}
} }
} }
@ -152,9 +249,7 @@ static void start_max_age_grace_timer_after_goaway_op(void* arg,
"max_age start_max_age_grace_timer_after_goaway_op"); "max_age start_max_age_grace_timer_after_goaway_op");
} }
static void close_max_idle_channel(void* arg, grpc_error* error) { static void close_max_idle_channel(channel_data* chand) {
channel_data* chand = (channel_data*)arg;
if (error == GRPC_ERROR_NONE) {
/* Prevent the max idle timer from being set again */ /* Prevent the max idle timer from being set again */
gpr_atm_no_barrier_fetch_add(&chand->call_count, 1); gpr_atm_no_barrier_fetch_add(&chand->call_count, 1);
grpc_transport_op* op = grpc_make_transport_op(nullptr); grpc_transport_op* op = grpc_make_transport_op(nullptr);
@ -164,8 +259,48 @@ static void close_max_idle_channel(void* arg, grpc_error* error) {
grpc_channel_element* elem = grpc_channel_element* elem =
grpc_channel_stack_element(chand->channel_stack, 0); grpc_channel_stack_element(chand->channel_stack, 0);
elem->filter->start_transport_op(elem, op); elem->filter->start_transport_op(elem, op);
} else if (error != GRPC_ERROR_CANCELLED) { }
GRPC_LOG_IF_ERROR("close_max_idle_channel", error);
static void max_idle_timer_cb(void* arg, grpc_error* error) {
channel_data* chand = (channel_data*)arg;
if (error == GRPC_ERROR_NONE) {
bool try_again = true;
while (try_again) {
gpr_atm idle_state = gpr_atm_acq_load(&chand->idle_state);
switch (idle_state) {
case MAX_IDLE_STATE_TIMER_SET:
close_max_idle_channel(chand);
/* This MAX_IDLE_STATE_INIT is a final state, we don't have to check
* if idle_state has been changed */
gpr_atm_rel_store(&chand->idle_state, MAX_IDLE_STATE_INIT);
try_again = false;
break;
case MAX_IDLE_STATE_SEEN_EXIT_IDLE:
if (gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_SEEN_EXIT_IDLE,
MAX_IDLE_STATE_INIT)) {
try_again = false;
}
break;
case MAX_IDLE_STATE_SEEN_ENTER_IDLE:
GRPC_CHANNEL_STACK_REF(chand->channel_stack,
"max_age max_idle_timer");
grpc_timer_init(&chand->max_idle_timer,
(grpc_millis)gpr_atm_no_barrier_load(
&chand->last_enter_idle_time_millis) +
chand->max_connection_idle,
&chand->max_idle_timer_cb);
/* idle_state may have already been set to
MAX_IDLE_STATE_SEEN_EXIT_IDLE by increase_call_count(), in this
case, we don't need to set it to MAX_IDLE_STATE_TIMER_SET */
gpr_atm_rel_cas(&chand->idle_state, MAX_IDLE_STATE_SEEN_ENTER_IDLE,
MAX_IDLE_STATE_TIMER_SET);
try_again = false;
break;
default:
/* try again */
break;
}
}
} }
GRPC_CHANNEL_STACK_UNREF(chand->channel_stack, "max_age max_idle_timer"); GRPC_CHANNEL_STACK_UNREF(chand->channel_stack, "max_age max_idle_timer");
} }
@ -288,6 +423,9 @@ static grpc_error* init_channel_elem(grpc_channel_element* elem,
chand->max_connection_idle = DEFAULT_MAX_CONNECTION_IDLE_MS == INT_MAX chand->max_connection_idle = DEFAULT_MAX_CONNECTION_IDLE_MS == INT_MAX
? GRPC_MILLIS_INF_FUTURE ? GRPC_MILLIS_INF_FUTURE
: DEFAULT_MAX_CONNECTION_IDLE_MS; : DEFAULT_MAX_CONNECTION_IDLE_MS;
chand->idle_state = MAX_IDLE_STATE_INIT;
gpr_atm_no_barrier_store(&chand->last_enter_idle_time_millis,
GRPC_MILLIS_INF_PAST);
for (size_t i = 0; i < args->channel_args->num_args; ++i) { for (size_t i = 0; i < args->channel_args->num_args; ++i) {
if (0 == strcmp(args->channel_args->args[i].key, if (0 == strcmp(args->channel_args->args[i].key,
GRPC_ARG_MAX_CONNECTION_AGE_MS)) { GRPC_ARG_MAX_CONNECTION_AGE_MS)) {
@ -311,8 +449,8 @@ static grpc_error* init_channel_elem(grpc_channel_element* elem,
value == INT_MAX ? GRPC_MILLIS_INF_FUTURE : value; value == INT_MAX ? GRPC_MILLIS_INF_FUTURE : value;
} }
} }
GRPC_CLOSURE_INIT(&chand->close_max_idle_channel, close_max_idle_channel, GRPC_CLOSURE_INIT(&chand->max_idle_timer_cb, max_idle_timer_cb, chand,
chand, grpc_schedule_on_exec_ctx); grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&chand->close_max_age_channel, close_max_age_channel, chand, GRPC_CLOSURE_INIT(&chand->close_max_age_channel, close_max_age_channel, chand,
grpc_schedule_on_exec_ctx); grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&chand->force_close_max_age_channel, GRPC_CLOSURE_INIT(&chand->force_close_max_age_channel,

@ -21,12 +21,12 @@
#include <grpc/impl/codegen/port_platform.h> #include <grpc/impl/codegen/port_platform.h>
#include <grpc/slice_buffer.h> #include <grpc/slice_buffer.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/ext/transport/chttp2/transport/incoming_metadata.h" #include "src/core/ext/transport/chttp2/transport/incoming_metadata.h"
#include "src/core/ext/transport/cronet/transport/cronet_transport.h" #include "src/core/ext/transport/cronet/transport/cronet_transport.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/exec_ctx.h"

@ -143,8 +143,9 @@ static grpc_avl_node* rotate_right(const grpc_avl_vtable* vtable, void* key,
return n; return n;
} }
static grpc_avl_node* rotate_left_right(const grpc_avl_vtable* vtable, void* key, static grpc_avl_node* rotate_left_right(const grpc_avl_vtable* vtable,
void* value, grpc_avl_node* left, void* key, void* value,
grpc_avl_node* left,
grpc_avl_node* right, void* user_data) { grpc_avl_node* right, void* user_data) {
/* rotate_right(..., rotate_left(left), right) */ /* rotate_right(..., rotate_left(left), right) */
grpc_avl_node* n = grpc_avl_node* n =
@ -158,8 +159,9 @@ static grpc_avl_node* rotate_left_right(const grpc_avl_vtable* vtable, void* key
return n; return n;
} }
static grpc_avl_node* rotate_right_left(const grpc_avl_vtable* vtable, void* key, static grpc_avl_node* rotate_right_left(const grpc_avl_vtable* vtable,
void* value, grpc_avl_node* left, void* key, void* value,
grpc_avl_node* left,
grpc_avl_node* right, void* user_data) { grpc_avl_node* right, void* user_data) {
/* rotate_left(..., left, rotate_right(right)) */ /* rotate_left(..., left, rotate_right(right)) */
grpc_avl_node* n = grpc_avl_node* n =
@ -198,8 +200,9 @@ static grpc_avl_node* rebalance(const grpc_avl_vtable* vtable, void* key,
} }
} }
static grpc_avl_node* add_key(const grpc_avl_vtable* vtable, grpc_avl_node* node, static grpc_avl_node* add_key(const grpc_avl_vtable* vtable,
void* key, void* value, void* user_data) { grpc_avl_node* node, void* key, void* value,
void* user_data) {
long cmp; long cmp;
if (node == nullptr) { if (node == nullptr) {
return new_node(key, value, nullptr, nullptr); return new_node(key, value, nullptr, nullptr);

@ -29,8 +29,7 @@
int grpc_compression_algorithm_is_message( int grpc_compression_algorithm_is_message(
grpc_compression_algorithm algorithm) { grpc_compression_algorithm algorithm) {
return (algorithm >= GRPC_COMPRESS_MESSAGE_DEFLATE && return (algorithm >= GRPC_COMPRESS_DEFLATE && algorithm <= GRPC_COMPRESS_GZIP)
algorithm <= GRPC_COMPRESS_MESSAGE_GZIP)
? 1 ? 1
: 0; : 0;
} }
@ -44,11 +43,11 @@ int grpc_compression_algorithm_parse(grpc_slice name,
if (grpc_slice_eq(name, GRPC_MDSTR_IDENTITY)) { if (grpc_slice_eq(name, GRPC_MDSTR_IDENTITY)) {
*algorithm = GRPC_COMPRESS_NONE; *algorithm = GRPC_COMPRESS_NONE;
return 1; return 1;
} else if (grpc_slice_eq(name, GRPC_MDSTR_MESSAGE_SLASH_DEFLATE)) { } else if (grpc_slice_eq(name, GRPC_MDSTR_DEFLATE)) {
*algorithm = GRPC_COMPRESS_MESSAGE_DEFLATE; *algorithm = GRPC_COMPRESS_DEFLATE;
return 1; return 1;
} else if (grpc_slice_eq(name, GRPC_MDSTR_MESSAGE_SLASH_GZIP)) { } else if (grpc_slice_eq(name, GRPC_MDSTR_GZIP)) {
*algorithm = GRPC_COMPRESS_MESSAGE_GZIP; *algorithm = GRPC_COMPRESS_GZIP;
return 1; return 1;
} else if (grpc_slice_eq(name, GRPC_MDSTR_STREAM_SLASH_GZIP)) { } else if (grpc_slice_eq(name, GRPC_MDSTR_STREAM_SLASH_GZIP)) {
*algorithm = GRPC_COMPRESS_STREAM_GZIP; *algorithm = GRPC_COMPRESS_STREAM_GZIP;
@ -67,11 +66,11 @@ int grpc_compression_algorithm_name(grpc_compression_algorithm algorithm,
case GRPC_COMPRESS_NONE: case GRPC_COMPRESS_NONE:
*name = "identity"; *name = "identity";
return 1; return 1;
case GRPC_COMPRESS_MESSAGE_DEFLATE: case GRPC_COMPRESS_DEFLATE:
*name = "message/deflate"; *name = "deflate";
return 1; return 1;
case GRPC_COMPRESS_MESSAGE_GZIP: case GRPC_COMPRESS_GZIP:
*name = "message/gzip"; *name = "gzip";
return 1; return 1;
case GRPC_COMPRESS_STREAM_GZIP: case GRPC_COMPRESS_STREAM_GZIP:
*name = "stream/gzip"; *name = "stream/gzip";
@ -133,10 +132,10 @@ grpc_slice grpc_compression_algorithm_slice(
switch (algorithm) { switch (algorithm) {
case GRPC_COMPRESS_NONE: case GRPC_COMPRESS_NONE:
return GRPC_MDSTR_IDENTITY; return GRPC_MDSTR_IDENTITY;
case GRPC_COMPRESS_MESSAGE_DEFLATE: case GRPC_COMPRESS_DEFLATE:
return GRPC_MDSTR_MESSAGE_SLASH_DEFLATE; return GRPC_MDSTR_DEFLATE;
case GRPC_COMPRESS_MESSAGE_GZIP: case GRPC_COMPRESS_GZIP:
return GRPC_MDSTR_MESSAGE_SLASH_GZIP; return GRPC_MDSTR_GZIP;
case GRPC_COMPRESS_STREAM_GZIP: case GRPC_COMPRESS_STREAM_GZIP:
return GRPC_MDSTR_STREAM_SLASH_GZIP; return GRPC_MDSTR_STREAM_SLASH_GZIP;
case GRPC_COMPRESS_ALGORITHMS_COUNT: case GRPC_COMPRESS_ALGORITHMS_COUNT:
@ -148,10 +147,8 @@ grpc_slice grpc_compression_algorithm_slice(
grpc_compression_algorithm grpc_compression_algorithm_from_slice( grpc_compression_algorithm grpc_compression_algorithm_from_slice(
grpc_slice str) { grpc_slice str) {
if (grpc_slice_eq(str, GRPC_MDSTR_IDENTITY)) return GRPC_COMPRESS_NONE; if (grpc_slice_eq(str, GRPC_MDSTR_IDENTITY)) return GRPC_COMPRESS_NONE;
if (grpc_slice_eq(str, GRPC_MDSTR_MESSAGE_SLASH_DEFLATE)) if (grpc_slice_eq(str, GRPC_MDSTR_DEFLATE)) return GRPC_COMPRESS_DEFLATE;
return GRPC_COMPRESS_MESSAGE_DEFLATE; if (grpc_slice_eq(str, GRPC_MDSTR_GZIP)) return GRPC_COMPRESS_GZIP;
if (grpc_slice_eq(str, GRPC_MDSTR_MESSAGE_SLASH_GZIP))
return GRPC_COMPRESS_MESSAGE_GZIP;
if (grpc_slice_eq(str, GRPC_MDSTR_STREAM_SLASH_GZIP)) if (grpc_slice_eq(str, GRPC_MDSTR_STREAM_SLASH_GZIP))
return GRPC_COMPRESS_STREAM_GZIP; return GRPC_COMPRESS_STREAM_GZIP;
return GRPC_COMPRESS_ALGORITHMS_COUNT; return GRPC_COMPRESS_ALGORITHMS_COUNT;
@ -162,9 +159,9 @@ grpc_mdelem grpc_compression_encoding_mdelem(
switch (algorithm) { switch (algorithm) {
case GRPC_COMPRESS_NONE: case GRPC_COMPRESS_NONE:
return GRPC_MDELEM_GRPC_ENCODING_IDENTITY; return GRPC_MDELEM_GRPC_ENCODING_IDENTITY;
case GRPC_COMPRESS_MESSAGE_DEFLATE: case GRPC_COMPRESS_DEFLATE:
return GRPC_MDELEM_GRPC_ENCODING_DEFLATE; return GRPC_MDELEM_GRPC_ENCODING_DEFLATE;
case GRPC_COMPRESS_MESSAGE_GZIP: case GRPC_COMPRESS_GZIP:
return GRPC_MDELEM_GRPC_ENCODING_GZIP; return GRPC_MDELEM_GRPC_ENCODING_GZIP;
case GRPC_COMPRESS_STREAM_GZIP: case GRPC_COMPRESS_STREAM_GZIP:
return GRPC_MDELEM_GRPC_ENCODING_GZIP; return GRPC_MDELEM_GRPC_ENCODING_GZIP;

@ -80,9 +80,9 @@ grpc_message_compression_algorithm
grpc_compression_algorithm_to_message_compression_algorithm( grpc_compression_algorithm_to_message_compression_algorithm(
grpc_compression_algorithm algo) { grpc_compression_algorithm algo) {
switch (algo) { switch (algo) {
case GRPC_COMPRESS_MESSAGE_DEFLATE: case GRPC_COMPRESS_DEFLATE:
return GRPC_MESSAGE_COMPRESS_DEFLATE; return GRPC_MESSAGE_COMPRESS_DEFLATE;
case GRPC_COMPRESS_MESSAGE_GZIP: case GRPC_COMPRESS_GZIP:
return GRPC_MESSAGE_COMPRESS_GZIP; return GRPC_MESSAGE_COMPRESS_GZIP;
default: default:
return GRPC_MESSAGE_COMPRESS_NONE; return GRPC_MESSAGE_COMPRESS_NONE;
@ -147,10 +147,10 @@ int grpc_compression_algorithm_from_message_stream_compression_algorithm(
*algorithm = GRPC_COMPRESS_NONE; *algorithm = GRPC_COMPRESS_NONE;
return 1; return 1;
case GRPC_MESSAGE_COMPRESS_DEFLATE: case GRPC_MESSAGE_COMPRESS_DEFLATE:
*algorithm = GRPC_COMPRESS_MESSAGE_DEFLATE; *algorithm = GRPC_COMPRESS_DEFLATE;
return 1; return 1;
case GRPC_MESSAGE_COMPRESS_GZIP: case GRPC_MESSAGE_COMPRESS_GZIP:
*algorithm = GRPC_COMPRESS_MESSAGE_GZIP; *algorithm = GRPC_COMPRESS_GZIP;
return 1; return 1;
default: default:
*algorithm = GRPC_COMPRESS_NONE; *algorithm = GRPC_COMPRESS_NONE;

@ -1,65 +0,0 @@
/*
*
* Copyright 2017 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <grpc/compression_ruby.h>
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/transport/static_metadata.h"
int grpc_compression_algorithm_parse_ruby(
grpc_slice name, grpc_compression_algorithm* algorithm) {
if (grpc_slice_eq(name, GRPC_MDSTR_IDENTITY)) {
*algorithm = GRPC_COMPRESS_NONE;
return 1;
} else if (grpc_slice_eq(name, GRPC_MDSTR_DEFLATE)) {
*algorithm = GRPC_COMPRESS_MESSAGE_DEFLATE;
return 1;
} else if (grpc_slice_eq(name, GRPC_MDSTR_GZIP)) {
*algorithm = GRPC_COMPRESS_MESSAGE_GZIP;
return 1;
} else if (grpc_slice_eq(name, GRPC_MDSTR_STREAM_SLASH_GZIP)) {
*algorithm = GRPC_COMPRESS_STREAM_GZIP;
return 1;
} else {
return 0;
}
return 0;
}
int grpc_compression_algorithm_name_ruby(grpc_compression_algorithm algorithm,
const char** name) {
GRPC_API_TRACE("grpc_compression_algorithm_parse(algorithm=%d, name=%p)", 2,
((int)algorithm, name));
switch (algorithm) {
case GRPC_COMPRESS_NONE:
*name = "identity";
return 1;
case GRPC_COMPRESS_MESSAGE_DEFLATE:
*name = "deflate";
return 1;
case GRPC_COMPRESS_MESSAGE_GZIP:
*name = "gzip";
return 1;
case GRPC_COMPRESS_STREAM_GZIP:
*name = "stream/gzip";
return 1;
case GRPC_COMPRESS_ALGORITHMS_COUNT:
return 0;
}
return 0;
}

@ -29,7 +29,7 @@
variable exists). */ variable exists). */
char* gpr_getenv(const char* name); char* gpr_getenv(const char* name);
/* Sets the the environment with the specified name to the specified value. */ /* Sets the environment with the specified name to the specified value. */
void gpr_setenv(const char* name, const char* value); void gpr_setenv(const char* name, const char* value);
/* This is a version of gpr_getenv that does not produce any output if it has to /* This is a version of gpr_getenv that does not produce any output if it has to

@ -16,13 +16,14 @@
* *
*/ */
#include <grpc/support/host_port.h> #include "src/core/lib/gpr/host_port.h"
#include <string.h> #include <string.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
int gpr_join_host_port(char** out, const char* host, int port) { int gpr_join_host_port(char** out, const char* host, int port) {

@ -16,15 +16,11 @@
* *
*/ */
#ifndef GRPC_SUPPORT_HOST_PORT_H #ifndef GRPC_CORE_LIB_GPR_HOST_PORT_H
#define GRPC_SUPPORT_HOST_PORT_H #define GRPC_CORE_LIB_GPR_HOST_PORT_H
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Given a host and port, creates a newly-allocated string of the form /** Given a host and port, creates a newly-allocated string of the form
"host:port" or "[ho:st]:port", depending on whether the host contains colons "host:port" or "[ho:st]:port", depending on whether the host contains colons
like an IPv6 literal. If the host is already bracketed, then additional like an IPv6 literal. If the host is already bracketed, then additional
@ -35,17 +31,13 @@ extern "C" {
destroyed using gpr_free(). destroyed using gpr_free().
In the unlikely event of an error, returns -1 and sets *out to NULL. */ In the unlikely event of an error, returns -1 and sets *out to NULL. */
GPRAPI int gpr_join_host_port(char** out, const char* host, int port); int gpr_join_host_port(char** out, const char* host, int port);
/** Given a name in the form "host:port" or "[ho:st]:port", split into hostname /** Given a name in the form "host:port" or "[ho:st]:port", split into hostname
and port number, into newly allocated strings, which must later be and port number, into newly allocated strings, which must later be
destroyed using gpr_free(). destroyed using gpr_free().
Return 1 on success, 0 on failure. Guarantees *host and *port == NULL on Return 1 on success, 0 on failure. Guarantees *host and *port == NULL on
failure. */ failure. */
GPRAPI int gpr_split_host_port(const char* name, char** host, char** port); int gpr_split_host_port(const char* name, char** host, char** port);
#ifdef __cplusplus
}
#endif
#endif /* GRPC_SUPPORT_HOST_PORT_H */ #endif /* GRPC_CORE_LIB_GPR_HOST_PORT_H */

@ -28,6 +28,7 @@
#include "src/core/lib/gprpp/abstract.h" #include "src/core/lib/gprpp/abstract.h"
#include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/debug_location.h"
#include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
namespace grpc_core { namespace grpc_core {
@ -69,6 +70,7 @@ inline OrphanablePtr<T> MakeOrphanable(Args&&... args) {
} }
// A type of Orphanable with internal ref-counting. // A type of Orphanable with internal ref-counting.
template <typename Child>
class InternallyRefCounted : public Orphanable { class InternallyRefCounted : public Orphanable {
public: public:
// Not copyable nor movable. // Not copyable nor movable.
@ -78,10 +80,20 @@ class InternallyRefCounted : public Orphanable {
GRPC_ABSTRACT_BASE_CLASS GRPC_ABSTRACT_BASE_CLASS
protected: protected:
// Allow Delete() to access destructor.
template <typename T>
friend void Delete(T*);
// Allow RefCountedPtr<> to access Unref() and IncrementRefCount().
friend class RefCountedPtr<Child>;
InternallyRefCounted() { gpr_ref_init(&refs_, 1); } InternallyRefCounted() { gpr_ref_init(&refs_, 1); }
virtual ~InternallyRefCounted() {} virtual ~InternallyRefCounted() {}
void Ref() { gpr_ref(&refs_); } RefCountedPtr<Child> Ref() GRPC_MUST_USE_RESULT {
IncrementRefCount();
return RefCountedPtr<Child>(static_cast<Child*>(this));
}
void Unref() { void Unref() {
if (gpr_unref(&refs_)) { if (gpr_unref(&refs_)) {
@ -89,11 +101,9 @@ class InternallyRefCounted : public Orphanable {
} }
} }
// Allow Delete() to access destructor.
template <typename T>
friend void Delete(T*);
private: private:
void IncrementRefCount() { gpr_ref(&refs_); }
gpr_refcount refs_; gpr_refcount refs_;
}; };
@ -103,6 +113,7 @@ class InternallyRefCounted : public Orphanable {
// pointers and legacy code that is manually calling Ref() and Unref(). // pointers and legacy code that is manually calling Ref() and Unref().
// Once all of our code is converted to idiomatic C++, we may be able to // Once all of our code is converted to idiomatic C++, we may be able to
// eliminate this class. // eliminate this class.
template <typename Child>
class InternallyRefCountedWithTracing : public Orphanable { class InternallyRefCountedWithTracing : public Orphanable {
public: public:
// Not copyable nor movable. // Not copyable nor movable.
@ -118,6 +129,9 @@ class InternallyRefCountedWithTracing : public Orphanable {
template <typename T> template <typename T>
friend void Delete(T*); friend void Delete(T*);
// Allow RefCountedPtr<> to access Unref() and IncrementRefCount().
friend class RefCountedPtr<Child>;
InternallyRefCountedWithTracing() InternallyRefCountedWithTracing()
: InternallyRefCountedWithTracing(static_cast<TraceFlag*>(nullptr)) {} : InternallyRefCountedWithTracing(static_cast<TraceFlag*>(nullptr)) {}
@ -133,18 +147,27 @@ class InternallyRefCountedWithTracing : public Orphanable {
virtual ~InternallyRefCountedWithTracing() {} virtual ~InternallyRefCountedWithTracing() {}
void Ref() { gpr_ref(&refs_); } RefCountedPtr<Child> Ref() GRPC_MUST_USE_RESULT {
IncrementRefCount();
return RefCountedPtr<Child>(static_cast<Child*>(this));
}
void Ref(const DebugLocation& location, const char* reason) { RefCountedPtr<Child> Ref(const DebugLocation& location,
const char* reason) GRPC_MUST_USE_RESULT {
if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) {
gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count);
gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s",
trace_flag_->name(), this, location.file(), location.line(), trace_flag_->name(), this, location.file(), location.line(),
old_refs, old_refs + 1, reason); old_refs, old_refs + 1, reason);
} }
Ref(); return Ref();
} }
// TODO(roth): Once all of our code is converted to C++ and can use
// RefCountedPtr<> instead of manual ref-counting, make the Unref() methods
// private, since they will only be used by RefCountedPtr<>, which is a
// friend of this class.
void Unref() { void Unref() {
if (gpr_unref(&refs_)) { if (gpr_unref(&refs_)) {
Delete(this); Delete(this);
@ -162,6 +185,8 @@ class InternallyRefCountedWithTracing : public Orphanable {
} }
private: private:
void IncrementRefCount() { gpr_ref(&refs_); }
TraceFlag* trace_flag_ = nullptr; TraceFlag* trace_flag_ = nullptr;
gpr_refcount refs_; gpr_refcount refs_;
}; };

@ -26,16 +26,28 @@
#include "src/core/lib/gprpp/abstract.h" #include "src/core/lib/gprpp/abstract.h"
#include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/debug_location.h"
#include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
namespace grpc_core { namespace grpc_core {
// A base class for reference-counted objects. // A base class for reference-counted objects.
// New objects should be created via New() and start with a refcount of 1. // New objects should be created via New() and start with a refcount of 1.
// When the refcount reaches 0, the object will be deleted via Delete(). // When the refcount reaches 0, the object will be deleted via Delete().
//
// This will commonly be used by CRTP (curiously-recurring template pattern)
// e.g., class MyClass : public RefCounted<MyClass>
template <typename Child>
class RefCounted { class RefCounted {
public: public:
void Ref() { gpr_ref(&refs_); } RefCountedPtr<Child> Ref() GRPC_MUST_USE_RESULT {
IncrementRefCount();
return RefCountedPtr<Child>(static_cast<Child*>(this));
}
// TODO(roth): Once all of our code is converted to C++ and can use
// RefCountedPtr<> instead of manual ref-counting, make this method
// private, since it will only be used by RefCountedPtr<>, which is a
// friend of this class.
void Unref() { void Unref() {
if (gpr_unref(&refs_)) { if (gpr_unref(&refs_)) {
Delete(this); Delete(this);
@ -58,6 +70,11 @@ class RefCounted {
virtual ~RefCounted() {} virtual ~RefCounted() {}
private: private:
// Allow RefCountedPtr<> to access IncrementRefCount().
friend class RefCountedPtr<Child>;
void IncrementRefCount() { gpr_ref(&refs_); }
gpr_refcount refs_; gpr_refcount refs_;
}; };
@ -67,20 +84,30 @@ class RefCounted {
// pointers and legacy code that is manually calling Ref() and Unref(). // pointers and legacy code that is manually calling Ref() and Unref().
// Once all of our code is converted to idiomatic C++, we may be able to // Once all of our code is converted to idiomatic C++, we may be able to
// eliminate this class. // eliminate this class.
template <typename Child>
class RefCountedWithTracing { class RefCountedWithTracing {
public: public:
void Ref() { gpr_ref(&refs_); } RefCountedPtr<Child> Ref() GRPC_MUST_USE_RESULT {
IncrementRefCount();
return RefCountedPtr<Child>(static_cast<Child*>(this));
}
void Ref(const DebugLocation& location, const char* reason) { RefCountedPtr<Child> Ref(const DebugLocation& location,
const char* reason) GRPC_MUST_USE_RESULT {
if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) {
gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count);
gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s",
trace_flag_->name(), this, location.file(), location.line(), trace_flag_->name(), this, location.file(), location.line(),
old_refs, old_refs + 1, reason); old_refs, old_refs + 1, reason);
} }
Ref(); return Ref();
} }
// TODO(roth): Once all of our code is converted to C++ and can use
// RefCountedPtr<> instead of manual ref-counting, make the Unref() methods
// private, since they will only be used by RefCountedPtr<>, which is a
// friend of this class.
void Unref() { void Unref() {
if (gpr_unref(&refs_)) { if (gpr_unref(&refs_)) {
Delete(this); Delete(this);
@ -124,6 +151,11 @@ class RefCountedWithTracing {
virtual ~RefCountedWithTracing() {} virtual ~RefCountedWithTracing() {}
private: private:
// Allow RefCountedPtr<> to access IncrementRefCount().
friend class RefCountedPtr<Child>;
void IncrementRefCount() { gpr_ref(&refs_); }
TraceFlag* trace_flag_ = nullptr; TraceFlag* trace_flag_ = nullptr;
gpr_refcount refs_; gpr_refcount refs_;
}; };

@ -25,8 +25,8 @@
namespace grpc_core { namespace grpc_core {
// A smart pointer class for objects that provide Ref() and Unref() methods, // A smart pointer class for objects that provide IncrementRefCount() and
// such as those provided by the RefCounted base class. // Unref() methods, such as those provided by the RefCounted base class.
template <typename T> template <typename T>
class RefCountedPtr { class RefCountedPtr {
public: public:
@ -49,13 +49,13 @@ class RefCountedPtr {
// Copy support. // Copy support.
RefCountedPtr(const RefCountedPtr& other) { RefCountedPtr(const RefCountedPtr& other) {
if (other.value_ != nullptr) other.value_->Ref(); if (other.value_ != nullptr) other.value_->IncrementRefCount();
value_ = other.value_; value_ = other.value_;
} }
RefCountedPtr& operator=(const RefCountedPtr& other) { RefCountedPtr& operator=(const RefCountedPtr& other) {
// Note: Order of reffing and unreffing is important here in case value_ // Note: Order of reffing and unreffing is important here in case value_
// and other.value_ are the same object. // and other.value_ are the same object.
if (other.value_ != nullptr) other.value_->Ref(); if (other.value_ != nullptr) other.value_->IncrementRefCount();
if (value_ != nullptr) value_->Unref(); if (value_ != nullptr) value_->Unref();
value_ = other.value_; value_ = other.value_;
return *this; return *this;
@ -71,6 +71,16 @@ class RefCountedPtr {
value_ = value; value_ = value;
} }
// TODO(roth): This method exists solely as a transition mechanism to allow
// us to pass a ref to idiomatic C code that does not use RefCountedPtr<>.
// Once all of our code has been converted to idiomatic C++, this
// method should go away.
T* release() {
T* value = value_;
value_ = nullptr;
return value;
}
T* get() const { return value_; } T* get() const { return value_; }
T& operator*() const { return *value_; } T& operator*() const { return *value_; }

@ -57,7 +57,7 @@
//#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1 //#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1
#define MAX_EPOLL_EVENTS 100 #define MAX_EPOLL_EVENTS 100
#define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 5 #define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 1
grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false, grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false,
"pollable_refcount"); "pollable_refcount");
@ -1452,10 +1452,6 @@ static const grpc_event_engine_vtable vtable = {
const grpc_event_engine_vtable* grpc_init_epollex_linux( const grpc_event_engine_vtable* grpc_init_epollex_linux(
bool explicitly_requested) { bool explicitly_requested) {
if (!explicitly_requested) {
return nullptr;
}
if (!grpc_has_wakeup_fd()) { if (!grpc_has_wakeup_fd()) {
gpr_log(GPR_ERROR, "Skipping epollex because of no wakeup fd."); gpr_log(GPR_ERROR, "Skipping epollex because of no wakeup fd.");
return nullptr; return nullptr;

@ -457,16 +457,20 @@ static grpc_error* fd_shutdown_error(grpc_fd* fd) {
if (!fd->shutdown) { if (!fd->shutdown) {
return GRPC_ERROR_NONE; return GRPC_ERROR_NONE;
} else { } else {
return GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( return grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
"FD shutdown", &fd->shutdown_error, 1); "FD shutdown", &fd->shutdown_error, 1),
GRPC_ERROR_INT_GRPC_STATUS,
GRPC_STATUS_UNAVAILABLE);
} }
} }
static void notify_on_locked(grpc_fd* fd, grpc_closure** st, static void notify_on_locked(grpc_fd* fd, grpc_closure** st,
grpc_closure* closure) { grpc_closure* closure) {
if (fd->shutdown || gpr_atm_no_barrier_load(&fd->pollhup)) { if (fd->shutdown || gpr_atm_no_barrier_load(&fd->pollhup)) {
GRPC_CLOSURE_SCHED(closure, GRPC_CLOSURE_SCHED(
GRPC_ERROR_CREATE_FROM_STATIC_STRING("FD shutdown")); closure, grpc_error_set_int(
GRPC_ERROR_CREATE_FROM_STATIC_STRING("FD shutdown"),
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
} else if (*st == CLOSURE_NOT_READY) { } else if (*st == CLOSURE_NOT_READY) {
/* not ready ==> switch to a waiting state by setting the closure */ /* not ready ==> switch to a waiting state by setting the closure */
*st = closure; *st = closure;

@ -27,12 +27,12 @@
#include <sys/types.h> #include <sys/types.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc/support/thd.h> #include <grpc/support/thd.h>
#include <grpc/support/time.h> #include <grpc/support/time.h>
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gpr/useful.h" #include "src/core/lib/gpr/useful.h"
#include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/block_annotate.h"

@ -22,10 +22,10 @@
#include <uv.h> #include <uv.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/useful.h" #include "src/core/lib/gpr/useful.h"
#include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/error.h"

@ -28,12 +28,13 @@
#include <sys/types.h> #include <sys/types.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/log_windows.h> #include <grpc/support/log_windows.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc/support/thd.h> #include <grpc/support/thd.h>
#include <grpc/support/time.h> #include <grpc/support/time.h>
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/block_annotate.h"
#include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/executor.h"

@ -23,11 +23,11 @@
#include <string.h> #include <string.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr.h"
#include "src/core/lib/iomgr/socket_utils.h" #include "src/core/lib/iomgr/socket_utils.h"

@ -36,10 +36,11 @@
#include <unistd.h> #include <unistd.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <grpc/support/sync.h> #include <grpc/support/sync.h>
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/sockaddr_utils.h"

@ -118,6 +118,7 @@ static void on_credentials_metadata(void* arg, grpc_error* input_error) {
grpc_transport_stream_op_batch_finish_with_failure(batch, error, grpc_transport_stream_op_batch_finish_with_failure(batch, error,
calld->call_combiner); calld->call_combiner);
} }
GRPC_CALL_STACK_UNREF(calld->owning_call, "get_request_metadata");
} }
void grpc_auth_metadata_context_build( void grpc_auth_metadata_context_build(
@ -208,7 +209,7 @@ static void send_security_metadata(grpc_call_element* elem,
chand->auth_context, &calld->auth_md_context); chand->auth_context, &calld->auth_md_context);
GPR_ASSERT(calld->pollent != nullptr); GPR_ASSERT(calld->pollent != nullptr);
GRPC_CALL_STACK_REF(calld->owning_call, "get_request_metadata");
GRPC_CLOSURE_INIT(&calld->async_result_closure, on_credentials_metadata, GRPC_CLOSURE_INIT(&calld->async_result_closure, on_credentials_metadata,
batch, grpc_schedule_on_exec_ctx); batch, grpc_schedule_on_exec_ctx);
grpc_error* error = GRPC_ERROR_NONE; grpc_error* error = GRPC_ERROR_NONE;
@ -250,6 +251,7 @@ static void on_host_checked(void* arg, grpc_error* error) {
calld->call_combiner); calld->call_combiner);
gpr_free(error_msg); gpr_free(error_msg);
} }
GRPC_CALL_STACK_UNREF(calld->owning_call, "check_call_host");
} }
static void cancel_check_call_host(void* arg, grpc_error* error) { static void cancel_check_call_host(void* arg, grpc_error* error) {
@ -312,6 +314,7 @@ static void auth_start_transport_stream_op_batch(
} }
if (calld->have_host) { if (calld->have_host) {
batch->handler_private.extra_arg = elem; batch->handler_private.extra_arg = elem;
GRPC_CALL_STACK_REF(calld->owning_call, "check_call_host");
GRPC_CLOSURE_INIT(&calld->async_result_closure, on_host_checked, batch, GRPC_CLOSURE_INIT(&calld->async_result_closure, on_host_checked, batch,
grpc_schedule_on_exec_ctx); grpc_schedule_on_exec_ctx);
char* call_host = grpc_slice_to_c_string(calld->host); char* call_host = grpc_slice_to_c_string(calld->host);

@ -23,7 +23,6 @@
#include <grpc/slice_buffer.h> #include <grpc/slice_buffer.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
@ -31,6 +30,7 @@
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/handshaker.h" #include "src/core/lib/channel/handshaker.h"
#include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/iomgr/load_file.h"
#include "src/core/lib/security/context/security_context.h" #include "src/core/lib/security/context/security_context.h"

@ -1032,6 +1032,7 @@ static grpc_stream_compression_algorithm decode_stream_compression(
static void publish_app_metadata(grpc_call* call, grpc_metadata_batch* b, static void publish_app_metadata(grpc_call* call, grpc_metadata_batch* b,
int is_trailing) { int is_trailing) {
if (b->list.count == 0) return; if (b->list.count == 0) return;
if (is_trailing && call->buffered_metadata[1] == nullptr) return;
GPR_TIMER_SCOPE("publish_app_metadata", 0); GPR_TIMER_SCOPE("publish_app_metadata", 0);
grpc_metadata_array* dest; grpc_metadata_array* dest;
grpc_metadata* mdusr; grpc_metadata* mdusr;

@ -23,4 +23,4 @@
const char* grpc_version_string(void) { return "6.0.0-dev"; } const char* grpc_version_string(void) { return "6.0.0-dev"; }
const char* grpc_g_stands_for(void) { return "glossy"; } const char* grpc_g_stands_for(void) { return "glamorous"; }

@ -20,7 +20,7 @@
* To make changes to this file, change * To make changes to this file, change
* tools/codegen/core/gen_static_metadata.py, and then re-run it. * tools/codegen/core/gen_static_metadata.py, and then re-run it.
* *
* See metadata.h for an explanation of the interface here, and metadata.c for * See metadata.h for an explanation of the interface here, and metadata.cc for
* an explanation of what's going on. * an explanation of what's going on.
*/ */
@ -57,53 +57,52 @@ static uint8_t g_bytes[] = {
112, 111, 110, 115, 101, 95, 109, 101, 115, 115, 97, 103, 101, 95, 98, 112, 111, 110, 115, 101, 95, 109, 101, 115, 115, 97, 103, 101, 95, 98,
121, 116, 101, 115, 47, 103, 114, 112, 99, 46, 108, 98, 46, 118, 49, 121, 116, 101, 115, 47, 103, 114, 112, 99, 46, 108, 98, 46, 118, 49,
46, 76, 111, 97, 100, 66, 97, 108, 97, 110, 99, 101, 114, 47, 66, 46, 76, 111, 97, 100, 66, 97, 108, 97, 110, 99, 101, 114, 47, 66,
97, 108, 97, 110, 99, 101, 76, 111, 97, 100, 109, 101, 115, 115, 97, 97, 108, 97, 110, 99, 101, 76, 111, 97, 100, 100, 101, 102, 108, 97,
103, 101, 47, 100, 101, 102, 108, 97, 116, 101, 109, 101, 115, 115, 97, 116, 101, 103, 122, 105, 112, 115, 116, 114, 101, 97, 109, 47, 103, 122,
103, 101, 47, 103, 122, 105, 112, 115, 116, 114, 101, 97, 109, 47, 103, 105, 112, 48, 49, 50, 105, 100, 101, 110, 116, 105, 116, 121, 116, 114,
122, 105, 112, 48, 49, 50, 105, 100, 101, 110, 116, 105, 116, 121, 103, 97, 105, 108, 101, 114, 115, 97, 112, 112, 108, 105, 99, 97, 116, 105,
122, 105, 112, 100, 101, 102, 108, 97, 116, 101, 116, 114, 97, 105, 108, 111, 110, 47, 103, 114, 112, 99, 80, 79, 83, 84, 50, 48, 48, 52,
101, 114, 115, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 48, 52, 104, 116, 116, 112, 104, 116, 116, 112, 115, 103, 114, 112, 99,
103, 114, 112, 99, 80, 79, 83, 84, 50, 48, 48, 52, 48, 52, 104, 71, 69, 84, 80, 85, 84, 47, 47, 105, 110, 100, 101, 120, 46, 104,
116, 116, 112, 104, 116, 116, 112, 115, 103, 114, 112, 99, 71, 69, 84, 116, 109, 108, 50, 48, 52, 50, 48, 54, 51, 48, 52, 52, 48, 48,
80, 85, 84, 47, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 53, 48, 48, 97, 99, 99, 101, 112, 116, 45, 99, 104, 97, 114, 115,
50, 48, 52, 50, 48, 54, 51, 48, 52, 52, 48, 48, 53, 48, 48, 101, 116, 103, 122, 105, 112, 44, 32, 100, 101, 102, 108, 97, 116, 101,
97, 99, 99, 101, 112, 116, 45, 99, 104, 97, 114, 115, 101, 116, 103, 97, 99, 99, 101, 112, 116, 45, 108, 97, 110, 103, 117, 97, 103, 101,
122, 105, 112, 44, 32, 100, 101, 102, 108, 97, 116, 101, 97, 99, 99, 97, 99, 99, 101, 112, 116, 45, 114, 97, 110, 103, 101, 115, 97, 99,
101, 112, 116, 45, 108, 97, 110, 103, 117, 97, 103, 101, 97, 99, 99, 99, 101, 112, 116, 97, 99, 99, 101, 115, 115, 45, 99, 111, 110, 116,
101, 112, 116, 45, 114, 97, 110, 103, 101, 115, 97, 99, 99, 101, 112, 114, 111, 108, 45, 97, 108, 108, 111, 119, 45, 111, 114, 105, 103, 105,
116, 97, 99, 99, 101, 115, 115, 45, 99, 111, 110, 116, 114, 111, 108, 110, 97, 103, 101, 97, 108, 108, 111, 119, 97, 117, 116, 104, 111, 114,
45, 97, 108, 108, 111, 119, 45, 111, 114, 105, 103, 105, 110, 97, 103, 105, 122, 97, 116, 105, 111, 110, 99, 97, 99, 104, 101, 45, 99, 111,
101, 97, 108, 108, 111, 119, 97, 117, 116, 104, 111, 114, 105, 122, 97, 110, 116, 114, 111, 108, 99, 111, 110, 116, 101, 110, 116, 45, 100, 105,
116, 105, 111, 110, 99, 97, 99, 104, 101, 45, 99, 111, 110, 116, 114, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99, 111, 110, 116, 101, 110,
111, 108, 99, 111, 110, 116, 101, 110, 116, 45, 100, 105, 115, 112, 111, 116, 45, 108, 97, 110, 103, 117, 97, 103, 101, 99, 111, 110, 116, 101,
115, 105, 116, 105, 111, 110, 99, 111, 110, 116, 101, 110, 116, 45, 108, 110, 116, 45, 108, 101, 110, 103, 116, 104, 99, 111, 110, 116, 101, 110,
97, 110, 103, 117, 97, 103, 101, 99, 111, 110, 116, 101, 110, 116, 45, 116, 45, 108, 111, 99, 97, 116, 105, 111, 110, 99, 111, 110, 116, 101,
108, 101, 110, 103, 116, 104, 99, 111, 110, 116, 101, 110, 116, 45, 108, 110, 116, 45, 114, 97, 110, 103, 101, 99, 111, 111, 107, 105, 101, 100,
111, 99, 97, 116, 105, 111, 110, 99, 111, 110, 116, 101, 110, 116, 45, 97, 116, 101, 101, 116, 97, 103, 101, 120, 112, 101, 99, 116, 101, 120,
114, 97, 110, 103, 101, 99, 111, 111, 107, 105, 101, 100, 97, 116, 101, 112, 105, 114, 101, 115, 102, 114, 111, 109, 105, 102, 45, 109, 97, 116,
101, 116, 97, 103, 101, 120, 112, 101, 99, 116, 101, 120, 112, 105, 114, 99, 104, 105, 102, 45, 109, 111, 100, 105, 102, 105, 101, 100, 45, 115,
101, 115, 102, 114, 111, 109, 105, 102, 45, 109, 97, 116, 99, 104, 105, 105, 110, 99, 101, 105, 102, 45, 110, 111, 110, 101, 45, 109, 97, 116,
102, 45, 109, 111, 100, 105, 102, 105, 101, 100, 45, 115, 105, 110, 99, 99, 104, 105, 102, 45, 114, 97, 110, 103, 101, 105, 102, 45, 117, 110,
101, 105, 102, 45, 110, 111, 110, 101, 45, 109, 97, 116, 99, 104, 105, 109, 111, 100, 105, 102, 105, 101, 100, 45, 115, 105, 110, 99, 101, 108,
102, 45, 114, 97, 110, 103, 101, 105, 102, 45, 117, 110, 109, 111, 100, 97, 115, 116, 45, 109, 111, 100, 105, 102, 105, 101, 100, 108, 98, 45,
105, 102, 105, 101, 100, 45, 115, 105, 110, 99, 101, 108, 97, 115, 116, 99, 111, 115, 116, 45, 98, 105, 110, 108, 105, 110, 107, 108, 111, 99,
45, 109, 111, 100, 105, 102, 105, 101, 100, 108, 98, 45, 99, 111, 115, 97, 116, 105, 111, 110, 109, 97, 120, 45, 102, 111, 114, 119, 97, 114,
116, 45, 98, 105, 110, 108, 105, 110, 107, 108, 111, 99, 97, 116, 105, 100, 115, 112, 114, 111, 120, 121, 45, 97, 117, 116, 104, 101, 110, 116,
111, 110, 109, 97, 120, 45, 102, 111, 114, 119, 97, 114, 100, 115, 112, 105, 99, 97, 116, 101, 112, 114, 111, 120, 121, 45, 97, 117, 116, 104,
114, 111, 120, 121, 45, 97, 117, 116, 104, 101, 110, 116, 105, 99, 97, 111, 114, 105, 122, 97, 116, 105, 111, 110, 114, 97, 110, 103, 101, 114,
116, 101, 112, 114, 111, 120, 121, 45, 97, 117, 116, 104, 111, 114, 105, 101, 102, 101, 114, 101, 114, 114, 101, 102, 114, 101, 115, 104, 114, 101,
122, 97, 116, 105, 111, 110, 114, 97, 110, 103, 101, 114, 101, 102, 101, 116, 114, 121, 45, 97, 102, 116, 101, 114, 115, 101, 114, 118, 101, 114,
114, 101, 114, 114, 101, 102, 114, 101, 115, 104, 114, 101, 116, 114, 121, 115, 101, 116, 45, 99, 111, 111, 107, 105, 101, 115, 116, 114, 105, 99,
45, 97, 102, 116, 101, 114, 115, 101, 114, 118, 101, 114, 115, 101, 116, 116, 45, 116, 114, 97, 110, 115, 112, 111, 114, 116, 45, 115, 101, 99,
45, 99, 111, 111, 107, 105, 101, 115, 116, 114, 105, 99, 116, 45, 116, 117, 114, 105, 116, 121, 116, 114, 97, 110, 115, 102, 101, 114, 45, 101,
114, 97, 110, 115, 112, 111, 114, 116, 45, 115, 101, 99, 117, 114, 105, 110, 99, 111, 100, 105, 110, 103, 118, 97, 114, 121, 118, 105, 97, 119,
116, 121, 116, 114, 97, 110, 115, 102, 101, 114, 45, 101, 110, 99, 111, 119, 119, 45, 97, 117, 116, 104, 101, 110, 116, 105, 99, 97, 116, 101,
100, 105, 110, 103, 118, 97, 114, 121, 118, 105, 97, 119, 119, 119, 45, 105, 100, 101, 110, 116, 105, 116, 121, 44, 100, 101, 102, 108, 97, 116,
97, 117, 116, 104, 101, 110, 116, 105, 99, 97, 116, 101, 105, 100, 101, 101, 105, 100, 101, 110, 116, 105, 116, 121, 44, 103, 122, 105, 112, 100,
110, 116, 105, 116, 121, 44, 100, 101, 102, 108, 97, 116, 101, 105, 100, 101, 102, 108, 97, 116, 101, 44, 103, 122, 105, 112, 105, 100, 101, 110,
101, 110, 116, 105, 116, 121, 44, 103, 122, 105, 112, 100, 101, 102, 108, 116, 105, 116, 121, 44, 100, 101, 102, 108, 97, 116, 101, 44, 103, 122,
97, 116, 101, 44, 103, 122, 105, 112, 105, 100, 101, 110, 116, 105, 116, 105, 112};
121, 44, 100, 101, 102, 108, 97, 116, 101, 44, 103, 122, 105, 112};
static void static_ref(void* unused) {} static void static_ref(void* unused) {}
static void static_unref(void* unused) {} static void static_unref(void* unused) {}
@ -216,8 +215,6 @@ grpc_slice_refcount grpc_static_metadata_refcounts[GRPC_STATIC_MDSTR_COUNT] = {
{&grpc_static_metadata_vtable, &static_sub_refcnt}, {&grpc_static_metadata_vtable, &static_sub_refcnt},
{&grpc_static_metadata_vtable, &static_sub_refcnt}, {&grpc_static_metadata_vtable, &static_sub_refcnt},
{&grpc_static_metadata_vtable, &static_sub_refcnt}, {&grpc_static_metadata_vtable, &static_sub_refcnt},
{&grpc_static_metadata_vtable, &static_sub_refcnt},
{&grpc_static_metadata_vtable, &static_sub_refcnt},
}; };
const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT] = { const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT] = {
@ -250,80 +247,78 @@ const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT] = {
{&grpc_static_metadata_refcounts[26], {{g_bytes + 333, 30}}}, {&grpc_static_metadata_refcounts[26], {{g_bytes + 333, 30}}},
{&grpc_static_metadata_refcounts[27], {{g_bytes + 363, 31}}}, {&grpc_static_metadata_refcounts[27], {{g_bytes + 363, 31}}},
{&grpc_static_metadata_refcounts[28], {{g_bytes + 394, 36}}}, {&grpc_static_metadata_refcounts[28], {{g_bytes + 394, 36}}},
{&grpc_static_metadata_refcounts[29], {{g_bytes + 430, 15}}}, {&grpc_static_metadata_refcounts[29], {{g_bytes + 430, 7}}},
{&grpc_static_metadata_refcounts[30], {{g_bytes + 445, 12}}}, {&grpc_static_metadata_refcounts[30], {{g_bytes + 437, 4}}},
{&grpc_static_metadata_refcounts[31], {{g_bytes + 457, 11}}}, {&grpc_static_metadata_refcounts[31], {{g_bytes + 441, 11}}},
{&grpc_static_metadata_refcounts[32], {{g_bytes + 468, 1}}}, {&grpc_static_metadata_refcounts[32], {{g_bytes + 452, 1}}},
{&grpc_static_metadata_refcounts[33], {{g_bytes + 469, 1}}}, {&grpc_static_metadata_refcounts[33], {{g_bytes + 453, 1}}},
{&grpc_static_metadata_refcounts[34], {{g_bytes + 470, 1}}}, {&grpc_static_metadata_refcounts[34], {{g_bytes + 454, 1}}},
{&grpc_static_metadata_refcounts[35], {{g_bytes + 471, 8}}}, {&grpc_static_metadata_refcounts[35], {{g_bytes + 455, 8}}},
{&grpc_static_metadata_refcounts[36], {{g_bytes + 479, 4}}}, {&grpc_static_metadata_refcounts[36], {{g_bytes + 463, 8}}},
{&grpc_static_metadata_refcounts[37], {{g_bytes + 483, 7}}}, {&grpc_static_metadata_refcounts[37], {{g_bytes + 471, 16}}},
{&grpc_static_metadata_refcounts[38], {{g_bytes + 490, 8}}}, {&grpc_static_metadata_refcounts[38], {{g_bytes + 487, 4}}},
{&grpc_static_metadata_refcounts[39], {{g_bytes + 498, 16}}}, {&grpc_static_metadata_refcounts[39], {{g_bytes + 491, 3}}},
{&grpc_static_metadata_refcounts[40], {{g_bytes + 514, 4}}}, {&grpc_static_metadata_refcounts[40], {{g_bytes + 494, 3}}},
{&grpc_static_metadata_refcounts[41], {{g_bytes + 518, 3}}}, {&grpc_static_metadata_refcounts[41], {{g_bytes + 497, 4}}},
{&grpc_static_metadata_refcounts[42], {{g_bytes + 521, 3}}}, {&grpc_static_metadata_refcounts[42], {{g_bytes + 501, 5}}},
{&grpc_static_metadata_refcounts[43], {{g_bytes + 524, 4}}}, {&grpc_static_metadata_refcounts[43], {{g_bytes + 506, 4}}},
{&grpc_static_metadata_refcounts[44], {{g_bytes + 528, 5}}}, {&grpc_static_metadata_refcounts[44], {{g_bytes + 510, 3}}},
{&grpc_static_metadata_refcounts[45], {{g_bytes + 533, 4}}}, {&grpc_static_metadata_refcounts[45], {{g_bytes + 513, 3}}},
{&grpc_static_metadata_refcounts[46], {{g_bytes + 537, 3}}}, {&grpc_static_metadata_refcounts[46], {{g_bytes + 516, 1}}},
{&grpc_static_metadata_refcounts[47], {{g_bytes + 540, 3}}}, {&grpc_static_metadata_refcounts[47], {{g_bytes + 517, 11}}},
{&grpc_static_metadata_refcounts[48], {{g_bytes + 543, 1}}}, {&grpc_static_metadata_refcounts[48], {{g_bytes + 528, 3}}},
{&grpc_static_metadata_refcounts[49], {{g_bytes + 544, 11}}}, {&grpc_static_metadata_refcounts[49], {{g_bytes + 531, 3}}},
{&grpc_static_metadata_refcounts[50], {{g_bytes + 555, 3}}}, {&grpc_static_metadata_refcounts[50], {{g_bytes + 534, 3}}},
{&grpc_static_metadata_refcounts[51], {{g_bytes + 558, 3}}}, {&grpc_static_metadata_refcounts[51], {{g_bytes + 537, 3}}},
{&grpc_static_metadata_refcounts[52], {{g_bytes + 561, 3}}}, {&grpc_static_metadata_refcounts[52], {{g_bytes + 540, 3}}},
{&grpc_static_metadata_refcounts[53], {{g_bytes + 564, 3}}}, {&grpc_static_metadata_refcounts[53], {{g_bytes + 543, 14}}},
{&grpc_static_metadata_refcounts[54], {{g_bytes + 567, 3}}}, {&grpc_static_metadata_refcounts[54], {{g_bytes + 557, 13}}},
{&grpc_static_metadata_refcounts[55], {{g_bytes + 570, 14}}}, {&grpc_static_metadata_refcounts[55], {{g_bytes + 570, 15}}},
{&grpc_static_metadata_refcounts[56], {{g_bytes + 584, 13}}}, {&grpc_static_metadata_refcounts[56], {{g_bytes + 585, 13}}},
{&grpc_static_metadata_refcounts[57], {{g_bytes + 597, 15}}}, {&grpc_static_metadata_refcounts[57], {{g_bytes + 598, 6}}},
{&grpc_static_metadata_refcounts[58], {{g_bytes + 612, 13}}}, {&grpc_static_metadata_refcounts[58], {{g_bytes + 604, 27}}},
{&grpc_static_metadata_refcounts[59], {{g_bytes + 625, 6}}}, {&grpc_static_metadata_refcounts[59], {{g_bytes + 631, 3}}},
{&grpc_static_metadata_refcounts[60], {{g_bytes + 631, 27}}}, {&grpc_static_metadata_refcounts[60], {{g_bytes + 634, 5}}},
{&grpc_static_metadata_refcounts[61], {{g_bytes + 658, 3}}}, {&grpc_static_metadata_refcounts[61], {{g_bytes + 639, 13}}},
{&grpc_static_metadata_refcounts[62], {{g_bytes + 661, 5}}}, {&grpc_static_metadata_refcounts[62], {{g_bytes + 652, 13}}},
{&grpc_static_metadata_refcounts[63], {{g_bytes + 666, 13}}}, {&grpc_static_metadata_refcounts[63], {{g_bytes + 665, 19}}},
{&grpc_static_metadata_refcounts[64], {{g_bytes + 679, 13}}}, {&grpc_static_metadata_refcounts[64], {{g_bytes + 684, 16}}},
{&grpc_static_metadata_refcounts[65], {{g_bytes + 692, 19}}}, {&grpc_static_metadata_refcounts[65], {{g_bytes + 700, 14}}},
{&grpc_static_metadata_refcounts[66], {{g_bytes + 711, 16}}}, {&grpc_static_metadata_refcounts[66], {{g_bytes + 714, 16}}},
{&grpc_static_metadata_refcounts[67], {{g_bytes + 727, 14}}}, {&grpc_static_metadata_refcounts[67], {{g_bytes + 730, 13}}},
{&grpc_static_metadata_refcounts[68], {{g_bytes + 741, 16}}}, {&grpc_static_metadata_refcounts[68], {{g_bytes + 743, 6}}},
{&grpc_static_metadata_refcounts[69], {{g_bytes + 757, 13}}}, {&grpc_static_metadata_refcounts[69], {{g_bytes + 749, 4}}},
{&grpc_static_metadata_refcounts[70], {{g_bytes + 770, 6}}}, {&grpc_static_metadata_refcounts[70], {{g_bytes + 753, 4}}},
{&grpc_static_metadata_refcounts[71], {{g_bytes + 776, 4}}}, {&grpc_static_metadata_refcounts[71], {{g_bytes + 757, 6}}},
{&grpc_static_metadata_refcounts[72], {{g_bytes + 780, 4}}}, {&grpc_static_metadata_refcounts[72], {{g_bytes + 763, 7}}},
{&grpc_static_metadata_refcounts[73], {{g_bytes + 784, 6}}}, {&grpc_static_metadata_refcounts[73], {{g_bytes + 770, 4}}},
{&grpc_static_metadata_refcounts[74], {{g_bytes + 790, 7}}}, {&grpc_static_metadata_refcounts[74], {{g_bytes + 774, 8}}},
{&grpc_static_metadata_refcounts[75], {{g_bytes + 797, 4}}}, {&grpc_static_metadata_refcounts[75], {{g_bytes + 782, 17}}},
{&grpc_static_metadata_refcounts[76], {{g_bytes + 801, 8}}}, {&grpc_static_metadata_refcounts[76], {{g_bytes + 799, 13}}},
{&grpc_static_metadata_refcounts[77], {{g_bytes + 809, 17}}}, {&grpc_static_metadata_refcounts[77], {{g_bytes + 812, 8}}},
{&grpc_static_metadata_refcounts[78], {{g_bytes + 826, 13}}}, {&grpc_static_metadata_refcounts[78], {{g_bytes + 820, 19}}},
{&grpc_static_metadata_refcounts[79], {{g_bytes + 839, 8}}}, {&grpc_static_metadata_refcounts[79], {{g_bytes + 839, 13}}},
{&grpc_static_metadata_refcounts[80], {{g_bytes + 847, 19}}}, {&grpc_static_metadata_refcounts[80], {{g_bytes + 852, 11}}},
{&grpc_static_metadata_refcounts[81], {{g_bytes + 866, 13}}}, {&grpc_static_metadata_refcounts[81], {{g_bytes + 863, 4}}},
{&grpc_static_metadata_refcounts[82], {{g_bytes + 879, 11}}}, {&grpc_static_metadata_refcounts[82], {{g_bytes + 867, 8}}},
{&grpc_static_metadata_refcounts[83], {{g_bytes + 890, 4}}}, {&grpc_static_metadata_refcounts[83], {{g_bytes + 875, 12}}},
{&grpc_static_metadata_refcounts[84], {{g_bytes + 894, 8}}}, {&grpc_static_metadata_refcounts[84], {{g_bytes + 887, 18}}},
{&grpc_static_metadata_refcounts[85], {{g_bytes + 902, 12}}}, {&grpc_static_metadata_refcounts[85], {{g_bytes + 905, 19}}},
{&grpc_static_metadata_refcounts[86], {{g_bytes + 914, 18}}}, {&grpc_static_metadata_refcounts[86], {{g_bytes + 924, 5}}},
{&grpc_static_metadata_refcounts[87], {{g_bytes + 932, 19}}}, {&grpc_static_metadata_refcounts[87], {{g_bytes + 929, 7}}},
{&grpc_static_metadata_refcounts[88], {{g_bytes + 951, 5}}}, {&grpc_static_metadata_refcounts[88], {{g_bytes + 936, 7}}},
{&grpc_static_metadata_refcounts[89], {{g_bytes + 956, 7}}}, {&grpc_static_metadata_refcounts[89], {{g_bytes + 943, 11}}},
{&grpc_static_metadata_refcounts[90], {{g_bytes + 963, 7}}}, {&grpc_static_metadata_refcounts[90], {{g_bytes + 954, 6}}},
{&grpc_static_metadata_refcounts[91], {{g_bytes + 970, 11}}}, {&grpc_static_metadata_refcounts[91], {{g_bytes + 960, 10}}},
{&grpc_static_metadata_refcounts[92], {{g_bytes + 981, 6}}}, {&grpc_static_metadata_refcounts[92], {{g_bytes + 970, 25}}},
{&grpc_static_metadata_refcounts[93], {{g_bytes + 987, 10}}}, {&grpc_static_metadata_refcounts[93], {{g_bytes + 995, 17}}},
{&grpc_static_metadata_refcounts[94], {{g_bytes + 997, 25}}}, {&grpc_static_metadata_refcounts[94], {{g_bytes + 1012, 4}}},
{&grpc_static_metadata_refcounts[95], {{g_bytes + 1022, 17}}}, {&grpc_static_metadata_refcounts[95], {{g_bytes + 1016, 3}}},
{&grpc_static_metadata_refcounts[96], {{g_bytes + 1039, 4}}}, {&grpc_static_metadata_refcounts[96], {{g_bytes + 1019, 16}}},
{&grpc_static_metadata_refcounts[97], {{g_bytes + 1043, 3}}}, {&grpc_static_metadata_refcounts[97], {{g_bytes + 1035, 16}}},
{&grpc_static_metadata_refcounts[98], {{g_bytes + 1046, 16}}}, {&grpc_static_metadata_refcounts[98], {{g_bytes + 1051, 13}}},
{&grpc_static_metadata_refcounts[99], {{g_bytes + 1062, 16}}}, {&grpc_static_metadata_refcounts[99], {{g_bytes + 1064, 12}}},
{&grpc_static_metadata_refcounts[100], {{g_bytes + 1078, 13}}}, {&grpc_static_metadata_refcounts[100], {{g_bytes + 1076, 21}}},
{&grpc_static_metadata_refcounts[101], {{g_bytes + 1091, 12}}},
{&grpc_static_metadata_refcounts[102], {{g_bytes + 1103, 21}}},
}; };
uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT] = { uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT] = {
@ -333,16 +328,16 @@ uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 6, 6, 8, 8, 2, 4, 4}; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 6, 6, 8, 8, 2, 4, 4};
static const int8_t elems_r[] = { static const int8_t elems_r[] = {
11, 9, -3, 0, 10, 25, -77, 26, 0, 11, -7, 0, 0, 0, 21, 14, 1, 13, 2, 1, 0, 15, 4, 0, 21, 0, 23, -3, 0, 0, 0, 10, 19, -4,
0, 0, 33, 12, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -56, 0, -36, -61, -60, -39, -63, -64, 0, 36, 35, 34, 33, 0, 0, -52, 0, -55, -36, -57, -58, -58, -58, 0, 40, 39, 38, 37, 36, 35,
34, 33, 32, 31, 31, 30, 29, 28, 27, 26, 26, 25, 25, 24, 23, 22, 21, 34, 33, 32, 31, 30, 29, 28, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19,
20, 19, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 12, 11, 0}; 18, 17, 16, 15, 18, 17, 16, 15, 14, 13, 12, 11, 11, 0};
static uint32_t elems_phash(uint32_t i) { static uint32_t elems_phash(uint32_t i) {
i -= 48; i -= 46;
uint32_t x = i % 101; uint32_t x = i % 99;
uint32_t y = i / 101; uint32_t y = i / 99;
uint32_t h = x; uint32_t h = x;
if (y < GPR_ARRAY_SIZE(elems_r)) { if (y < GPR_ARRAY_SIZE(elems_r)) {
uint32_t delta = (uint32_t)elems_r[y]; uint32_t delta = (uint32_t)elems_r[y];
@ -352,31 +347,31 @@ static uint32_t elems_phash(uint32_t i) {
} }
static const uint16_t elem_keys[] = { static const uint16_t elem_keys[] = {
1065, 1066, 1067, 256, 257, 258, 259, 260, 1671, 149, 150, 48, 1039, 1040, 145, 146, 541, 1639, 1045, 250, 251, 252, 253, 254,
49, 455, 456, 457, 962, 963, 964, 1568, 1683, 1684, 753, 754, 1646, 46, 47, 1437, 1942, 1651, 445, 446, 447, 739, 740, 741,
1465, 553, 755, 2083, 2186, 5688, 5997, 1580, 1581, 6100, 6306, 6409, 938, 939, 1538, 2043, 2144, 1451, 944, 5376, 5578, 1545, 5780, 5881,
6512, 6615, 6718, 6821, 1481, 1704, 6924, 7027, 7130, 7233, 1980, 7336, 1670, 5982, 1550, 6083, 6184, 6285, 6386, 6487, 6588, 6689, 6790, 6891,
7439, 7542, 7645, 7748, 7851, 5894, 7954, 8057, 6203, 8160, 8263, 8366, 6992, 7093, 7194, 7295, 7396, 5679, 7497, 7598, 7699, 7800, 7901, 8002,
8469, 8572, 8675, 8778, 1129, 1130, 1131, 1132, 8881, 8984, 9087, 9190, 8103, 8204, 8305, 8406, 8507, 8608, 8709, 8810, 1107, 1108, 1109, 1110,
9293, 9396, 9499, 9602, 9705, 9808, 9911, 332, 10014, 10117, 0, 0, 8911, 9012, 9113, 9214, 9315, 9416, 9517, 9618, 1714, 9719, 0, 326,
0, 1748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 247, 0, 0, 241, 242, 0, 0, 0, 0, 0, 0, 139, 0,
248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0}; 0, 0, 0, 0, 0, 0};
static const uint8_t elem_idxs[] = { static const uint8_t elem_idxs[] = {
76, 79, 77, 19, 20, 21, 22, 23, 25, 15, 16, 17, 18, 11, 77, 79, 15, 16, 6, 25, 76, 19, 20, 21, 22, 23, 84, 17,
12, 13, 3, 4, 5, 38, 83, 84, 0, 1, 43, 6, 2, 50, 18, 43, 72, 83, 11, 12, 13, 0, 1, 2, 5, 4, 38, 50,
57, 24, 28, 36, 37, 29, 31, 32, 33, 34, 35, 39, 7, 26, 57, 7, 3, 24, 27, 37, 29, 30, 26, 31, 36, 32, 33, 34,
40, 41, 42, 44, 72, 45, 46, 47, 48, 49, 51, 27, 52, 53, 35, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 28, 51, 52,
30, 54, 55, 56, 58, 59, 60, 61, 78, 80, 81, 82, 62, 63, 53, 54, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, 78, 80,
64, 65, 66, 67, 68, 69, 70, 71, 73, 14, 74, 75, 255, 255, 81, 82, 66, 67, 68, 69, 70, 71, 73, 74, 85, 75, 255, 14,
255, 85, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 8, 9, 10}; 9, 10, 255, 255, 255, 255, 255, 255, 8};
grpc_mdelem grpc_static_mdelem_for_static_strings(int a, int b) { grpc_mdelem grpc_static_mdelem_for_static_strings(int a, int b) {
if (a == -1 || b == -1) return GRPC_MDNULL; if (a == -1 || b == -1) return GRPC_MDNULL;
uint32_t k = (uint32_t)(a * 103 + b); uint32_t k = (uint32_t)(a * 101 + b);
uint32_t h = elems_phash(k); uint32_t h = elems_phash(k);
return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k && return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k &&
elem_idxs[h] != 255 elem_idxs[h] != 255
@ -387,177 +382,177 @@ grpc_mdelem grpc_static_mdelem_for_static_strings(int a, int b) {
grpc_mdelem_data grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT] = { grpc_mdelem_data grpc_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT] = {
{{&grpc_static_metadata_refcounts[7], {{g_bytes + 50, 11}}}, {{&grpc_static_metadata_refcounts[7], {{g_bytes + 50, 11}}},
{&grpc_static_metadata_refcounts[32], {{g_bytes + 468, 1}}}}, {&grpc_static_metadata_refcounts[32], {{g_bytes + 452, 1}}}},
{{&grpc_static_metadata_refcounts[7], {{g_bytes + 50, 11}}}, {{&grpc_static_metadata_refcounts[7], {{g_bytes + 50, 11}}},
{&grpc_static_metadata_refcounts[33], {{g_bytes + 469, 1}}}}, {&grpc_static_metadata_refcounts[33], {{g_bytes + 453, 1}}}},
{{&grpc_static_metadata_refcounts[7], {{g_bytes + 50, 11}}}, {{&grpc_static_metadata_refcounts[7], {{g_bytes + 50, 11}}},
{&grpc_static_metadata_refcounts[34], {{g_bytes + 470, 1}}}}, {&grpc_static_metadata_refcounts[34], {{g_bytes + 454, 1}}}},
{{&grpc_static_metadata_refcounts[9], {{g_bytes + 77, 13}}}, {{&grpc_static_metadata_refcounts[9], {{g_bytes + 77, 13}}},
{&grpc_static_metadata_refcounts[35], {{g_bytes + 471, 8}}}}, {&grpc_static_metadata_refcounts[35], {{g_bytes + 455, 8}}}},
{{&grpc_static_metadata_refcounts[9], {{g_bytes + 77, 13}}}, {{&grpc_static_metadata_refcounts[9], {{g_bytes + 77, 13}}},
{&grpc_static_metadata_refcounts[36], {{g_bytes + 479, 4}}}}, {&grpc_static_metadata_refcounts[30], {{g_bytes + 437, 4}}}},
{{&grpc_static_metadata_refcounts[9], {{g_bytes + 77, 13}}}, {{&grpc_static_metadata_refcounts[9], {{g_bytes + 77, 13}}},
{&grpc_static_metadata_refcounts[37], {{g_bytes + 483, 7}}}}, {&grpc_static_metadata_refcounts[29], {{g_bytes + 430, 7}}}},
{{&grpc_static_metadata_refcounts[5], {{g_bytes + 36, 2}}}, {{&grpc_static_metadata_refcounts[5], {{g_bytes + 36, 2}}},
{&grpc_static_metadata_refcounts[38], {{g_bytes + 490, 8}}}}, {&grpc_static_metadata_refcounts[36], {{g_bytes + 463, 8}}}},
{{&grpc_static_metadata_refcounts[14], {{g_bytes + 158, 12}}}, {{&grpc_static_metadata_refcounts[14], {{g_bytes + 158, 12}}},
{&grpc_static_metadata_refcounts[39], {{g_bytes + 498, 16}}}}, {&grpc_static_metadata_refcounts[37], {{g_bytes + 471, 16}}}},
{{&grpc_static_metadata_refcounts[1], {{g_bytes + 5, 7}}}, {{&grpc_static_metadata_refcounts[1], {{g_bytes + 5, 7}}},
{&grpc_static_metadata_refcounts[40], {{g_bytes + 514, 4}}}}, {&grpc_static_metadata_refcounts[38], {{g_bytes + 487, 4}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[41], {{g_bytes + 518, 3}}}}, {&grpc_static_metadata_refcounts[39], {{g_bytes + 491, 3}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[42], {{g_bytes + 521, 3}}}}, {&grpc_static_metadata_refcounts[40], {{g_bytes + 494, 3}}}},
{{&grpc_static_metadata_refcounts[4], {{g_bytes + 29, 7}}}, {{&grpc_static_metadata_refcounts[4], {{g_bytes + 29, 7}}},
{&grpc_static_metadata_refcounts[43], {{g_bytes + 524, 4}}}}, {&grpc_static_metadata_refcounts[41], {{g_bytes + 497, 4}}}},
{{&grpc_static_metadata_refcounts[4], {{g_bytes + 29, 7}}}, {{&grpc_static_metadata_refcounts[4], {{g_bytes + 29, 7}}},
{&grpc_static_metadata_refcounts[44], {{g_bytes + 528, 5}}}}, {&grpc_static_metadata_refcounts[42], {{g_bytes + 501, 5}}}},
{{&grpc_static_metadata_refcounts[4], {{g_bytes + 29, 7}}}, {{&grpc_static_metadata_refcounts[4], {{g_bytes + 29, 7}}},
{&grpc_static_metadata_refcounts[45], {{g_bytes + 533, 4}}}}, {&grpc_static_metadata_refcounts[43], {{g_bytes + 506, 4}}}},
{{&grpc_static_metadata_refcounts[3], {{g_bytes + 19, 10}}}, {{&grpc_static_metadata_refcounts[3], {{g_bytes + 19, 10}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[1], {{g_bytes + 5, 7}}}, {{&grpc_static_metadata_refcounts[1], {{g_bytes + 5, 7}}},
{&grpc_static_metadata_refcounts[46], {{g_bytes + 537, 3}}}}, {&grpc_static_metadata_refcounts[44], {{g_bytes + 510, 3}}}},
{{&grpc_static_metadata_refcounts[1], {{g_bytes + 5, 7}}}, {{&grpc_static_metadata_refcounts[1], {{g_bytes + 5, 7}}},
{&grpc_static_metadata_refcounts[47], {{g_bytes + 540, 3}}}}, {&grpc_static_metadata_refcounts[45], {{g_bytes + 513, 3}}}},
{{&grpc_static_metadata_refcounts[0], {{g_bytes + 0, 5}}}, {{&grpc_static_metadata_refcounts[0], {{g_bytes + 0, 5}}},
{&grpc_static_metadata_refcounts[48], {{g_bytes + 543, 1}}}}, {&grpc_static_metadata_refcounts[46], {{g_bytes + 516, 1}}}},
{{&grpc_static_metadata_refcounts[0], {{g_bytes + 0, 5}}}, {{&grpc_static_metadata_refcounts[0], {{g_bytes + 0, 5}}},
{&grpc_static_metadata_refcounts[49], {{g_bytes + 544, 11}}}}, {&grpc_static_metadata_refcounts[47], {{g_bytes + 517, 11}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[50], {{g_bytes + 555, 3}}}}, {&grpc_static_metadata_refcounts[48], {{g_bytes + 528, 3}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[51], {{g_bytes + 558, 3}}}}, {&grpc_static_metadata_refcounts[49], {{g_bytes + 531, 3}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[52], {{g_bytes + 561, 3}}}}, {&grpc_static_metadata_refcounts[50], {{g_bytes + 534, 3}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[53], {{g_bytes + 564, 3}}}}, {&grpc_static_metadata_refcounts[51], {{g_bytes + 537, 3}}}},
{{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}}, {{&grpc_static_metadata_refcounts[2], {{g_bytes + 12, 7}}},
{&grpc_static_metadata_refcounts[54], {{g_bytes + 567, 3}}}}, {&grpc_static_metadata_refcounts[52], {{g_bytes + 540, 3}}}},
{{&grpc_static_metadata_refcounts[55], {{g_bytes + 570, 14}}}, {{&grpc_static_metadata_refcounts[53], {{g_bytes + 543, 14}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}}, {{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}}, {{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}},
{&grpc_static_metadata_refcounts[56], {{g_bytes + 584, 13}}}}, {&grpc_static_metadata_refcounts[54], {{g_bytes + 557, 13}}}},
{{&grpc_static_metadata_refcounts[57], {{g_bytes + 597, 15}}}, {{&grpc_static_metadata_refcounts[55], {{g_bytes + 570, 15}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[58], {{g_bytes + 612, 13}}}, {{&grpc_static_metadata_refcounts[56], {{g_bytes + 585, 13}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[59], {{g_bytes + 625, 6}}}, {{&grpc_static_metadata_refcounts[57], {{g_bytes + 598, 6}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[60], {{g_bytes + 631, 27}}}, {{&grpc_static_metadata_refcounts[58], {{g_bytes + 604, 27}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[61], {{g_bytes + 658, 3}}}, {{&grpc_static_metadata_refcounts[59], {{g_bytes + 631, 3}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[62], {{g_bytes + 661, 5}}}, {{&grpc_static_metadata_refcounts[60], {{g_bytes + 634, 5}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[63], {{g_bytes + 666, 13}}}, {{&grpc_static_metadata_refcounts[61], {{g_bytes + 639, 13}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[64], {{g_bytes + 679, 13}}}, {{&grpc_static_metadata_refcounts[62], {{g_bytes + 652, 13}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[65], {{g_bytes + 692, 19}}}, {{&grpc_static_metadata_refcounts[63], {{g_bytes + 665, 19}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[15], {{g_bytes + 170, 16}}}, {{&grpc_static_metadata_refcounts[15], {{g_bytes + 170, 16}}},
{&grpc_static_metadata_refcounts[35], {{g_bytes + 471, 8}}}}, {&grpc_static_metadata_refcounts[35], {{g_bytes + 455, 8}}}},
{{&grpc_static_metadata_refcounts[15], {{g_bytes + 170, 16}}}, {{&grpc_static_metadata_refcounts[15], {{g_bytes + 170, 16}}},
{&grpc_static_metadata_refcounts[36], {{g_bytes + 479, 4}}}}, {&grpc_static_metadata_refcounts[30], {{g_bytes + 437, 4}}}},
{{&grpc_static_metadata_refcounts[15], {{g_bytes + 170, 16}}}, {{&grpc_static_metadata_refcounts[15], {{g_bytes + 170, 16}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[66], {{g_bytes + 711, 16}}}, {{&grpc_static_metadata_refcounts[64], {{g_bytes + 684, 16}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[67], {{g_bytes + 727, 14}}}, {{&grpc_static_metadata_refcounts[65], {{g_bytes + 700, 14}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[68], {{g_bytes + 741, 16}}}, {{&grpc_static_metadata_refcounts[66], {{g_bytes + 714, 16}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[69], {{g_bytes + 757, 13}}}, {{&grpc_static_metadata_refcounts[67], {{g_bytes + 730, 13}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[14], {{g_bytes + 158, 12}}}, {{&grpc_static_metadata_refcounts[14], {{g_bytes + 158, 12}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[70], {{g_bytes + 770, 6}}}, {{&grpc_static_metadata_refcounts[68], {{g_bytes + 743, 6}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[71], {{g_bytes + 776, 4}}}, {{&grpc_static_metadata_refcounts[69], {{g_bytes + 749, 4}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[72], {{g_bytes + 780, 4}}}, {{&grpc_static_metadata_refcounts[70], {{g_bytes + 753, 4}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[73], {{g_bytes + 784, 6}}}, {{&grpc_static_metadata_refcounts[71], {{g_bytes + 757, 6}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[74], {{g_bytes + 790, 7}}}, {{&grpc_static_metadata_refcounts[72], {{g_bytes + 763, 7}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[75], {{g_bytes + 797, 4}}}, {{&grpc_static_metadata_refcounts[73], {{g_bytes + 770, 4}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[20], {{g_bytes + 278, 4}}}, {{&grpc_static_metadata_refcounts[20], {{g_bytes + 278, 4}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[76], {{g_bytes + 801, 8}}}, {{&grpc_static_metadata_refcounts[74], {{g_bytes + 774, 8}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[77], {{g_bytes + 809, 17}}}, {{&grpc_static_metadata_refcounts[75], {{g_bytes + 782, 17}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[78], {{g_bytes + 826, 13}}}, {{&grpc_static_metadata_refcounts[76], {{g_bytes + 799, 13}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[79], {{g_bytes + 839, 8}}}, {{&grpc_static_metadata_refcounts[77], {{g_bytes + 812, 8}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[80], {{g_bytes + 847, 19}}}, {{&grpc_static_metadata_refcounts[78], {{g_bytes + 820, 19}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[81], {{g_bytes + 866, 13}}}, {{&grpc_static_metadata_refcounts[79], {{g_bytes + 839, 13}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[21], {{g_bytes + 282, 8}}}, {{&grpc_static_metadata_refcounts[21], {{g_bytes + 282, 8}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[82], {{g_bytes + 879, 11}}}, {{&grpc_static_metadata_refcounts[80], {{g_bytes + 852, 11}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[83], {{g_bytes + 890, 4}}}, {{&grpc_static_metadata_refcounts[81], {{g_bytes + 863, 4}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[84], {{g_bytes + 894, 8}}}, {{&grpc_static_metadata_refcounts[82], {{g_bytes + 867, 8}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[85], {{g_bytes + 902, 12}}}, {{&grpc_static_metadata_refcounts[83], {{g_bytes + 875, 12}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[86], {{g_bytes + 914, 18}}}, {{&grpc_static_metadata_refcounts[84], {{g_bytes + 887, 18}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[87], {{g_bytes + 932, 19}}}, {{&grpc_static_metadata_refcounts[85], {{g_bytes + 905, 19}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[88], {{g_bytes + 951, 5}}}, {{&grpc_static_metadata_refcounts[86], {{g_bytes + 924, 5}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[89], {{g_bytes + 956, 7}}}, {{&grpc_static_metadata_refcounts[87], {{g_bytes + 929, 7}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[90], {{g_bytes + 963, 7}}}, {{&grpc_static_metadata_refcounts[88], {{g_bytes + 936, 7}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[91], {{g_bytes + 970, 11}}}, {{&grpc_static_metadata_refcounts[89], {{g_bytes + 943, 11}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[92], {{g_bytes + 981, 6}}}, {{&grpc_static_metadata_refcounts[90], {{g_bytes + 954, 6}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[93], {{g_bytes + 987, 10}}}, {{&grpc_static_metadata_refcounts[91], {{g_bytes + 960, 10}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[94], {{g_bytes + 997, 25}}}, {{&grpc_static_metadata_refcounts[92], {{g_bytes + 970, 25}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[95], {{g_bytes + 1022, 17}}}, {{&grpc_static_metadata_refcounts[93], {{g_bytes + 995, 17}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[19], {{g_bytes + 268, 10}}}, {{&grpc_static_metadata_refcounts[19], {{g_bytes + 268, 10}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[96], {{g_bytes + 1039, 4}}}, {{&grpc_static_metadata_refcounts[94], {{g_bytes + 1012, 4}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[97], {{g_bytes + 1043, 3}}}, {{&grpc_static_metadata_refcounts[95], {{g_bytes + 1016, 3}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[98], {{g_bytes + 1046, 16}}}, {{&grpc_static_metadata_refcounts[96], {{g_bytes + 1019, 16}}},
{&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}}, {&grpc_static_metadata_refcounts[23], {{g_bytes + 302, 0}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[35], {{g_bytes + 471, 8}}}}, {&grpc_static_metadata_refcounts[35], {{g_bytes + 455, 8}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[37], {{g_bytes + 483, 7}}}}, {&grpc_static_metadata_refcounts[29], {{g_bytes + 430, 7}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[99], {{g_bytes + 1062, 16}}}}, {&grpc_static_metadata_refcounts[97], {{g_bytes + 1035, 16}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[36], {{g_bytes + 479, 4}}}}, {&grpc_static_metadata_refcounts[30], {{g_bytes + 437, 4}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[100], {{g_bytes + 1078, 13}}}}, {&grpc_static_metadata_refcounts[98], {{g_bytes + 1051, 13}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[101], {{g_bytes + 1091, 12}}}}, {&grpc_static_metadata_refcounts[99], {{g_bytes + 1064, 12}}}},
{{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}}, {{&grpc_static_metadata_refcounts[10], {{g_bytes + 90, 20}}},
{&grpc_static_metadata_refcounts[102], {{g_bytes + 1103, 21}}}}, {&grpc_static_metadata_refcounts[100], {{g_bytes + 1076, 21}}}},
{{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}}, {{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}},
{&grpc_static_metadata_refcounts[35], {{g_bytes + 471, 8}}}}, {&grpc_static_metadata_refcounts[35], {{g_bytes + 455, 8}}}},
{{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}}, {{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}},
{&grpc_static_metadata_refcounts[36], {{g_bytes + 479, 4}}}}, {&grpc_static_metadata_refcounts[30], {{g_bytes + 437, 4}}}},
{{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}}, {{&grpc_static_metadata_refcounts[16], {{g_bytes + 186, 15}}},
{&grpc_static_metadata_refcounts[100], {{g_bytes + 1078, 13}}}}, {&grpc_static_metadata_refcounts[98], {{g_bytes + 1051, 13}}}},
}; };
bool grpc_static_callout_is_default[GRPC_BATCH_CALLOUTS_COUNT] = { bool grpc_static_callout_is_default[GRPC_BATCH_CALLOUTS_COUNT] = {
true, // :path true, // :path

@ -20,7 +20,7 @@
* To make changes to this file, change * To make changes to this file, change
* tools/codegen/core/gen_static_metadata.py, and then re-run it. * tools/codegen/core/gen_static_metadata.py, and then re-run it.
* *
* See metadata.h for an explanation of the interface here, and metadata.c for * See metadata.h for an explanation of the interface here, and metadata.cc for
* an explanation of what's going on. * an explanation of what's going on.
*/ */
@ -29,7 +29,7 @@
#include "src/core/lib/transport/metadata.h" #include "src/core/lib/transport/metadata.h"
#define GRPC_STATIC_MDSTR_COUNT 103 #define GRPC_STATIC_MDSTR_COUNT 101
extern const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT]; extern const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT];
/* ":path" */ /* ":path" */
#define GRPC_MDSTR_PATH (grpc_static_slice_table[0]) #define GRPC_MDSTR_PATH (grpc_static_slice_table[0])
@ -93,10 +93,10 @@ extern const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT];
/* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */ /* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */
#define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \ #define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \
(grpc_static_slice_table[28]) (grpc_static_slice_table[28])
/* "message/deflate" */ /* "deflate" */
#define GRPC_MDSTR_MESSAGE_SLASH_DEFLATE (grpc_static_slice_table[29]) #define GRPC_MDSTR_DEFLATE (grpc_static_slice_table[29])
/* "message/gzip" */ /* "gzip" */
#define GRPC_MDSTR_MESSAGE_SLASH_GZIP (grpc_static_slice_table[30]) #define GRPC_MDSTR_GZIP (grpc_static_slice_table[30])
/* "stream/gzip" */ /* "stream/gzip" */
#define GRPC_MDSTR_STREAM_SLASH_GZIP (grpc_static_slice_table[31]) #define GRPC_MDSTR_STREAM_SLASH_GZIP (grpc_static_slice_table[31])
/* "0" */ /* "0" */
@ -107,141 +107,137 @@ extern const grpc_slice grpc_static_slice_table[GRPC_STATIC_MDSTR_COUNT];
#define GRPC_MDSTR_2 (grpc_static_slice_table[34]) #define GRPC_MDSTR_2 (grpc_static_slice_table[34])
/* "identity" */ /* "identity" */
#define GRPC_MDSTR_IDENTITY (grpc_static_slice_table[35]) #define GRPC_MDSTR_IDENTITY (grpc_static_slice_table[35])
/* "gzip" */
#define GRPC_MDSTR_GZIP (grpc_static_slice_table[36])
/* "deflate" */
#define GRPC_MDSTR_DEFLATE (grpc_static_slice_table[37])
/* "trailers" */ /* "trailers" */
#define GRPC_MDSTR_TRAILERS (grpc_static_slice_table[38]) #define GRPC_MDSTR_TRAILERS (grpc_static_slice_table[36])
/* "application/grpc" */ /* "application/grpc" */
#define GRPC_MDSTR_APPLICATION_SLASH_GRPC (grpc_static_slice_table[39]) #define GRPC_MDSTR_APPLICATION_SLASH_GRPC (grpc_static_slice_table[37])
/* "POST" */ /* "POST" */
#define GRPC_MDSTR_POST (grpc_static_slice_table[40]) #define GRPC_MDSTR_POST (grpc_static_slice_table[38])
/* "200" */ /* "200" */
#define GRPC_MDSTR_200 (grpc_static_slice_table[41]) #define GRPC_MDSTR_200 (grpc_static_slice_table[39])
/* "404" */ /* "404" */
#define GRPC_MDSTR_404 (grpc_static_slice_table[42]) #define GRPC_MDSTR_404 (grpc_static_slice_table[40])
/* "http" */ /* "http" */
#define GRPC_MDSTR_HTTP (grpc_static_slice_table[43]) #define GRPC_MDSTR_HTTP (grpc_static_slice_table[41])
/* "https" */ /* "https" */
#define GRPC_MDSTR_HTTPS (grpc_static_slice_table[44]) #define GRPC_MDSTR_HTTPS (grpc_static_slice_table[42])
/* "grpc" */ /* "grpc" */
#define GRPC_MDSTR_GRPC (grpc_static_slice_table[45]) #define GRPC_MDSTR_GRPC (grpc_static_slice_table[43])
/* "GET" */ /* "GET" */
#define GRPC_MDSTR_GET (grpc_static_slice_table[46]) #define GRPC_MDSTR_GET (grpc_static_slice_table[44])
/* "PUT" */ /* "PUT" */
#define GRPC_MDSTR_PUT (grpc_static_slice_table[47]) #define GRPC_MDSTR_PUT (grpc_static_slice_table[45])
/* "/" */ /* "/" */
#define GRPC_MDSTR_SLASH (grpc_static_slice_table[48]) #define GRPC_MDSTR_SLASH (grpc_static_slice_table[46])
/* "/index.html" */ /* "/index.html" */
#define GRPC_MDSTR_SLASH_INDEX_DOT_HTML (grpc_static_slice_table[49]) #define GRPC_MDSTR_SLASH_INDEX_DOT_HTML (grpc_static_slice_table[47])
/* "204" */ /* "204" */
#define GRPC_MDSTR_204 (grpc_static_slice_table[50]) #define GRPC_MDSTR_204 (grpc_static_slice_table[48])
/* "206" */ /* "206" */
#define GRPC_MDSTR_206 (grpc_static_slice_table[51]) #define GRPC_MDSTR_206 (grpc_static_slice_table[49])
/* "304" */ /* "304" */
#define GRPC_MDSTR_304 (grpc_static_slice_table[52]) #define GRPC_MDSTR_304 (grpc_static_slice_table[50])
/* "400" */ /* "400" */
#define GRPC_MDSTR_400 (grpc_static_slice_table[53]) #define GRPC_MDSTR_400 (grpc_static_slice_table[51])
/* "500" */ /* "500" */
#define GRPC_MDSTR_500 (grpc_static_slice_table[54]) #define GRPC_MDSTR_500 (grpc_static_slice_table[52])
/* "accept-charset" */ /* "accept-charset" */
#define GRPC_MDSTR_ACCEPT_CHARSET (grpc_static_slice_table[55]) #define GRPC_MDSTR_ACCEPT_CHARSET (grpc_static_slice_table[53])
/* "gzip, deflate" */ /* "gzip, deflate" */
#define GRPC_MDSTR_GZIP_COMMA_DEFLATE (grpc_static_slice_table[56]) #define GRPC_MDSTR_GZIP_COMMA_DEFLATE (grpc_static_slice_table[54])
/* "accept-language" */ /* "accept-language" */
#define GRPC_MDSTR_ACCEPT_LANGUAGE (grpc_static_slice_table[57]) #define GRPC_MDSTR_ACCEPT_LANGUAGE (grpc_static_slice_table[55])
/* "accept-ranges" */ /* "accept-ranges" */
#define GRPC_MDSTR_ACCEPT_RANGES (grpc_static_slice_table[58]) #define GRPC_MDSTR_ACCEPT_RANGES (grpc_static_slice_table[56])
/* "accept" */ /* "accept" */
#define GRPC_MDSTR_ACCEPT (grpc_static_slice_table[59]) #define GRPC_MDSTR_ACCEPT (grpc_static_slice_table[57])
/* "access-control-allow-origin" */ /* "access-control-allow-origin" */
#define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN (grpc_static_slice_table[60]) #define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN (grpc_static_slice_table[58])
/* "age" */ /* "age" */
#define GRPC_MDSTR_AGE (grpc_static_slice_table[61]) #define GRPC_MDSTR_AGE (grpc_static_slice_table[59])
/* "allow" */ /* "allow" */
#define GRPC_MDSTR_ALLOW (grpc_static_slice_table[62]) #define GRPC_MDSTR_ALLOW (grpc_static_slice_table[60])
/* "authorization" */ /* "authorization" */
#define GRPC_MDSTR_AUTHORIZATION (grpc_static_slice_table[63]) #define GRPC_MDSTR_AUTHORIZATION (grpc_static_slice_table[61])
/* "cache-control" */ /* "cache-control" */
#define GRPC_MDSTR_CACHE_CONTROL (grpc_static_slice_table[64]) #define GRPC_MDSTR_CACHE_CONTROL (grpc_static_slice_table[62])
/* "content-disposition" */ /* "content-disposition" */
#define GRPC_MDSTR_CONTENT_DISPOSITION (grpc_static_slice_table[65]) #define GRPC_MDSTR_CONTENT_DISPOSITION (grpc_static_slice_table[63])
/* "content-language" */ /* "content-language" */
#define GRPC_MDSTR_CONTENT_LANGUAGE (grpc_static_slice_table[66]) #define GRPC_MDSTR_CONTENT_LANGUAGE (grpc_static_slice_table[64])
/* "content-length" */ /* "content-length" */
#define GRPC_MDSTR_CONTENT_LENGTH (grpc_static_slice_table[67]) #define GRPC_MDSTR_CONTENT_LENGTH (grpc_static_slice_table[65])
/* "content-location" */ /* "content-location" */
#define GRPC_MDSTR_CONTENT_LOCATION (grpc_static_slice_table[68]) #define GRPC_MDSTR_CONTENT_LOCATION (grpc_static_slice_table[66])
/* "content-range" */ /* "content-range" */
#define GRPC_MDSTR_CONTENT_RANGE (grpc_static_slice_table[69]) #define GRPC_MDSTR_CONTENT_RANGE (grpc_static_slice_table[67])
/* "cookie" */ /* "cookie" */
#define GRPC_MDSTR_COOKIE (grpc_static_slice_table[70]) #define GRPC_MDSTR_COOKIE (grpc_static_slice_table[68])
/* "date" */ /* "date" */
#define GRPC_MDSTR_DATE (grpc_static_slice_table[71]) #define GRPC_MDSTR_DATE (grpc_static_slice_table[69])
/* "etag" */ /* "etag" */
#define GRPC_MDSTR_ETAG (grpc_static_slice_table[72]) #define GRPC_MDSTR_ETAG (grpc_static_slice_table[70])
/* "expect" */ /* "expect" */
#define GRPC_MDSTR_EXPECT (grpc_static_slice_table[73]) #define GRPC_MDSTR_EXPECT (grpc_static_slice_table[71])
/* "expires" */ /* "expires" */
#define GRPC_MDSTR_EXPIRES (grpc_static_slice_table[74]) #define GRPC_MDSTR_EXPIRES (grpc_static_slice_table[72])
/* "from" */ /* "from" */
#define GRPC_MDSTR_FROM (grpc_static_slice_table[75]) #define GRPC_MDSTR_FROM (grpc_static_slice_table[73])
/* "if-match" */ /* "if-match" */
#define GRPC_MDSTR_IF_MATCH (grpc_static_slice_table[76]) #define GRPC_MDSTR_IF_MATCH (grpc_static_slice_table[74])
/* "if-modified-since" */ /* "if-modified-since" */
#define GRPC_MDSTR_IF_MODIFIED_SINCE (grpc_static_slice_table[77]) #define GRPC_MDSTR_IF_MODIFIED_SINCE (grpc_static_slice_table[75])
/* "if-none-match" */ /* "if-none-match" */
#define GRPC_MDSTR_IF_NONE_MATCH (grpc_static_slice_table[78]) #define GRPC_MDSTR_IF_NONE_MATCH (grpc_static_slice_table[76])
/* "if-range" */ /* "if-range" */
#define GRPC_MDSTR_IF_RANGE (grpc_static_slice_table[79]) #define GRPC_MDSTR_IF_RANGE (grpc_static_slice_table[77])
/* "if-unmodified-since" */ /* "if-unmodified-since" */
#define GRPC_MDSTR_IF_UNMODIFIED_SINCE (grpc_static_slice_table[80]) #define GRPC_MDSTR_IF_UNMODIFIED_SINCE (grpc_static_slice_table[78])
/* "last-modified" */ /* "last-modified" */
#define GRPC_MDSTR_LAST_MODIFIED (grpc_static_slice_table[81]) #define GRPC_MDSTR_LAST_MODIFIED (grpc_static_slice_table[79])
/* "lb-cost-bin" */ /* "lb-cost-bin" */
#define GRPC_MDSTR_LB_COST_BIN (grpc_static_slice_table[82]) #define GRPC_MDSTR_LB_COST_BIN (grpc_static_slice_table[80])
/* "link" */ /* "link" */
#define GRPC_MDSTR_LINK (grpc_static_slice_table[83]) #define GRPC_MDSTR_LINK (grpc_static_slice_table[81])
/* "location" */ /* "location" */
#define GRPC_MDSTR_LOCATION (grpc_static_slice_table[84]) #define GRPC_MDSTR_LOCATION (grpc_static_slice_table[82])
/* "max-forwards" */ /* "max-forwards" */
#define GRPC_MDSTR_MAX_FORWARDS (grpc_static_slice_table[85]) #define GRPC_MDSTR_MAX_FORWARDS (grpc_static_slice_table[83])
/* "proxy-authenticate" */ /* "proxy-authenticate" */
#define GRPC_MDSTR_PROXY_AUTHENTICATE (grpc_static_slice_table[86]) #define GRPC_MDSTR_PROXY_AUTHENTICATE (grpc_static_slice_table[84])
/* "proxy-authorization" */ /* "proxy-authorization" */
#define GRPC_MDSTR_PROXY_AUTHORIZATION (grpc_static_slice_table[87]) #define GRPC_MDSTR_PROXY_AUTHORIZATION (grpc_static_slice_table[85])
/* "range" */ /* "range" */
#define GRPC_MDSTR_RANGE (grpc_static_slice_table[88]) #define GRPC_MDSTR_RANGE (grpc_static_slice_table[86])
/* "referer" */ /* "referer" */
#define GRPC_MDSTR_REFERER (grpc_static_slice_table[89]) #define GRPC_MDSTR_REFERER (grpc_static_slice_table[87])
/* "refresh" */ /* "refresh" */
#define GRPC_MDSTR_REFRESH (grpc_static_slice_table[90]) #define GRPC_MDSTR_REFRESH (grpc_static_slice_table[88])
/* "retry-after" */ /* "retry-after" */
#define GRPC_MDSTR_RETRY_AFTER (grpc_static_slice_table[91]) #define GRPC_MDSTR_RETRY_AFTER (grpc_static_slice_table[89])
/* "server" */ /* "server" */
#define GRPC_MDSTR_SERVER (grpc_static_slice_table[92]) #define GRPC_MDSTR_SERVER (grpc_static_slice_table[90])
/* "set-cookie" */ /* "set-cookie" */
#define GRPC_MDSTR_SET_COOKIE (grpc_static_slice_table[93]) #define GRPC_MDSTR_SET_COOKIE (grpc_static_slice_table[91])
/* "strict-transport-security" */ /* "strict-transport-security" */
#define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY (grpc_static_slice_table[94]) #define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY (grpc_static_slice_table[92])
/* "transfer-encoding" */ /* "transfer-encoding" */
#define GRPC_MDSTR_TRANSFER_ENCODING (grpc_static_slice_table[95]) #define GRPC_MDSTR_TRANSFER_ENCODING (grpc_static_slice_table[93])
/* "vary" */ /* "vary" */
#define GRPC_MDSTR_VARY (grpc_static_slice_table[96]) #define GRPC_MDSTR_VARY (grpc_static_slice_table[94])
/* "via" */ /* "via" */
#define GRPC_MDSTR_VIA (grpc_static_slice_table[97]) #define GRPC_MDSTR_VIA (grpc_static_slice_table[95])
/* "www-authenticate" */ /* "www-authenticate" */
#define GRPC_MDSTR_WWW_AUTHENTICATE (grpc_static_slice_table[98]) #define GRPC_MDSTR_WWW_AUTHENTICATE (grpc_static_slice_table[96])
/* "identity,deflate" */ /* "identity,deflate" */
#define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE (grpc_static_slice_table[99]) #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE (grpc_static_slice_table[97])
/* "identity,gzip" */ /* "identity,gzip" */
#define GRPC_MDSTR_IDENTITY_COMMA_GZIP (grpc_static_slice_table[100]) #define GRPC_MDSTR_IDENTITY_COMMA_GZIP (grpc_static_slice_table[98])
/* "deflate,gzip" */ /* "deflate,gzip" */
#define GRPC_MDSTR_DEFLATE_COMMA_GZIP (grpc_static_slice_table[101]) #define GRPC_MDSTR_DEFLATE_COMMA_GZIP (grpc_static_slice_table[99])
/* "identity,deflate,gzip" */ /* "identity,deflate,gzip" */
#define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \ #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \
(grpc_static_slice_table[102]) (grpc_static_slice_table[100])
extern const grpc_slice_refcount_vtable grpc_static_metadata_vtable; extern const grpc_slice_refcount_vtable grpc_static_metadata_vtable;
extern grpc_slice_refcount extern grpc_slice_refcount
@ -590,5 +586,4 @@ extern const uint8_t grpc_static_accept_stream_encoding_metadata[4];
(GRPC_MAKE_MDELEM(&grpc_static_mdelem_table \ (GRPC_MAKE_MDELEM(&grpc_static_mdelem_table \
[grpc_static_accept_stream_encoding_metadata[(algs)]], \ [grpc_static_accept_stream_encoding_metadata[(algs)]], \
GRPC_MDELEM_STORAGE_STATIC)) GRPC_MDELEM_STORAGE_STATIC))
#endif /* GRPC_CORE_LIB_TRANSPORT_STATIC_METADATA_H */ #endif /* GRPC_CORE_LIB_TRANSPORT_STATIC_METADATA_H */

@ -26,17 +26,36 @@ alts_shared_resource* alts_get_shared_resource(void) {
return &g_alts_resource; return &g_alts_resource;
} }
static void grpc_tsi_alts_wait_for_cq_drain() {
gpr_mu_lock(&g_alts_resource.mu);
while (!g_alts_resource.is_cq_drained) {
gpr_cv_wait(&g_alts_resource.cv, &g_alts_resource.mu,
gpr_inf_future(GPR_CLOCK_REALTIME));
}
gpr_mu_unlock(&g_alts_resource.mu);
}
void grpc_tsi_alts_signal_for_cq_destroy() {
gpr_mu_lock(&g_alts_resource.mu);
g_alts_resource.is_cq_drained = true;
gpr_cv_signal(&g_alts_resource.cv);
gpr_mu_unlock(&g_alts_resource.mu);
}
void grpc_tsi_alts_init() { void grpc_tsi_alts_init() {
memset(&g_alts_resource, 0, sizeof(alts_shared_resource)); memset(&g_alts_resource, 0, sizeof(alts_shared_resource));
gpr_mu_init(&g_alts_resource.mu); gpr_mu_init(&g_alts_resource.mu);
gpr_cv_init(&g_alts_resource.cv);
} }
void grpc_tsi_alts_shutdown() { void grpc_tsi_alts_shutdown() {
gpr_mu_destroy(&g_alts_resource.mu); if (g_alts_resource.cq != nullptr) {
if (g_alts_resource.cq == nullptr) { grpc_completion_queue_shutdown(g_alts_resource.cq);
return; grpc_tsi_alts_wait_for_cq_drain();
}
grpc_completion_queue_destroy(g_alts_resource.cq); grpc_completion_queue_destroy(g_alts_resource.cq);
grpc_channel_destroy(g_alts_resource.channel); grpc_channel_destroy(g_alts_resource.channel);
gpr_thd_join(g_alts_resource.thread_id); gpr_thd_join(g_alts_resource.thread_id);
}
gpr_cv_destroy(&g_alts_resource.cv);
gpr_mu_destroy(&g_alts_resource.mu);
} }

@ -28,10 +28,17 @@ typedef struct alts_shared_resource {
grpc_channel* channel; grpc_channel* channel;
grpc_completion_queue* cq; grpc_completion_queue* cq;
gpr_mu mu; gpr_mu mu;
gpr_cv cv;
bool is_cq_drained;
} alts_shared_resource; } alts_shared_resource;
/* This method returns the address of alts_shared_resource object shared by all /* This method returns the address of alts_shared_resource object shared by all
* TSI handshakes. */ * TSI handshakes. */
alts_shared_resource* alts_get_shared_resource(void); alts_shared_resource* alts_get_shared_resource(void);
/* This method signals the thread that invokes grpc_tsi_alts_shutdown() to
* continue with destroying the cq as a part of shutdown process. */
void grpc_tsi_alts_signal_for_cq_destroy(void);
#endif /* GRPC_CORE_TSI_ALTS_TRANSPORT_SECURITY_H */ #endif /* GRPC_CORE_TSI_ALTS_TRANSPORT_SECURITY_H */

@ -96,6 +96,7 @@ void ClientContext::set_call(grpc_call* call,
void ClientContext::set_compression_algorithm( void ClientContext::set_compression_algorithm(
grpc_compression_algorithm algorithm) { grpc_compression_algorithm algorithm) {
compression_algorithm_ = algorithm;
const char* algorithm_name = nullptr; const char* algorithm_name = nullptr;
if (!grpc_compression_algorithm_name(algorithm, &algorithm_name)) { if (!grpc_compression_algorithm_name(algorithm, &algorithm_name)) {
gpr_log(GPR_ERROR, "Name for compression algorithm '%d' unknown.", gpr_log(GPR_ERROR, "Name for compression algorithm '%d' unknown.",

@ -190,6 +190,7 @@ bool ServerContext::IsCancelled() const {
void ServerContext::set_compression_algorithm( void ServerContext::set_compression_algorithm(
grpc_compression_algorithm algorithm) { grpc_compression_algorithm algorithm) {
compression_algorithm_ = algorithm;
const char* algorithm_name = nullptr; const char* algorithm_name = nullptr;
if (!grpc_compression_algorithm_name(algorithm, &algorithm_name)) { if (!grpc_compression_algorithm_name(algorithm, &algorithm_name)) {
gpr_log(GPR_ERROR, "Name for compression algorithm '%d' unknown.", gpr_log(GPR_ERROR, "Name for compression algorithm '%d' unknown.",

@ -39,7 +39,7 @@ namespace Grpc.Core.Internal
{ {
this.nativeMethods = new NativeMethods(Load()); this.nativeMethods = new NativeMethods(Load());
// Redirect the the native logs as the very first thing after loading the native extension // Redirect the native logs as the very first thing after loading the native extension
// to make sure we don't lose any logs. // to make sure we don't lose any logs.
NativeLogRedirector.Redirect(this.nativeMethods); NativeLogRedirector.Redirect(this.nativeMethods);

@ -13,7 +13,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="SourceLink.Embed.AllSourceFiles" Version="2.7.3" PrivateAssets="all" /> <PackageReference Include="SourceLink.Create.CommandLine" Version="2.7.6" PrivateAssets="all" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -685,7 +685,7 @@ namespace Grpc.IntegrationTesting
private static Metadata CreateClientCompressionMetadata(bool compressed) private static Metadata CreateClientCompressionMetadata(bool compressed)
{ {
var algorithmName = compressed ? "message/gzip" : "identity"; var algorithmName = compressed ? "gzip" : "identity";
return new Metadata return new Metadata
{ {
{ new Metadata.Entry(Metadata.CompressionRequestAlgorithmMetadataKey, algorithmName) } { new Metadata.Entry(Metadata.CompressionRequestAlgorithmMetadataKey, algorithmName) }

@ -46,10 +46,10 @@
hostConfig.compressAlgorithm = GRPC_COMPRESS_NONE; hostConfig.compressAlgorithm = GRPC_COMPRESS_NONE;
break; break;
case GRPCCompressDeflate: case GRPCCompressDeflate:
hostConfig.compressAlgorithm = GRPC_COMPRESS_MESSAGE_DEFLATE; hostConfig.compressAlgorithm = GRPC_COMPRESS_DEFLATE;
break; break;
case GRPCCompressGzip: case GRPCCompressGzip:
hostConfig.compressAlgorithm = GRPC_COMPRESS_MESSAGE_GZIP; hostConfig.compressAlgorithm = GRPC_COMPRESS_GZIP;
break; break;
default: default:
NSLog(@"Invalid compression algorithm"); NSLog(@"Invalid compression algorithm");

@ -225,8 +225,6 @@ static GRPCConnectivityMonitor *connectivityMonitor = nil;
if (_responseSizeLimitOverride) { if (_responseSizeLimitOverride) {
args[@GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH] = _responseSizeLimitOverride; args[@GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH] = _responseSizeLimitOverride;
} }
// Use 10000ms initial backoff time for correct behavior on bad/slow networks
args[@GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS] = @10000;
if (_compressAlgorithm != GRPC_COMPRESS_NONE) { if (_compressAlgorithm != GRPC_COMPRESS_NONE) {
args[@GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM] = args[@GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM] =

@ -18,7 +18,10 @@
#import "ProtoMethod.h" #import "ProtoMethod.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
@implementation ProtoMethod @implementation ProtoMethod
#pragma clang diagnostic pop
- (instancetype)initWithPackage:(NSString *)package - (instancetype)initWithPackage:(NSString *)package
service:(NSString *)service service:(NSString *)service
method:(NSString *)method { method:(NSString *)method {

@ -42,7 +42,10 @@ static NSError *ErrorForBadProto(id proto, Class expectedClass, NSError *parsing
userInfo:info]; userInfo:info];
} }
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
@implementation ProtoRPC { @implementation ProtoRPC {
#pragma clang diagnostic pop
id<GRXWriteable> _responseWriteable; id<GRXWriteable> _responseWriteable;
} }

@ -24,7 +24,10 @@
#import "ProtoMethod.h" #import "ProtoMethod.h"
#import "ProtoRPC.h" #import "ProtoRPC.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
@implementation ProtoService { @implementation ProtoService {
#pragma clang diagnostic pop
NSString *_host; NSString *_host;
NSString *_packageName; NSString *_packageName;
NSString *_serviceName; NSString *_serviceName;

@ -64,11 +64,14 @@
} }
- (void)enqueueSuccessfulCompletion { - (void)enqueueSuccessfulCompletion {
__weak typeof(self) weakSelf = self;
dispatch_async(_writeableQueue, ^{ dispatch_async(_writeableQueue, ^{
typeof(self) strongSelf = weakSelf;
if (strongSelf) {
BOOL finished = NO; BOOL finished = NO;
@synchronized (self) { @synchronized (self) {
if (!_alreadyFinished) { if (!strongSelf->_alreadyFinished) {
_alreadyFinished = YES; strongSelf->_alreadyFinished = YES;
} else { } else {
finished = YES; finished = YES;
} }
@ -80,6 +83,7 @@
// Skip any possible message to the wrapped writeable enqueued after this one. // Skip any possible message to the wrapped writeable enqueued after this one.
self.writeable = nil; self.writeable = nil;
} }
}
}); });
} }

@ -34,12 +34,12 @@
#include <string.h> #include <string.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/credentials.h"
#include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/host_port.h"
#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/string.h"
#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gpr/tmpfile.h"
#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/end2end/data/ssl_test_data.h"

@ -23,7 +23,6 @@
#import <Cronet/Cronet.h> #import <Cronet/Cronet.h>
#import <grpc/grpc.h> #import <grpc/grpc.h>
#import <grpc/grpc_cronet.h> #import <grpc/grpc_cronet.h>
#import <grpc/support/host_port.h>
#import "test/core/end2end/cq_verifier.h" #import "test/core/end2end/cq_verifier.h"
#import "test/core/util/port.h" #import "test/core/util/port.h"
@ -32,6 +31,7 @@
#import "src/core/lib/channel/channel_args.h" #import "src/core/lib/channel/channel_args.h"
#import "src/core/lib/gpr/env.h" #import "src/core/lib/gpr/env.h"
#import "src/core/lib/gpr/host_port.h"
#import "src/core/lib/gpr/string.h" #import "src/core/lib/gpr/string.h"
#import "src/core/lib/gpr/tmpfile.h" #import "src/core/lib/gpr/tmpfile.h"
#import "test/core/end2end/data/ssl_test_data.h" #import "test/core/end2end/data/ssl_test_data.h"

@ -557,8 +557,8 @@ cdef extern from "grpc/compression.h":
ctypedef enum grpc_compression_algorithm: ctypedef enum grpc_compression_algorithm:
GRPC_COMPRESS_NONE GRPC_COMPRESS_NONE
GRPC_COMPRESS_MESSAGE_DEFLATE GRPC_COMPRESS_DEFLATE
GRPC_COMPRESS_MESSAGE_GZIP GRPC_COMPRESS_GZIP
GRPC_COMPRESS_STREAM_GZIP GRPC_COMPRESS_STREAM_GZIP
GRPC_COMPRESS_ALGORITHMS_COUNT GRPC_COMPRESS_ALGORITHMS_COUNT

@ -112,8 +112,8 @@ class OperationType:
class CompressionAlgorithm: class CompressionAlgorithm:
none = GRPC_COMPRESS_NONE none = GRPC_COMPRESS_NONE
deflate = GRPC_COMPRESS_MESSAGE_DEFLATE deflate = GRPC_COMPRESS_DEFLATE
gzip = GRPC_COMPRESS_MESSAGE_GZIP gzip = GRPC_COMPRESS_GZIP
class CompressionLevel: class CompressionLevel:

@ -70,7 +70,6 @@ CORE_SOURCE_FILES = [
'src/core/lib/channel/handshaker_registry.cc', 'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc', 'src/core/lib/compression/compression.cc',
'src/core/lib/compression/compression_internal.cc', 'src/core/lib/compression/compression_internal.cc',
'src/core/lib/compression/compression_ruby.cc',
'src/core/lib/compression/message_compress.cc', 'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc', 'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc', 'src/core/lib/compression/stream_compression_gzip.cc',

@ -14,6 +14,7 @@
"""Tests that a channel will reconnect if a connection is dropped""" """Tests that a channel will reconnect if a connection is dropped"""
import socket import socket
import time
import unittest import unittest
import grpc import grpc
@ -88,6 +89,7 @@ class ReconnectTest(unittest.TestCase):
multi_callable = channel.unary_unary(_UNARY_UNARY) multi_callable = channel.unary_unary(_UNARY_UNARY)
self.assertEqual(_RESPONSE, multi_callable(_REQUEST)) self.assertEqual(_RESPONSE, multi_callable(_REQUEST))
server.stop(None) server.stop(None)
time.sleep(1)
server = grpc.server(server_pool, (handler,)) server = grpc.server(server_pool, (handler,))
server.add_insecure_port('[::]:{}'.format(port)) server.add_insecure_port('[::]:{}'.format(port))
server.start() server.start()

@ -193,7 +193,7 @@ end
Args = Struct.new(:host, :port, :action, :project_id, :topic_name, Args = Struct.new(:host, :port, :action, :project_id, :topic_name,
:sub_name) :sub_name)
# validates the the command line options, returning them as an Arg. # validates the command line options, returning them as an Arg.
def parse_args def parse_args
args = Args.new('pubsub-staging.googleapis.com', args = Args.new('pubsub-staging.googleapis.com',
443, 'list_some_topics', 'stoked-keyword-656') 443, 'list_some_topics', 'stoked-keyword-656')

@ -362,8 +362,8 @@ static void wait_for_watch_state_op_complete_unblocking_func(void* arg) {
/* Wait until the channel's connectivity state becomes different from /* Wait until the channel's connectivity state becomes different from
* "last_state", or "deadline" expires. * "last_state", or "deadline" expires.
* Returns true if the the channel's connectivity state becomes * Returns true if the channel's connectivity state becomes different
* different from "last_state" within "deadline". * from "last_state" within "deadline".
* Returns false if "deadline" expires before the channel's connectivity * Returns false if "deadline" expires before the channel's connectivity
* state changes from "last_state". * state changes from "last_state".
* */ * */

@ -23,7 +23,6 @@
#include "rb_grpc_imports.generated.h" #include "rb_grpc_imports.generated.h"
#include <grpc/compression.h> #include <grpc/compression.h>
#include <grpc/compression_ruby.h>
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/impl/codegen/compression_types.h> #include <grpc/impl/codegen/compression_types.h>
#include <grpc/impl/codegen/grpc_types.h> #include <grpc/impl/codegen/grpc_types.h>
@ -175,7 +174,7 @@ void grpc_rb_compression_options_algorithm_name_to_value_internal(
/* Raise an error if the name isn't recognized as a compression algorithm by /* Raise an error if the name isn't recognized as a compression algorithm by
* the algorithm parse function * the algorithm parse function
* in GRPC core. */ * in GRPC core. */
if (!grpc_compression_algorithm_parse_ruby(name_slice, algorithm_value)) { if (!grpc_compression_algorithm_parse(name_slice, algorithm_value)) {
tmp_str = grpc_slice_to_c_string(name_slice); tmp_str = grpc_slice_to_c_string(name_slice);
rb_raise(rb_eNameError, "Invalid compression algorithm name: %s", tmp_str); rb_raise(rb_eNameError, "Invalid compression algorithm name: %s", tmp_str);
} }
@ -287,7 +286,7 @@ VALUE grpc_rb_compression_options_algorithm_value_to_name_internal(
grpc_compression_algorithm internal_value) { grpc_compression_algorithm internal_value) {
char* algorithm_name = NULL; char* algorithm_name = NULL;
if (!grpc_compression_algorithm_name_ruby(internal_value, &algorithm_name)) { if (!grpc_compression_algorithm_name(internal_value, &algorithm_name)) {
rb_raise(rb_eArgError, "Failed to convert algorithm value to name"); rb_raise(rb_eArgError, "Failed to convert algorithm value to name");
} }

@ -31,8 +31,6 @@ grpc_compression_options_init_type grpc_compression_options_init_import;
grpc_compression_options_enable_algorithm_type grpc_compression_options_enable_algorithm_import; grpc_compression_options_enable_algorithm_type grpc_compression_options_enable_algorithm_import;
grpc_compression_options_disable_algorithm_type grpc_compression_options_disable_algorithm_import; grpc_compression_options_disable_algorithm_type grpc_compression_options_disable_algorithm_import;
grpc_compression_options_is_algorithm_enabled_type grpc_compression_options_is_algorithm_enabled_import; grpc_compression_options_is_algorithm_enabled_type grpc_compression_options_is_algorithm_enabled_import;
grpc_compression_algorithm_parse_ruby_type grpc_compression_algorithm_parse_ruby_import;
grpc_compression_algorithm_name_ruby_type grpc_compression_algorithm_name_ruby_import;
grpc_metadata_array_init_type grpc_metadata_array_init_import; grpc_metadata_array_init_type grpc_metadata_array_init_import;
grpc_metadata_array_destroy_type grpc_metadata_array_destroy_import; grpc_metadata_array_destroy_type grpc_metadata_array_destroy_import;
grpc_call_details_init_type grpc_call_details_init_import; grpc_call_details_init_type grpc_call_details_init_import;
@ -212,8 +210,6 @@ gpr_cmdline_destroy_type gpr_cmdline_destroy_import;
gpr_cmdline_usage_string_type gpr_cmdline_usage_string_import; gpr_cmdline_usage_string_type gpr_cmdline_usage_string_import;
gpr_cpu_num_cores_type gpr_cpu_num_cores_import; gpr_cpu_num_cores_type gpr_cpu_num_cores_import;
gpr_cpu_current_cpu_type gpr_cpu_current_cpu_import; gpr_cpu_current_cpu_type gpr_cpu_current_cpu_import;
gpr_join_host_port_type gpr_join_host_port_import;
gpr_split_host_port_type gpr_split_host_port_import;
gpr_log_severity_string_type gpr_log_severity_string_import; gpr_log_severity_string_type gpr_log_severity_string_import;
gpr_log_type gpr_log_import; gpr_log_type gpr_log_import;
gpr_log_message_type gpr_log_message_import; gpr_log_message_type gpr_log_message_import;
@ -292,8 +288,6 @@ void grpc_rb_load_imports(HMODULE library) {
grpc_compression_options_enable_algorithm_import = (grpc_compression_options_enable_algorithm_type) GetProcAddress(library, "grpc_compression_options_enable_algorithm"); grpc_compression_options_enable_algorithm_import = (grpc_compression_options_enable_algorithm_type) GetProcAddress(library, "grpc_compression_options_enable_algorithm");
grpc_compression_options_disable_algorithm_import = (grpc_compression_options_disable_algorithm_type) GetProcAddress(library, "grpc_compression_options_disable_algorithm"); grpc_compression_options_disable_algorithm_import = (grpc_compression_options_disable_algorithm_type) GetProcAddress(library, "grpc_compression_options_disable_algorithm");
grpc_compression_options_is_algorithm_enabled_import = (grpc_compression_options_is_algorithm_enabled_type) GetProcAddress(library, "grpc_compression_options_is_algorithm_enabled"); grpc_compression_options_is_algorithm_enabled_import = (grpc_compression_options_is_algorithm_enabled_type) GetProcAddress(library, "grpc_compression_options_is_algorithm_enabled");
grpc_compression_algorithm_parse_ruby_import = (grpc_compression_algorithm_parse_ruby_type) GetProcAddress(library, "grpc_compression_algorithm_parse_ruby");
grpc_compression_algorithm_name_ruby_import = (grpc_compression_algorithm_name_ruby_type) GetProcAddress(library, "grpc_compression_algorithm_name_ruby");
grpc_metadata_array_init_import = (grpc_metadata_array_init_type) GetProcAddress(library, "grpc_metadata_array_init"); grpc_metadata_array_init_import = (grpc_metadata_array_init_type) GetProcAddress(library, "grpc_metadata_array_init");
grpc_metadata_array_destroy_import = (grpc_metadata_array_destroy_type) GetProcAddress(library, "grpc_metadata_array_destroy"); grpc_metadata_array_destroy_import = (grpc_metadata_array_destroy_type) GetProcAddress(library, "grpc_metadata_array_destroy");
grpc_call_details_init_import = (grpc_call_details_init_type) GetProcAddress(library, "grpc_call_details_init"); grpc_call_details_init_import = (grpc_call_details_init_type) GetProcAddress(library, "grpc_call_details_init");
@ -473,8 +467,6 @@ void grpc_rb_load_imports(HMODULE library) {
gpr_cmdline_usage_string_import = (gpr_cmdline_usage_string_type) GetProcAddress(library, "gpr_cmdline_usage_string"); gpr_cmdline_usage_string_import = (gpr_cmdline_usage_string_type) GetProcAddress(library, "gpr_cmdline_usage_string");
gpr_cpu_num_cores_import = (gpr_cpu_num_cores_type) GetProcAddress(library, "gpr_cpu_num_cores"); gpr_cpu_num_cores_import = (gpr_cpu_num_cores_type) GetProcAddress(library, "gpr_cpu_num_cores");
gpr_cpu_current_cpu_import = (gpr_cpu_current_cpu_type) GetProcAddress(library, "gpr_cpu_current_cpu"); gpr_cpu_current_cpu_import = (gpr_cpu_current_cpu_type) GetProcAddress(library, "gpr_cpu_current_cpu");
gpr_join_host_port_import = (gpr_join_host_port_type) GetProcAddress(library, "gpr_join_host_port");
gpr_split_host_port_import = (gpr_split_host_port_type) GetProcAddress(library, "gpr_split_host_port");
gpr_log_severity_string_import = (gpr_log_severity_string_type) GetProcAddress(library, "gpr_log_severity_string"); gpr_log_severity_string_import = (gpr_log_severity_string_type) GetProcAddress(library, "gpr_log_severity_string");
gpr_log_import = (gpr_log_type) GetProcAddress(library, "gpr_log"); gpr_log_import = (gpr_log_type) GetProcAddress(library, "gpr_log");
gpr_log_message_import = (gpr_log_message_type) GetProcAddress(library, "gpr_log_message"); gpr_log_message_import = (gpr_log_message_type) GetProcAddress(library, "gpr_log_message");

@ -26,7 +26,6 @@
#include <windows.h> #include <windows.h>
#include <grpc/compression.h> #include <grpc/compression.h>
#include <grpc/compression_ruby.h>
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/grpc_posix.h> #include <grpc/grpc_posix.h>
#include <grpc/grpc_security.h> #include <grpc/grpc_security.h>
@ -36,7 +35,6 @@
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/cmdline.h> #include <grpc/support/cmdline.h>
#include <grpc/support/cpu.h> #include <grpc/support/cpu.h>
#include <grpc/support/host_port.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/log_windows.h> #include <grpc/support/log_windows.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
@ -72,12 +70,6 @@ extern grpc_compression_options_disable_algorithm_type grpc_compression_options_
typedef int(*grpc_compression_options_is_algorithm_enabled_type)(const grpc_compression_options* opts, grpc_compression_algorithm algorithm); typedef int(*grpc_compression_options_is_algorithm_enabled_type)(const grpc_compression_options* opts, grpc_compression_algorithm algorithm);
extern grpc_compression_options_is_algorithm_enabled_type grpc_compression_options_is_algorithm_enabled_import; extern grpc_compression_options_is_algorithm_enabled_type grpc_compression_options_is_algorithm_enabled_import;
#define grpc_compression_options_is_algorithm_enabled grpc_compression_options_is_algorithm_enabled_import #define grpc_compression_options_is_algorithm_enabled grpc_compression_options_is_algorithm_enabled_import
typedef int(*grpc_compression_algorithm_parse_ruby_type)(grpc_slice value, grpc_compression_algorithm* algorithm);
extern grpc_compression_algorithm_parse_ruby_type grpc_compression_algorithm_parse_ruby_import;
#define grpc_compression_algorithm_parse_ruby grpc_compression_algorithm_parse_ruby_import
typedef int(*grpc_compression_algorithm_name_ruby_type)(grpc_compression_algorithm algorithm, const char** name);
extern grpc_compression_algorithm_name_ruby_type grpc_compression_algorithm_name_ruby_import;
#define grpc_compression_algorithm_name_ruby grpc_compression_algorithm_name_ruby_import
typedef void(*grpc_metadata_array_init_type)(grpc_metadata_array* array); typedef void(*grpc_metadata_array_init_type)(grpc_metadata_array* array);
extern grpc_metadata_array_init_type grpc_metadata_array_init_import; extern grpc_metadata_array_init_type grpc_metadata_array_init_import;
#define grpc_metadata_array_init grpc_metadata_array_init_import #define grpc_metadata_array_init grpc_metadata_array_init_import
@ -615,12 +607,6 @@ extern gpr_cpu_num_cores_type gpr_cpu_num_cores_import;
typedef unsigned(*gpr_cpu_current_cpu_type)(void); typedef unsigned(*gpr_cpu_current_cpu_type)(void);
extern gpr_cpu_current_cpu_type gpr_cpu_current_cpu_import; extern gpr_cpu_current_cpu_type gpr_cpu_current_cpu_import;
#define gpr_cpu_current_cpu gpr_cpu_current_cpu_import #define gpr_cpu_current_cpu gpr_cpu_current_cpu_import
typedef int(*gpr_join_host_port_type)(char** out, const char* host, int port);
extern gpr_join_host_port_type gpr_join_host_port_import;
#define gpr_join_host_port gpr_join_host_port_import
typedef int(*gpr_split_host_port_type)(const char* name, char** host, char** port);
extern gpr_split_host_port_type gpr_split_host_port_import;
#define gpr_split_host_port gpr_split_host_port_import
typedef const char*(*gpr_log_severity_string_type)(gpr_log_severity severity); typedef const char*(*gpr_log_severity_string_type)(gpr_log_severity severity);
extern gpr_log_severity_string_type gpr_log_severity_string_import; extern gpr_log_severity_string_type gpr_log_severity_string_import;
#define gpr_log_severity_string gpr_log_severity_string_import #define gpr_log_severity_string gpr_log_severity_string_import

@ -707,7 +707,7 @@ Args = Struct.new(:default_service_account, :host, :host_override,
:oauth_scope, :port, :secure, :test_case, :oauth_scope, :port, :secure, :test_case,
:use_test_ca) :use_test_ca)
# validates the the command line options, returning them as a Hash. # validates the command line options, returning them as a Hash.
def parse_args def parse_args
args = Args.new args = Args.new
args.host_override = 'foo.test.google.fr' args.host_override = 'foo.test.google.fr'

@ -211,7 +211,7 @@ class TestTarget < Grpc::Testing::TestService::Service
end end
end end
# validates the the command line options, returning them as a Hash. # validates the command line options, returning them as a Hash.
def parse_options def parse_options
options = { options = {
'port' => nil, 'port' => nil,

@ -77,10 +77,10 @@
set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/")
project(<%text>${PACKAGE_NAME}</%text> C CXX) project(<%text>${PACKAGE_NAME}</%text> C CXX)
set(gRPC_INSTALL_BINDIR "<%text>${CMAKE_INSTALL_PREFIX}</%text>/bin" CACHE PATH "Installation directory for executables") set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables")
set(gRPC_INSTALL_LIBDIR "<%text>${CMAKE_INSTALL_PREFIX}</%text>/lib" CACHE PATH "Installation directory for libraries") set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries")
set(gRPC_INSTALL_INCLUDEDIR "<%text>${CMAKE_INSTALL_PREFIX}</%text>/include" CACHE PATH "Installation directory for headers") set(gRPC_INSTALL_INCLUDEDIR "include" CACHE STRING "Installation directory for headers")
set(gRPC_INSTALL_CMAKEDIR "<%text>${CMAKE_INSTALL_PREFIX}/lib/cmake/${PACKAGE_NAME}</%text>" CACHE PATH "Installation directory for cmake config files") set(gRPC_INSTALL_CMAKEDIR "lib/cmake/<%text>${PACKAGE_NAME}</%text>" CACHE STRING "Installation directory for cmake config files")
# Options # Options
option(gRPC_BUILD_TESTS "Build tests" OFF) option(gRPC_BUILD_TESTS "Build tests" OFF)

@ -18,6 +18,11 @@
<%include file="../clang5.include"/> <%include file="../clang5.include"/>
ADD clang_format_all_the_things.sh / ADD clang_format_all_the_things.sh /
# When running locally, we'll be impersonating the current user, so we need
# to make the script runnable by everyone.
RUN chmod a+rx /clang_format_all_the_things.sh
CMD ["echo 'Run with tools/distrib/clang_format_code.sh'"] CMD ["echo 'Run with tools/distrib/clang_format_code.sh'"]

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save