Merge remote-tracking branch 'upstream/master' into shutdown

reviewable/pr17308/r1
yang-g 6 years ago
commit df9bd2f506
  1. 100
      .pylintrc-examples
  2. 9
      BUILD
  3. 162
      CMakeLists.txt
  4. 167
      Makefile
  5. 6
      Rakefile
  6. 2
      bazel/cc_grpc_library.bzl
  7. 2
      bazel/generate_cc.bzl
  8. 3
      bazel/grpc_build_system.bzl
  9. 21
      bazel/grpc_deps.bzl
  10. 65
      build.yaml
  11. 3
      config.m4
  12. 3
      config.w32
  13. 3
      doc/g_stands_for.md
  14. 5
      doc/python/sphinx/grpc.rst
  15. 19
      examples/BUILD
  16. 86
      examples/cpp/keyvaluestore/client.cc
  17. 97
      examples/cpp/keyvaluestore/server.cc
  18. 33
      examples/protos/keyvaluestore.proto
  19. 2
      examples/python/helloworld/greeter_client_with_options.py
  20. 5
      examples/ruby/greeter_server.rb
  21. 5
      examples/ruby/route_guide/route_guide_server.rb
  22. 8
      gRPC-C++.podspec
  23. 12
      gRPC-Core.podspec
  24. 2
      gRPC-ProtoRPC.podspec
  25. 2
      gRPC-RxLibrary.podspec
  26. 4
      gRPC.podspec
  27. 5
      grpc.gemspec
  28. 14
      grpc.gyp
  29. 6
      include/grpc/impl/codegen/grpc_types.h
  30. 5
      include/grpc/impl/codegen/port_platform.h
  31. 108
      include/grpcpp/impl/codegen/call_op_set.h
  32. 12
      include/grpcpp/impl/codegen/client_callback.h
  33. 2
      include/grpcpp/impl/codegen/client_unary_call.h
  34. 31
      include/grpcpp/impl/codegen/interceptor.h
  35. 88
      include/grpcpp/impl/codegen/interceptor_common.h
  36. 4
      include/grpcpp/impl/codegen/method_handler_impl.h
  37. 12
      include/grpcpp/impl/codegen/server_callback.h
  38. 2
      include/grpcpp/impl/codegen/server_interface.h
  39. 10
      include/grpcpp/impl/codegen/sync_stream.h
  40. 9
      include/grpcpp/impl/grpc_library.h
  41. 9
      package.xml
  42. 2
      setup.py
  43. 111
      src/compiler/objective_c_generator.cc
  44. 7
      src/compiler/objective_c_generator.h
  45. 21
      src/compiler/objective_c_plugin.cc
  46. 2
      src/core/ext/filters/client_channel/client_channel_factory.cc
  47. 4
      src/core/ext/filters/client_channel/client_channel_factory.h
  48. 5
      src/core/ext/filters/client_channel/lb_policy/subchannel_list.h
  49. 29
      src/core/ext/filters/client_channel/parse_address.cc
  50. 36
      src/core/ext/filters/client_channel/subchannel.cc
  51. 15
      src/core/ext/filters/client_channel/subchannel.h
  52. 32
      src/core/ext/filters/client_channel/subchannel_index.cc
  53. 3
      src/core/ext/filters/client_channel/subchannel_index.h
  54. 10
      src/core/ext/transport/chttp2/client/insecure/channel_create.cc
  55. 44
      src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc
  56. 7
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  57. 38
      src/core/ext/transport/chttp2/transport/context_list.cc
  58. 35
      src/core/ext/transport/chttp2/transport/context_list.h
  59. 16
      src/core/ext/transport/cronet/client/secure/cronet_channel_create.cc
  60. 12
      src/core/ext/transport/cronet/transport/cronet_transport.cc
  61. 97
      src/core/lib/iomgr/cfstream_handle.cc
  62. 2
      src/core/lib/iomgr/cfstream_handle.h
  63. 9
      src/core/lib/iomgr/combiner.cc
  64. 3
      src/core/lib/iomgr/ev_epoll1_linux.cc
  65. 3
      src/core/lib/iomgr/ev_epollex_linux.cc
  66. 3
      src/core/lib/iomgr/ev_poll_posix.cc
  67. 4
      src/core/lib/iomgr/ev_posix.cc
  68. 4
      src/core/lib/iomgr/ev_posix.h
  69. 22
      src/core/lib/iomgr/grpc_if_nametoindex.h
  70. 42
      src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
  71. 24
      src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
  72. 7
      src/core/lib/iomgr/iomgr.cc
  73. 3
      src/core/lib/iomgr/iomgr.h
  74. 6
      src/core/lib/iomgr/iomgr_custom.cc
  75. 4
      src/core/lib/iomgr/iomgr_internal.cc
  76. 4
      src/core/lib/iomgr/iomgr_internal.h
  77. 7
      src/core/lib/iomgr/iomgr_posix.cc
  78. 7
      src/core/lib/iomgr/iomgr_posix_cfstream.cc
  79. 7
      src/core/lib/iomgr/iomgr_windows.cc
  80. 1
      src/core/lib/iomgr/port.h
  81. 1
      src/core/lib/iomgr/resource_quota.cc
  82. 4
      src/core/lib/iomgr/tcp_custom.cc
  83. 13
      src/core/lib/iomgr/tcp_posix.cc
  84. 1
      src/core/lib/iomgr/tcp_uv.cc
  85. 98
      src/core/lib/iomgr/tcp_windows.cc
  86. 5
      src/core/lib/surface/channel_init.h
  87. 104
      src/core/lib/surface/server.cc
  88. 2
      src/core/lib/surface/version.cc
  89. 1
      src/core/lib/transport/metadata.cc
  90. 5
      src/cpp/common/channel_filter.h
  91. 2
      src/cpp/common/version_cc.cc
  92. 4
      src/cpp/server/server_cc.cc
  93. 2
      src/csharp/Grpc.Core/Interceptors/ServerServiceDefinitionExtensions.cs
  94. 2
      src/csharp/Grpc.Core/Version.csproj.include
  95. 4
      src/csharp/Grpc.Core/VersionInfo.cs
  96. 2
      src/csharp/build_packages_dotnetcli.bat
  97. 2
      src/csharp/build_unitypackage.bat
  98. 2
      src/objective-c/!ProtoCompiler-gRPCPlugin.podspec
  99. 34
      src/objective-c/GRPCClient/GRPCCall+ChannelArg.h
  100. 5
      src/objective-c/GRPCClient/GRPCCall+ChannelArg.m
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,100 @@
[MASTER]
ignore=
src/python/grpcio/grpc/beta,
src/python/grpcio/grpc/framework,
src/python/grpcio/grpc/framework/common,
src/python/grpcio/grpc/framework/foundation,
src/python/grpcio/grpc/framework/interfaces,
[VARIABLES]
# TODO(https://github.com/PyCQA/pylint/issues/1345): How does the inspection
# not include "unused_" and "ignored_" by default?
dummy-variables-rgx=^ignored_|^unused_
[DESIGN]
# NOTE(nathaniel): Not particularly attached to this value; it just seems to
# be what works for us at the moment (excepting the dead-code-walking Beta
# API).
max-args=6
[MISCELLANEOUS]
# NOTE(nathaniel): We are big fans of "TODO(<issue link>): " and
# "NOTE(<username or issue link>): ". We do not allow "TODO:",
# "TODO(<username>):", "FIXME:", or anything else.
notes=FIXME,XXX
[MESSAGES CONTROL]
disable=
# -- START OF EXAMPLE-SPECIFIC SUPPRESSIONS --
no-self-use,
unused-argument,
unused-variable,
# -- END OF EXAMPLE-SPECIFIC SUPPRESSIONS --
# TODO(https://github.com/PyCQA/pylint/issues/59#issuecomment-283774279):
# Enable cyclic-import after a 1.7-or-later pylint release that
# recognizes our disable=cyclic-import suppressions.
cyclic-import,
# TODO(https://github.com/grpc/grpc/issues/8622): Enable this after the
# Beta API is removed.
duplicate-code,
# TODO(https://github.com/grpc/grpc/issues/261): Doesn't seem to
# understand enum and concurrent.futures; look into this later with the
# latest pylint version.
import-error,
# TODO(https://github.com/grpc/grpc/issues/261): Enable this one.
# Should take a little configuration but not much.
invalid-name,
# TODO(https://github.com/grpc/grpc/issues/261): This doesn't seem to
# work for now? Try with a later pylint?
locally-disabled,
# NOTE(nathaniel): What even is this? *Enabling* an inspection results
# in a warning? How does that encourage more analysis and coverage?
locally-enabled,
# NOTE(nathaniel): We don't write doc strings for most private code
# elements.
missing-docstring,
# NOTE(nathaniel): In numeric comparisons it is better to have the
# lesser (or lesser-or-equal-to) quantity on the left when the
# expression is true than it is to worry about which is an identifier
# and which a literal value.
misplaced-comparison-constant,
# NOTE(nathaniel): Our completely abstract interface classes don't have
# constructors.
no-init,
# TODO(https://github.com/grpc/grpc/issues/261): Doesn't yet play
# nicely with some of our code being implemented in Cython. Maybe in a
# later version?
no-name-in-module,
# TODO(https://github.com/grpc/grpc/issues/261): Suppress these where
# the odd shape of the authentication portion of the API forces them on
# us and enable everywhere else.
protected-access,
# NOTE(nathaniel): Pylint and I will probably never agree on this.
too-few-public-methods,
# NOTE(nathaniel): Pylint and I wil probably never agree on this for
# private classes. For public classes maybe?
too-many-instance-attributes,
# NOTE(nathaniel): Some of our modules have a lot of lines... of
# specification and documentation. Maybe if this were
# lines-of-code-based we would use it.
too-many-lines,
# TODO(https://github.com/grpc/grpc/issues/261): Maybe we could have
# this one if we extracted just a few more helper functions...
too-many-nested-blocks,
# TODO(https://github.com/grpc/grpc/issues/261): Disable unnecessary
# super-init requirement for abstract class implementations for now.
super-init-not-called,
# NOTE(nathaniel): A single statement that always returns program
# control is better than two statements the first of which sometimes
# returns program control and the second of which always returns
# program control. Probably generally, but definitely in the cases of
# if:/else: and for:/else:.
useless-else-on-loop,
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,

@ -64,11 +64,11 @@ config_setting(
) )
# This should be updated along with build.yaml # This should be updated along with build.yaml
g_stands_for = "goose" g_stands_for = "gold"
core_version = "7.0.0-dev" core_version = "7.0.0-dev"
version = "1.18.0-dev" version = "1.19.0-dev"
GPR_PUBLIC_HDRS = [ GPR_PUBLIC_HDRS = [
"include/grpc/support/alloc.h", "include/grpc/support/alloc.h",
@ -724,6 +724,8 @@ grpc_cc_library(
"src/core/lib/iomgr/gethostname_fallback.cc", "src/core/lib/iomgr/gethostname_fallback.cc",
"src/core/lib/iomgr/gethostname_host_name_max.cc", "src/core/lib/iomgr/gethostname_host_name_max.cc",
"src/core/lib/iomgr/gethostname_sysconf.cc", "src/core/lib/iomgr/gethostname_sysconf.cc",
"src/core/lib/iomgr/grpc_if_nametoindex_posix.cc",
"src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc",
"src/core/lib/iomgr/internal_errqueue.cc", "src/core/lib/iomgr/internal_errqueue.cc",
"src/core/lib/iomgr/iocp_windows.cc", "src/core/lib/iomgr/iocp_windows.cc",
"src/core/lib/iomgr/iomgr.cc", "src/core/lib/iomgr/iomgr.cc",
@ -734,7 +736,6 @@ grpc_cc_library(
"src/core/lib/iomgr/is_epollexclusive_available.cc", "src/core/lib/iomgr/is_epollexclusive_available.cc",
"src/core/lib/iomgr/load_file.cc", "src/core/lib/iomgr/load_file.cc",
"src/core/lib/iomgr/lockfree_event.cc", "src/core/lib/iomgr/lockfree_event.cc",
"src/core/lib/iomgr/network_status_tracker.cc",
"src/core/lib/iomgr/polling_entity.cc", "src/core/lib/iomgr/polling_entity.cc",
"src/core/lib/iomgr/pollset.cc", "src/core/lib/iomgr/pollset.cc",
"src/core/lib/iomgr/pollset_custom.cc", "src/core/lib/iomgr/pollset_custom.cc",
@ -873,6 +874,7 @@ grpc_cc_library(
"src/core/lib/iomgr/executor.h", "src/core/lib/iomgr/executor.h",
"src/core/lib/iomgr/gethostname.h", "src/core/lib/iomgr/gethostname.h",
"src/core/lib/iomgr/gevent_util.h", "src/core/lib/iomgr/gevent_util.h",
"src/core/lib/iomgr/grpc_if_nametoindex.h",
"src/core/lib/iomgr/internal_errqueue.h", "src/core/lib/iomgr/internal_errqueue.h",
"src/core/lib/iomgr/iocp_windows.h", "src/core/lib/iomgr/iocp_windows.h",
"src/core/lib/iomgr/iomgr.h", "src/core/lib/iomgr/iomgr.h",
@ -883,7 +885,6 @@ grpc_cc_library(
"src/core/lib/iomgr/load_file.h", "src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/lockfree_event.h", "src/core/lib/iomgr/lockfree_event.h",
"src/core/lib/iomgr/nameser.h", "src/core/lib/iomgr/nameser.h",
"src/core/lib/iomgr/network_status_tracker.h",
"src/core/lib/iomgr/polling_entity.h", "src/core/lib/iomgr/polling_entity.h",
"src/core/lib/iomgr/pollset.h", "src/core/lib/iomgr/pollset.h",
"src/core/lib/iomgr/pollset_custom.h", "src/core/lib/iomgr/pollset_custom.h",

@ -24,7 +24,7 @@
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
set(PACKAGE_NAME "grpc") set(PACKAGE_NAME "grpc")
set(PACKAGE_VERSION "1.18.0-dev") set(PACKAGE_VERSION "1.19.0-dev")
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") 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/")
@ -94,7 +94,7 @@ endif()
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
add_definitions(-DPB_FIELD_16BIT) add_definitions(-DPB_FIELD_32BIT)
if (MSVC) if (MSVC)
include(cmake/msvc_static_runtime.cmake) include(cmake/msvc_static_runtime.cmake)
@ -371,11 +371,17 @@ add_dependencies(buildtests_c murmur_hash_test)
add_dependencies(buildtests_c no_server_test) add_dependencies(buildtests_c no_server_test)
add_dependencies(buildtests_c num_external_connectivity_watchers_test) add_dependencies(buildtests_c num_external_connectivity_watchers_test)
add_dependencies(buildtests_c parse_address_test) add_dependencies(buildtests_c parse_address_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_c parse_address_with_named_scope_id_test)
endif()
add_dependencies(buildtests_c percent_encoding_test) add_dependencies(buildtests_c percent_encoding_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_c resolve_address_posix_test) add_dependencies(buildtests_c resolve_address_using_ares_resolver_posix_test)
endif() endif()
add_dependencies(buildtests_c resolve_address_using_ares_resolver_test) add_dependencies(buildtests_c resolve_address_using_ares_resolver_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_c resolve_address_using_native_resolver_posix_test)
endif()
add_dependencies(buildtests_c resolve_address_using_native_resolver_test) add_dependencies(buildtests_c resolve_address_using_native_resolver_test)
add_dependencies(buildtests_c resource_quota_test) add_dependencies(buildtests_c resource_quota_test)
add_dependencies(buildtests_c secure_channel_create_test) add_dependencies(buildtests_c secure_channel_create_test)
@ -576,6 +582,9 @@ endif()
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx bm_pollset) add_dependencies(buildtests_cxx bm_pollset)
endif() endif()
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx bm_timer)
endif()
add_dependencies(buildtests_cxx byte_stream_test) add_dependencies(buildtests_cxx byte_stream_test)
add_dependencies(buildtests_cxx channel_arguments_test) add_dependencies(buildtests_cxx channel_arguments_test)
add_dependencies(buildtests_cxx channel_filter_test) add_dependencies(buildtests_cxx channel_filter_test)
@ -986,6 +995,8 @@ add_library(grpc
src/core/lib/iomgr/gethostname_fallback.cc src/core/lib/iomgr/gethostname_fallback.cc
src/core/lib/iomgr/gethostname_host_name_max.cc src/core/lib/iomgr/gethostname_host_name_max.cc
src/core/lib/iomgr/gethostname_sysconf.cc src/core/lib/iomgr/gethostname_sysconf.cc
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
src/core/lib/iomgr/internal_errqueue.cc src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc src/core/lib/iomgr/iomgr.cc
@ -997,7 +1008,6 @@ add_library(grpc
src/core/lib/iomgr/is_epollexclusive_available.cc src/core/lib/iomgr/is_epollexclusive_available.cc
src/core/lib/iomgr/load_file.cc src/core/lib/iomgr/load_file.cc
src/core/lib/iomgr/lockfree_event.cc src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/network_status_tracker.cc
src/core/lib/iomgr/polling_entity.cc src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_custom.cc src/core/lib/iomgr/pollset_custom.cc
@ -1408,6 +1418,8 @@ add_library(grpc_cronet
src/core/lib/iomgr/gethostname_fallback.cc src/core/lib/iomgr/gethostname_fallback.cc
src/core/lib/iomgr/gethostname_host_name_max.cc src/core/lib/iomgr/gethostname_host_name_max.cc
src/core/lib/iomgr/gethostname_sysconf.cc src/core/lib/iomgr/gethostname_sysconf.cc
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
src/core/lib/iomgr/internal_errqueue.cc src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc src/core/lib/iomgr/iomgr.cc
@ -1419,7 +1431,6 @@ add_library(grpc_cronet
src/core/lib/iomgr/is_epollexclusive_available.cc src/core/lib/iomgr/is_epollexclusive_available.cc
src/core/lib/iomgr/load_file.cc src/core/lib/iomgr/load_file.cc
src/core/lib/iomgr/lockfree_event.cc src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/network_status_tracker.cc
src/core/lib/iomgr/polling_entity.cc src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_custom.cc src/core/lib/iomgr/pollset_custom.cc
@ -1814,6 +1825,8 @@ add_library(grpc_test_util
src/core/lib/iomgr/gethostname_fallback.cc src/core/lib/iomgr/gethostname_fallback.cc
src/core/lib/iomgr/gethostname_host_name_max.cc src/core/lib/iomgr/gethostname_host_name_max.cc
src/core/lib/iomgr/gethostname_sysconf.cc src/core/lib/iomgr/gethostname_sysconf.cc
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
src/core/lib/iomgr/internal_errqueue.cc src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc src/core/lib/iomgr/iomgr.cc
@ -1825,7 +1838,6 @@ add_library(grpc_test_util
src/core/lib/iomgr/is_epollexclusive_available.cc src/core/lib/iomgr/is_epollexclusive_available.cc
src/core/lib/iomgr/load_file.cc src/core/lib/iomgr/load_file.cc
src/core/lib/iomgr/lockfree_event.cc src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/network_status_tracker.cc
src/core/lib/iomgr/polling_entity.cc src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_custom.cc src/core/lib/iomgr/pollset_custom.cc
@ -2136,6 +2148,8 @@ add_library(grpc_test_util_unsecure
src/core/lib/iomgr/gethostname_fallback.cc src/core/lib/iomgr/gethostname_fallback.cc
src/core/lib/iomgr/gethostname_host_name_max.cc src/core/lib/iomgr/gethostname_host_name_max.cc
src/core/lib/iomgr/gethostname_sysconf.cc src/core/lib/iomgr/gethostname_sysconf.cc
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
src/core/lib/iomgr/internal_errqueue.cc src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc src/core/lib/iomgr/iomgr.cc
@ -2147,7 +2161,6 @@ add_library(grpc_test_util_unsecure
src/core/lib/iomgr/is_epollexclusive_available.cc src/core/lib/iomgr/is_epollexclusive_available.cc
src/core/lib/iomgr/load_file.cc src/core/lib/iomgr/load_file.cc
src/core/lib/iomgr/lockfree_event.cc src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/network_status_tracker.cc
src/core/lib/iomgr/polling_entity.cc src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_custom.cc src/core/lib/iomgr/pollset_custom.cc
@ -2435,6 +2448,8 @@ add_library(grpc_unsecure
src/core/lib/iomgr/gethostname_fallback.cc src/core/lib/iomgr/gethostname_fallback.cc
src/core/lib/iomgr/gethostname_host_name_max.cc src/core/lib/iomgr/gethostname_host_name_max.cc
src/core/lib/iomgr/gethostname_sysconf.cc src/core/lib/iomgr/gethostname_sysconf.cc
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
src/core/lib/iomgr/internal_errqueue.cc src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc src/core/lib/iomgr/iomgr.cc
@ -2446,7 +2461,6 @@ add_library(grpc_unsecure
src/core/lib/iomgr/is_epollexclusive_available.cc src/core/lib/iomgr/is_epollexclusive_available.cc
src/core/lib/iomgr/load_file.cc src/core/lib/iomgr/load_file.cc
src/core/lib/iomgr/lockfree_event.cc src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/network_status_tracker.cc
src/core/lib/iomgr/polling_entity.cc src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_custom.cc src/core/lib/iomgr/pollset_custom.cc
@ -3320,6 +3334,8 @@ add_library(grpc++_cronet
src/core/lib/iomgr/gethostname_fallback.cc src/core/lib/iomgr/gethostname_fallback.cc
src/core/lib/iomgr/gethostname_host_name_max.cc src/core/lib/iomgr/gethostname_host_name_max.cc
src/core/lib/iomgr/gethostname_sysconf.cc src/core/lib/iomgr/gethostname_sysconf.cc
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
src/core/lib/iomgr/internal_errqueue.cc src/core/lib/iomgr/internal_errqueue.cc
src/core/lib/iomgr/iocp_windows.cc src/core/lib/iomgr/iocp_windows.cc
src/core/lib/iomgr/iomgr.cc src/core/lib/iomgr/iomgr.cc
@ -3331,7 +3347,6 @@ add_library(grpc++_cronet
src/core/lib/iomgr/is_epollexclusive_available.cc src/core/lib/iomgr/is_epollexclusive_available.cc
src/core/lib/iomgr/load_file.cc src/core/lib/iomgr/load_file.cc
src/core/lib/iomgr/lockfree_event.cc src/core/lib/iomgr/lockfree_event.cc
src/core/lib/iomgr/network_status_tracker.cc
src/core/lib/iomgr/polling_entity.cc src/core/lib/iomgr/polling_entity.cc
src/core/lib/iomgr/pollset.cc src/core/lib/iomgr/pollset.cc
src/core/lib/iomgr/pollset_custom.cc src/core/lib/iomgr/pollset_custom.cc
@ -5588,7 +5603,6 @@ add_library(end2end_tests
test/core/end2end/tests/max_connection_idle.cc test/core/end2end/tests/max_connection_idle.cc
test/core/end2end/tests/max_message_length.cc test/core/end2end/tests/max_message_length.cc
test/core/end2end/tests/negative_deadline.cc test/core/end2end/tests/negative_deadline.cc
test/core/end2end/tests/network_status_change.cc
test/core/end2end/tests/no_error_on_hotpath.cc test/core/end2end/tests/no_error_on_hotpath.cc
test/core/end2end/tests/no_logging.cc test/core/end2end/tests/no_logging.cc
test/core/end2end/tests/no_op.cc test/core/end2end/tests/no_op.cc
@ -5712,7 +5726,6 @@ add_library(end2end_nosec_tests
test/core/end2end/tests/max_connection_idle.cc test/core/end2end/tests/max_connection_idle.cc
test/core/end2end/tests/max_message_length.cc test/core/end2end/tests/max_message_length.cc
test/core/end2end/tests/negative_deadline.cc test/core/end2end/tests/negative_deadline.cc
test/core/end2end/tests/network_status_change.cc
test/core/end2end/tests/no_error_on_hotpath.cc test/core/end2end/tests/no_error_on_hotpath.cc
test/core/end2end/tests/no_logging.cc test/core/end2end/tests/no_logging.cc
test/core/end2end/tests/no_op.cc test/core/end2end/tests/no_op.cc
@ -9129,6 +9142,42 @@ target_link_libraries(parse_address_test
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(parse_address_with_named_scope_id_test
test/core/client_channel/parse_address_with_named_scope_id_test.cc
)
target_include_directories(parse_address_with_named_scope_id_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}
PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR}
)
target_link_libraries(parse_address_with_named_scope_id_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
grpc
gpr
)
# avoid dependency on libstdc++
if (_gRPC_CORE_NOSTDCXX_FLAGS)
set_target_properties(parse_address_with_named_scope_id_test PROPERTIES LINKER_LANGUAGE C)
target_compile_options(parse_address_with_named_scope_id_test PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${_gRPC_CORE_NOSTDCXX_FLAGS}>)
endif()
endif()
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
add_executable(percent_encoding_test add_executable(percent_encoding_test
test/core/slice/percent_encoding_test.cc test/core/slice/percent_encoding_test.cc
@ -9165,12 +9214,12 @@ endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(resolve_address_posix_test add_executable(resolve_address_using_ares_resolver_posix_test
test/core/iomgr/resolve_address_posix_test.cc test/core/iomgr/resolve_address_posix_test.cc
) )
target_include_directories(resolve_address_posix_test target_include_directories(resolve_address_using_ares_resolver_posix_test
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${_gRPC_SSL_INCLUDE_DIR} PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
@ -9183,7 +9232,7 @@ target_include_directories(resolve_address_posix_test
PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR} PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR}
) )
target_link_libraries(resolve_address_posix_test target_link_libraries(resolve_address_using_ares_resolver_posix_test
${_gRPC_ALLTARGETS_LIBRARIES} ${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util grpc_test_util
grpc grpc
@ -9192,8 +9241,8 @@ target_link_libraries(resolve_address_posix_test
# avoid dependency on libstdc++ # avoid dependency on libstdc++
if (_gRPC_CORE_NOSTDCXX_FLAGS) if (_gRPC_CORE_NOSTDCXX_FLAGS)
set_target_properties(resolve_address_posix_test PROPERTIES LINKER_LANGUAGE C) set_target_properties(resolve_address_using_ares_resolver_posix_test PROPERTIES LINKER_LANGUAGE C)
target_compile_options(resolve_address_posix_test PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${_gRPC_CORE_NOSTDCXX_FLAGS}>) target_compile_options(resolve_address_using_ares_resolver_posix_test PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${_gRPC_CORE_NOSTDCXX_FLAGS}>)
endif() endif()
endif() endif()
@ -9233,6 +9282,42 @@ target_link_libraries(resolve_address_using_ares_resolver_test
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(resolve_address_using_native_resolver_posix_test
test/core/iomgr/resolve_address_posix_test.cc
)
target_include_directories(resolve_address_using_native_resolver_posix_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}
PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR}
)
target_link_libraries(resolve_address_using_native_resolver_posix_test
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_test_util
grpc
gpr
)
# avoid dependency on libstdc++
if (_gRPC_CORE_NOSTDCXX_FLAGS)
set_target_properties(resolve_address_using_native_resolver_posix_test PROPERTIES LINKER_LANGUAGE C)
target_compile_options(resolve_address_using_native_resolver_posix_test PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${_gRPC_CORE_NOSTDCXX_FLAGS}>)
endif()
endif()
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
add_executable(resolve_address_using_native_resolver_test add_executable(resolve_address_using_native_resolver_test
test/core/iomgr/resolve_address_test.cc test/core/iomgr/resolve_address_test.cc
@ -11748,6 +11833,51 @@ target_link_libraries(bm_pollset
) )
endif()
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_executable(bm_timer
test/cpp/microbenchmarks/bm_timer.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
target_include_directories(bm_timer
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}
PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR}
PRIVATE third_party/googletest/googletest/include
PRIVATE third_party/googletest/googletest
PRIVATE third_party/googletest/googlemock/include
PRIVATE third_party/googletest/googlemock
PRIVATE ${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(bm_timer
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
grpc_benchmark
${_gRPC_BENCHMARK_LIBRARIES}
grpc++_test_util_unsecure
grpc_test_util_unsecure
grpc++_unsecure
grpc_unsecure
gpr
grpc++_test_config
${_gRPC_GFLAGS_LIBRARIES}
)
endif() endif()
endif (gRPC_BUILD_TESTS) endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS)

@ -438,8 +438,8 @@ Q = @
endif endif
CORE_VERSION = 7.0.0-dev CORE_VERSION = 7.0.0-dev
CPP_VERSION = 1.18.0-dev CPP_VERSION = 1.19.0-dev
CSHARP_VERSION = 1.18.0-dev CSHARP_VERSION = 1.19.0-dev
CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
@ -1076,11 +1076,13 @@ nanopb_fuzzer_serverlist_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test
no_server_test: $(BINDIR)/$(CONFIG)/no_server_test no_server_test: $(BINDIR)/$(CONFIG)/no_server_test
num_external_connectivity_watchers_test: $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test num_external_connectivity_watchers_test: $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test
parse_address_test: $(BINDIR)/$(CONFIG)/parse_address_test parse_address_test: $(BINDIR)/$(CONFIG)/parse_address_test
parse_address_with_named_scope_id_test: $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test
percent_decode_fuzzer: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer percent_decode_fuzzer: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer
percent_encode_fuzzer: $(BINDIR)/$(CONFIG)/percent_encode_fuzzer percent_encode_fuzzer: $(BINDIR)/$(CONFIG)/percent_encode_fuzzer
percent_encoding_test: $(BINDIR)/$(CONFIG)/percent_encoding_test percent_encoding_test: $(BINDIR)/$(CONFIG)/percent_encoding_test
resolve_address_posix_test: $(BINDIR)/$(CONFIG)/resolve_address_posix_test resolve_address_using_ares_resolver_posix_test: $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test
resolve_address_using_ares_resolver_test: $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test resolve_address_using_ares_resolver_test: $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test
resolve_address_using_native_resolver_posix_test: $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test
resolve_address_using_native_resolver_test: $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test resolve_address_using_native_resolver_test: $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test
resource_quota_test: $(BINDIR)/$(CONFIG)/resource_quota_test resource_quota_test: $(BINDIR)/$(CONFIG)/resource_quota_test
secure_channel_create_test: $(BINDIR)/$(CONFIG)/secure_channel_create_test secure_channel_create_test: $(BINDIR)/$(CONFIG)/secure_channel_create_test
@ -1150,6 +1152,7 @@ bm_fullstack_trickle: $(BINDIR)/$(CONFIG)/bm_fullstack_trickle
bm_fullstack_unary_ping_pong: $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong bm_fullstack_unary_ping_pong: $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong
bm_metadata: $(BINDIR)/$(CONFIG)/bm_metadata bm_metadata: $(BINDIR)/$(CONFIG)/bm_metadata
bm_pollset: $(BINDIR)/$(CONFIG)/bm_pollset bm_pollset: $(BINDIR)/$(CONFIG)/bm_pollset
bm_timer: $(BINDIR)/$(CONFIG)/bm_timer
byte_stream_test: $(BINDIR)/$(CONFIG)/byte_stream_test byte_stream_test: $(BINDIR)/$(CONFIG)/byte_stream_test
channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test channel_arguments_test: $(BINDIR)/$(CONFIG)/channel_arguments_test
channel_filter_test: $(BINDIR)/$(CONFIG)/channel_filter_test channel_filter_test: $(BINDIR)/$(CONFIG)/channel_filter_test
@ -1526,9 +1529,11 @@ buildtests_c: privatelibs_c \
$(BINDIR)/$(CONFIG)/no_server_test \ $(BINDIR)/$(CONFIG)/no_server_test \
$(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test \ $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test \
$(BINDIR)/$(CONFIG)/parse_address_test \ $(BINDIR)/$(CONFIG)/parse_address_test \
$(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test \
$(BINDIR)/$(CONFIG)/percent_encoding_test \ $(BINDIR)/$(CONFIG)/percent_encoding_test \
$(BINDIR)/$(CONFIG)/resolve_address_posix_test \ $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test \
$(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test \ $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test \
$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test \
$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test \ $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test \
$(BINDIR)/$(CONFIG)/resource_quota_test \ $(BINDIR)/$(CONFIG)/resource_quota_test \
$(BINDIR)/$(CONFIG)/secure_channel_create_test \ $(BINDIR)/$(CONFIG)/secure_channel_create_test \
@ -1661,6 +1666,7 @@ buildtests_cxx: privatelibs_cxx \
$(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong \ $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong \
$(BINDIR)/$(CONFIG)/bm_metadata \ $(BINDIR)/$(CONFIG)/bm_metadata \
$(BINDIR)/$(CONFIG)/bm_pollset \ $(BINDIR)/$(CONFIG)/bm_pollset \
$(BINDIR)/$(CONFIG)/bm_timer \
$(BINDIR)/$(CONFIG)/byte_stream_test \ $(BINDIR)/$(CONFIG)/byte_stream_test \
$(BINDIR)/$(CONFIG)/channel_arguments_test \ $(BINDIR)/$(CONFIG)/channel_arguments_test \
$(BINDIR)/$(CONFIG)/channel_filter_test \ $(BINDIR)/$(CONFIG)/channel_filter_test \
@ -1846,6 +1852,7 @@ buildtests_cxx: privatelibs_cxx \
$(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong \ $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong \
$(BINDIR)/$(CONFIG)/bm_metadata \ $(BINDIR)/$(CONFIG)/bm_metadata \
$(BINDIR)/$(CONFIG)/bm_pollset \ $(BINDIR)/$(CONFIG)/bm_pollset \
$(BINDIR)/$(CONFIG)/bm_timer \
$(BINDIR)/$(CONFIG)/byte_stream_test \ $(BINDIR)/$(CONFIG)/byte_stream_test \
$(BINDIR)/$(CONFIG)/channel_arguments_test \ $(BINDIR)/$(CONFIG)/channel_arguments_test \
$(BINDIR)/$(CONFIG)/channel_filter_test \ $(BINDIR)/$(CONFIG)/channel_filter_test \
@ -2126,12 +2133,16 @@ test_c: buildtests_c
$(Q) $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test || ( echo test num_external_connectivity_watchers_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test || ( echo test num_external_connectivity_watchers_test failed ; exit 1 )
$(E) "[RUN] Testing parse_address_test" $(E) "[RUN] Testing parse_address_test"
$(Q) $(BINDIR)/$(CONFIG)/parse_address_test || ( echo test parse_address_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/parse_address_test || ( echo test parse_address_test failed ; exit 1 )
$(E) "[RUN] Testing parse_address_with_named_scope_id_test"
$(Q) $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test || ( echo test parse_address_with_named_scope_id_test failed ; exit 1 )
$(E) "[RUN] Testing percent_encoding_test" $(E) "[RUN] Testing percent_encoding_test"
$(Q) $(BINDIR)/$(CONFIG)/percent_encoding_test || ( echo test percent_encoding_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/percent_encoding_test || ( echo test percent_encoding_test failed ; exit 1 )
$(E) "[RUN] Testing resolve_address_posix_test" $(E) "[RUN] Testing resolve_address_using_ares_resolver_posix_test"
$(Q) $(BINDIR)/$(CONFIG)/resolve_address_posix_test || ( echo test resolve_address_posix_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test || ( echo test resolve_address_using_ares_resolver_posix_test failed ; exit 1 )
$(E) "[RUN] Testing resolve_address_using_ares_resolver_test" $(E) "[RUN] Testing resolve_address_using_ares_resolver_test"
$(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test || ( echo test resolve_address_using_ares_resolver_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_test || ( echo test resolve_address_using_ares_resolver_test failed ; exit 1 )
$(E) "[RUN] Testing resolve_address_using_native_resolver_posix_test"
$(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test || ( echo test resolve_address_using_native_resolver_posix_test failed ; exit 1 )
$(E) "[RUN] Testing resolve_address_using_native_resolver_test" $(E) "[RUN] Testing resolve_address_using_native_resolver_test"
$(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test || ( echo test resolve_address_using_native_resolver_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_test || ( echo test resolve_address_using_native_resolver_test failed ; exit 1 )
$(E) "[RUN] Testing resource_quota_test" $(E) "[RUN] Testing resource_quota_test"
@ -2296,6 +2307,8 @@ test_cxx: buildtests_cxx
$(Q) $(BINDIR)/$(CONFIG)/bm_metadata || ( echo test bm_metadata failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/bm_metadata || ( echo test bm_metadata failed ; exit 1 )
$(E) "[RUN] Testing bm_pollset" $(E) "[RUN] Testing bm_pollset"
$(Q) $(BINDIR)/$(CONFIG)/bm_pollset || ( echo test bm_pollset failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/bm_pollset || ( echo test bm_pollset failed ; exit 1 )
$(E) "[RUN] Testing bm_timer"
$(Q) $(BINDIR)/$(CONFIG)/bm_timer || ( echo test bm_timer failed ; exit 1 )
$(E) "[RUN] Testing byte_stream_test" $(E) "[RUN] Testing byte_stream_test"
$(Q) $(BINDIR)/$(CONFIG)/byte_stream_test || ( echo test byte_stream_test failed ; exit 1 ) $(Q) $(BINDIR)/$(CONFIG)/byte_stream_test || ( echo test byte_stream_test failed ; exit 1 )
$(E) "[RUN] Testing channel_arguments_test" $(E) "[RUN] Testing channel_arguments_test"
@ -3499,6 +3512,8 @@ LIBGRPC_SRC = \
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -3510,7 +3525,6 @@ LIBGRPC_SRC = \
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \
@ -3915,6 +3929,8 @@ LIBGRPC_CRONET_SRC = \
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -3926,7 +3942,6 @@ LIBGRPC_CRONET_SRC = \
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \
@ -4314,6 +4329,8 @@ LIBGRPC_TEST_UTIL_SRC = \
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -4325,7 +4342,6 @@ LIBGRPC_TEST_UTIL_SRC = \
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \
@ -4623,6 +4639,8 @@ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -4634,7 +4652,6 @@ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \
@ -4896,6 +4913,8 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -4907,7 +4926,6 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \
@ -5758,6 +5776,8 @@ LIBGRPC++_CRONET_SRC = \
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -5769,7 +5789,6 @@ LIBGRPC++_CRONET_SRC = \
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \
@ -10354,7 +10373,6 @@ LIBEND2END_TESTS_SRC = \
test/core/end2end/tests/max_connection_idle.cc \ test/core/end2end/tests/max_connection_idle.cc \
test/core/end2end/tests/max_message_length.cc \ test/core/end2end/tests/max_message_length.cc \
test/core/end2end/tests/negative_deadline.cc \ test/core/end2end/tests/negative_deadline.cc \
test/core/end2end/tests/network_status_change.cc \
test/core/end2end/tests/no_error_on_hotpath.cc \ test/core/end2end/tests/no_error_on_hotpath.cc \
test/core/end2end/tests/no_logging.cc \ test/core/end2end/tests/no_logging.cc \
test/core/end2end/tests/no_op.cc \ test/core/end2end/tests/no_op.cc \
@ -10471,7 +10489,6 @@ LIBEND2END_NOSEC_TESTS_SRC = \
test/core/end2end/tests/max_connection_idle.cc \ test/core/end2end/tests/max_connection_idle.cc \
test/core/end2end/tests/max_message_length.cc \ test/core/end2end/tests/max_message_length.cc \
test/core/end2end/tests/negative_deadline.cc \ test/core/end2end/tests/negative_deadline.cc \
test/core/end2end/tests/network_status_change.cc \
test/core/end2end/tests/no_error_on_hotpath.cc \ test/core/end2end/tests/no_error_on_hotpath.cc \
test/core/end2end/tests/no_logging.cc \ test/core/end2end/tests/no_logging.cc \
test/core/end2end/tests/no_op.cc \ test/core/end2end/tests/no_op.cc \
@ -13983,6 +14000,38 @@ endif
endif endif
PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_SRC = \
test/core/client_channel/parse_address_with_named_scope_id_test.cc \
PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_SRC))))
ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test: openssl_dep_error
else
$(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test: $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/parse_address_with_named_scope_id_test
endif
$(OBJDIR)/$(CONFIG)/test/core/client_channel/parse_address_with_named_scope_id_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_parse_address_with_named_scope_id_test: $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true)
-include $(PARSE_ADDRESS_WITH_NAMED_SCOPE_ID_TEST_OBJS:.o=.dep)
endif
endif
PERCENT_DECODE_FUZZER_SRC = \ PERCENT_DECODE_FUZZER_SRC = \
test/core/slice/percent_decode_fuzzer.cc \ test/core/slice/percent_decode_fuzzer.cc \
@ -14079,34 +14128,34 @@ endif
endif endif
RESOLVE_ADDRESS_POSIX_TEST_SRC = \ RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_SRC = \
test/core/iomgr/resolve_address_posix_test.cc \ test/core/iomgr/resolve_address_posix_test.cc \
RESOLVE_ADDRESS_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_POSIX_TEST_SRC)))) RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_SRC))))
ifeq ($(NO_SECURE),true) ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL. # You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/resolve_address_posix_test: openssl_dep_error $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test: openssl_dep_error
else else
$(BINDIR)/$(CONFIG)/resolve_address_posix_test: $(RESOLVE_ADDRESS_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test: $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@" $(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@` $(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(RESOLVE_ADDRESS_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_posix_test $(Q) $(LD) $(LDFLAGS) $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_using_ares_resolver_posix_test
endif endif
$(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_resolve_address_posix_test: $(RESOLVE_ADDRESS_POSIX_TEST_OBJS:.o=.dep) deps_resolve_address_using_ares_resolver_posix_test: $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true) ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true) ifneq ($(NO_DEPS),true)
-include $(RESOLVE_ADDRESS_POSIX_TEST_OBJS:.o=.dep) -include $(RESOLVE_ADDRESS_USING_ARES_RESOLVER_POSIX_TEST_OBJS:.o=.dep)
endif endif
endif endif
@ -14143,6 +14192,38 @@ endif
endif endif
RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_SRC = \
test/core/iomgr/resolve_address_posix_test.cc \
RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_SRC))))
ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test: openssl_dep_error
else
$(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test: $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LD) $(LDFLAGS) $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/resolve_address_using_native_resolver_posix_test
endif
$(OBJDIR)/$(CONFIG)/test/core/iomgr/resolve_address_posix_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a
deps_resolve_address_using_native_resolver_posix_test: $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true)
-include $(RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_POSIX_TEST_OBJS:.o=.dep)
endif
endif
RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_SRC = \ RESOLVE_ADDRESS_USING_NATIVE_RESOLVER_TEST_SRC = \
test/core/iomgr/resolve_address_test.cc \ test/core/iomgr/resolve_address_test.cc \
@ -16747,6 +16828,50 @@ endif
endif endif
BM_TIMER_SRC = \
test/cpp/microbenchmarks/bm_timer.cc \
BM_TIMER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_TIMER_SRC))))
ifeq ($(NO_SECURE),true)
# You can't build secure targets if you don't have OpenSSL.
$(BINDIR)/$(CONFIG)/bm_timer: openssl_dep_error
else
ifeq ($(NO_PROTOBUF),true)
# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+.
$(BINDIR)/$(CONFIG)/bm_timer: protobuf_dep_error
else
$(BINDIR)/$(CONFIG)/bm_timer: $(PROTOBUF_DEP) $(BM_TIMER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
$(E) "[LD] Linking $@"
$(Q) mkdir -p `dirname $@`
$(Q) $(LDXX) $(LDFLAGS) $(BM_TIMER_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_timer
endif
endif
$(BM_TIMER_OBJS): CPPFLAGS += -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX
$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_timer.o: $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc++_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a
deps_bm_timer: $(BM_TIMER_OBJS:.o=.dep)
ifneq ($(NO_SECURE),true)
ifneq ($(NO_DEPS),true)
-include $(BM_TIMER_OBJS:.o=.dep)
endif
endif
BYTE_STREAM_TEST_SRC = \ BYTE_STREAM_TEST_SRC = \
test/core/transport/byte_stream_test.cc \ test/core/transport/byte_stream_test.cc \

@ -105,7 +105,7 @@ task 'dlls' do
env_comp = "CC=#{opt[:cross]}-gcc " env_comp = "CC=#{opt[:cross]}-gcc "
env_comp += "CXX=#{opt[:cross]}-g++ " env_comp += "CXX=#{opt[:cross]}-g++ "
env_comp += "LD=#{opt[:cross]}-gcc " env_comp += "LD=#{opt[:cross]}-gcc "
docker_for_windows "gem update --system --no-ri --no-doc && #{env} #{env_comp} make -j #{out} && #{opt[:cross]}-strip -x -S #{out} && cp #{out} #{opt[:out]}" docker_for_windows "gem update --system --no-document && #{env} #{env_comp} make -j #{out} && #{opt[:cross]}-strip -x -S #{out} && cp #{out} #{opt[:out]}"
end end
end end
@ -124,10 +124,10 @@ task 'gem:native' do
"invoked on macos with ruby #{RUBY_VERSION}. The ruby macos artifact " \ "invoked on macos with ruby #{RUBY_VERSION}. The ruby macos artifact " \
"build should be running on ruby 2.5." "build should be running on ruby 2.5."
end end
system "rake cross native gem RUBY_CC_VERSION=2.5.0:2.4.0:2.3.0:2.2.2:2.1.6:2.0.0 V=#{verbose} GRPC_CONFIG=#{grpc_config}" system "rake cross native gem RUBY_CC_VERSION=2.6.0:2.5.0:2.4.0:2.3.0:2.2.2 V=#{verbose} GRPC_CONFIG=#{grpc_config}"
else else
Rake::Task['dlls'].execute Rake::Task['dlls'].execute
docker_for_windows "gem update --system --no-ri --no-doc && bundle && rake cross native gem RUBY_CC_VERSION=2.5.0:2.4.0:2.3.0:2.2.2:2.1.6:2.0.0 V=#{verbose} GRPC_CONFIG=#{grpc_config}" docker_for_windows "gem update --system --no-document && bundle && rake cross native gem RUBY_CC_VERSION=2.6.0:2.5.0:2.4.0:2.3.0:2.2.2 V=#{verbose} GRPC_CONFIG=#{grpc_config}"
end end
end end

@ -1,6 +1,6 @@
"""Generates and compiles C++ grpc stubs from proto_library rules.""" """Generates and compiles C++ grpc stubs from proto_library rules."""
load("//:bazel/generate_cc.bzl", "generate_cc") load("//bazel:generate_cc.bzl", "generate_cc")
def cc_grpc_library(name, srcs, deps, proto_only, well_known_protos, generate_mocks = False, use_external = False, **kwargs): def cc_grpc_library(name, srcs, deps, proto_only, well_known_protos, generate_mocks = False, use_external = False, **kwargs):
"""Generates C++ grpc classes from a .proto file. """Generates C++ grpc classes from a .proto file.

@ -83,7 +83,7 @@ _generate_cc = rule(
attrs = { attrs = {
"srcs": attr.label_list( "srcs": attr.label_list(
mandatory = True, mandatory = True,
non_empty = True, allow_empty = False,
providers = ["proto"], providers = ["proto"],
), ),
"plugin": attr.label( "plugin": attr.label(

@ -23,6 +23,8 @@
# each change must be ported from one to the other. # each change must be ported from one to the other.
# #
load("//bazel:cc_grpc_library.bzl", "cc_grpc_library")
# The set of pollers to test against if a test exercises polling # The set of pollers to test against if a test exercises polling
POLLERS = ["epollex", "epoll1", "poll", "poll-cv"] POLLERS = ["epollex", "epoll1", "poll", "poll-cv"]
@ -111,7 +113,6 @@ def grpc_proto_plugin(name, srcs = [], deps = []):
deps = deps, deps = deps,
) )
load("//:bazel/cc_grpc_library.bzl", "cc_grpc_library")
def grpc_proto_library( def grpc_proto_library(
name, name,

@ -93,17 +93,17 @@ def grpc_deps():
native.bind( native.bind(
name = "opencensus-trace", name = "opencensus-trace",
actual = "@io_opencensus_cpp//opencensus/trace:trace" actual = "@io_opencensus_cpp//opencensus/trace:trace",
) )
native.bind( native.bind(
name = "opencensus-stats", name = "opencensus-stats",
actual = "@io_opencensus_cpp//opencensus/stats:stats" actual = "@io_opencensus_cpp//opencensus/stats:stats",
) )
native.bind( native.bind(
name = "opencensus-stats-test", name = "opencensus-stats-test",
actual = "@io_opencensus_cpp//opencensus/stats:test_utils" actual = "@io_opencensus_cpp//opencensus/stats:test_utils",
) )
if "boringssl" not in native.existing_rules(): if "boringssl" not in native.existing_rules():
@ -124,8 +124,8 @@ def grpc_deps():
if "com_google_protobuf" not in native.existing_rules(): if "com_google_protobuf" not in native.existing_rules():
http_archive( http_archive(
name = "com_google_protobuf", name = "com_google_protobuf",
strip_prefix = "protobuf-48cb18e5c419ddd23d9badcfe4e9df7bde1979b2", strip_prefix = "protobuf-66dc42d891a4fc8e9190c524fd67961688a37bbe",
url = "https://github.com/google/protobuf/archive/48cb18e5c419ddd23d9badcfe4e9df7bde1979b2.tar.gz", url = "https://github.com/google/protobuf/archive/66dc42d891a4fc8e9190c524fd67961688a37bbe.tar.gz",
) )
if "com_github_nanopb_nanopb" not in native.existing_rules(): if "com_github_nanopb_nanopb" not in native.existing_rules():
@ -177,16 +177,16 @@ def grpc_deps():
if "com_github_bazelbuild_bazeltoolchains" not in native.existing_rules(): if "com_github_bazelbuild_bazeltoolchains" not in native.existing_rules():
http_archive( http_archive(
name = "com_github_bazelbuild_bazeltoolchains", name = "com_github_bazelbuild_bazeltoolchains",
strip_prefix = "bazel-toolchains-280edaa6f93623074513d2b426068de42e62ea4d", strip_prefix = "bazel-toolchains-37419a124bdb9af2fec5b99a973d359b6b899b61",
urls = [ urls = [
"https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/280edaa6f93623074513d2b426068de42e62ea4d.tar.gz", "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/37419a124bdb9af2fec5b99a973d359b6b899b61.tar.gz",
"https://github.com/bazelbuild/bazel-toolchains/archive/280edaa6f93623074513d2b426068de42e62ea4d.tar.gz", "https://github.com/bazelbuild/bazel-toolchains/archive/37419a124bdb9af2fec5b99a973d359b6b899b61.tar.gz",
], ],
sha256 = "50c9df51f80cdf9ff8f2bc27620c155526b9ba67be95e8a686f32ff8898a06e2", sha256 = "ee854b5de299138c1f4a2edb5573d22b21d975acfc7aa938f36d30b49ef97498",
) )
if "io_opencensus_cpp" not in native.existing_rules(): if "io_opencensus_cpp" not in native.existing_rules():
http_archive( http_archive(
name = "io_opencensus_cpp", name = "io_opencensus_cpp",
strip_prefix = "opencensus-cpp-fdf0f308b1631bb4a942e32ba5d22536a6170274", strip_prefix = "opencensus-cpp-fdf0f308b1631bb4a942e32ba5d22536a6170274",
url = "https://github.com/census-instrumentation/opencensus-cpp/archive/fdf0f308b1631bb4a942e32ba5d22536a6170274.tar.gz", url = "https://github.com/census-instrumentation/opencensus-cpp/archive/fdf0f308b1631bb4a942e32ba5d22536a6170274.tar.gz",
@ -199,7 +199,6 @@ def grpc_deps():
url = "https://github.com/google/upb/archive/9ce4a77f61c134bbed28bfd5be5cd7dc0e80f5e3.tar.gz", url = "https://github.com/google/upb/archive/9ce4a77f61c134bbed28bfd5be5cd7dc0e80f5e3.tar.gz",
) )
# TODO: move some dependencies from "grpc_deps" here? # TODO: move some dependencies from "grpc_deps" here?
def grpc_test_only_deps(): def grpc_test_only_deps():
"""Internal, not intended for use by packages that are consuming grpc. """Internal, not intended for use by packages that are consuming grpc.

@ -13,8 +13,8 @@ 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: 7.0.0-dev core_version: 7.0.0-dev
g_stands_for: goose g_stands_for: gold
version: 1.18.0-dev version: 1.19.0-dev
filegroups: filegroups:
- name: alts_proto - name: alts_proto
headers: headers:
@ -276,6 +276,8 @@ filegroups:
- src/core/lib/iomgr/gethostname_fallback.cc - src/core/lib/iomgr/gethostname_fallback.cc
- src/core/lib/iomgr/gethostname_host_name_max.cc - src/core/lib/iomgr/gethostname_host_name_max.cc
- src/core/lib/iomgr/gethostname_sysconf.cc - src/core/lib/iomgr/gethostname_sysconf.cc
- src/core/lib/iomgr/grpc_if_nametoindex_posix.cc
- src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc
- src/core/lib/iomgr/internal_errqueue.cc - src/core/lib/iomgr/internal_errqueue.cc
- src/core/lib/iomgr/iocp_windows.cc - src/core/lib/iomgr/iocp_windows.cc
- src/core/lib/iomgr/iomgr.cc - src/core/lib/iomgr/iomgr.cc
@ -287,7 +289,6 @@ filegroups:
- src/core/lib/iomgr/is_epollexclusive_available.cc - src/core/lib/iomgr/is_epollexclusive_available.cc
- src/core/lib/iomgr/load_file.cc - src/core/lib/iomgr/load_file.cc
- src/core/lib/iomgr/lockfree_event.cc - src/core/lib/iomgr/lockfree_event.cc
- src/core/lib/iomgr/network_status_tracker.cc
- src/core/lib/iomgr/polling_entity.cc - src/core/lib/iomgr/polling_entity.cc
- src/core/lib/iomgr/pollset.cc - src/core/lib/iomgr/pollset.cc
- src/core/lib/iomgr/pollset_custom.cc - src/core/lib/iomgr/pollset_custom.cc
@ -452,6 +453,7 @@ filegroups:
- src/core/lib/iomgr/exec_ctx.h - src/core/lib/iomgr/exec_ctx.h
- src/core/lib/iomgr/executor.h - src/core/lib/iomgr/executor.h
- src/core/lib/iomgr/gethostname.h - src/core/lib/iomgr/gethostname.h
- src/core/lib/iomgr/grpc_if_nametoindex.h
- src/core/lib/iomgr/internal_errqueue.h - src/core/lib/iomgr/internal_errqueue.h
- src/core/lib/iomgr/iocp_windows.h - src/core/lib/iomgr/iocp_windows.h
- src/core/lib/iomgr/iomgr.h - src/core/lib/iomgr/iomgr.h
@ -462,7 +464,6 @@ filegroups:
- src/core/lib/iomgr/load_file.h - src/core/lib/iomgr/load_file.h
- src/core/lib/iomgr/lockfree_event.h - src/core/lib/iomgr/lockfree_event.h
- src/core/lib/iomgr/nameser.h - src/core/lib/iomgr/nameser.h
- src/core/lib/iomgr/network_status_tracker.h
- src/core/lib/iomgr/polling_entity.h - src/core/lib/iomgr/polling_entity.h
- src/core/lib/iomgr/pollset.h - src/core/lib/iomgr/pollset.h
- src/core/lib/iomgr/pollset_custom.h - src/core/lib/iomgr/pollset_custom.h
@ -3241,6 +3242,20 @@ targets:
- grpc - grpc
- gpr - gpr
uses_polling: false uses_polling: false
- name: parse_address_with_named_scope_id_test
build: test
language: c
src:
- test/core/client_channel/parse_address_with_named_scope_id_test.cc
deps:
- grpc_test_util
- grpc
- gpr
platforms:
- mac
- linux
- posix
uses_polling: false
- name: percent_decode_fuzzer - name: percent_decode_fuzzer
build: fuzzer build: fuzzer
language: c language: c
@ -3275,7 +3290,7 @@ targets:
- grpc - grpc
- gpr - gpr
uses_polling: false uses_polling: false
- name: resolve_address_posix_test - name: resolve_address_using_ares_resolver_posix_test
build: test build: test
language: c language: c
src: src:
@ -3284,6 +3299,8 @@ targets:
- grpc_test_util - grpc_test_util
- grpc - grpc
- gpr - gpr
args:
- --resolver=ares
exclude_iomgrs: exclude_iomgrs:
- uv - uv
platforms: platforms:
@ -3301,6 +3318,23 @@ targets:
- gpr - gpr
args: args:
- --resolver=ares - --resolver=ares
- name: resolve_address_using_native_resolver_posix_test
build: test
language: c
src:
- test/core/iomgr/resolve_address_posix_test.cc
deps:
- grpc_test_util
- grpc
- gpr
args:
- --resolver=native
exclude_iomgrs:
- uv
platforms:
- mac
- linux
- posix
- name: resolve_address_using_native_resolver_test - name: resolve_address_using_native_resolver_test
build: test build: test
language: c language: c
@ -4230,6 +4264,27 @@ targets:
- mac - mac
- linux - linux
- posix - posix
- name: bm_timer
build: test
language: c++
src:
- test/cpp/microbenchmarks/bm_timer.cc
deps:
- grpc_benchmark
- benchmark
- grpc++_test_util_unsecure
- grpc_test_util_unsecure
- grpc++_unsecure
- grpc_unsecure
- gpr
- grpc++_test_config
benchmark: true
defaults: benchmark
platforms:
- mac
- linux
- posix
uses_polling: false
- name: byte_stream_test - name: byte_stream_test
gtest: true gtest: true
build: test build: test

@ -128,6 +128,8 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/iomgr/gethostname_fallback.cc \ src/core/lib/iomgr/gethostname_fallback.cc \
src/core/lib/iomgr/gethostname_host_name_max.cc \ src/core/lib/iomgr/gethostname_host_name_max.cc \
src/core/lib/iomgr/gethostname_sysconf.cc \ src/core/lib/iomgr/gethostname_sysconf.cc \
src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \
src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \
src/core/lib/iomgr/internal_errqueue.cc \ src/core/lib/iomgr/internal_errqueue.cc \
src/core/lib/iomgr/iocp_windows.cc \ src/core/lib/iomgr/iocp_windows.cc \
src/core/lib/iomgr/iomgr.cc \ src/core/lib/iomgr/iomgr.cc \
@ -139,7 +141,6 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/iomgr/is_epollexclusive_available.cc \ src/core/lib/iomgr/is_epollexclusive_available.cc \
src/core/lib/iomgr/load_file.cc \ src/core/lib/iomgr/load_file.cc \
src/core/lib/iomgr/lockfree_event.cc \ src/core/lib/iomgr/lockfree_event.cc \
src/core/lib/iomgr/network_status_tracker.cc \
src/core/lib/iomgr/polling_entity.cc \ src/core/lib/iomgr/polling_entity.cc \
src/core/lib/iomgr/pollset.cc \ src/core/lib/iomgr/pollset.cc \
src/core/lib/iomgr/pollset_custom.cc \ src/core/lib/iomgr/pollset_custom.cc \

@ -103,6 +103,8 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\iomgr\\gethostname_fallback.cc " + "src\\core\\lib\\iomgr\\gethostname_fallback.cc " +
"src\\core\\lib\\iomgr\\gethostname_host_name_max.cc " + "src\\core\\lib\\iomgr\\gethostname_host_name_max.cc " +
"src\\core\\lib\\iomgr\\gethostname_sysconf.cc " + "src\\core\\lib\\iomgr\\gethostname_sysconf.cc " +
"src\\core\\lib\\iomgr\\grpc_if_nametoindex_posix.cc " +
"src\\core\\lib\\iomgr\\grpc_if_nametoindex_unsupported.cc " +
"src\\core\\lib\\iomgr\\internal_errqueue.cc " + "src\\core\\lib\\iomgr\\internal_errqueue.cc " +
"src\\core\\lib\\iomgr\\iocp_windows.cc " + "src\\core\\lib\\iomgr\\iocp_windows.cc " +
"src\\core\\lib\\iomgr\\iomgr.cc " + "src\\core\\lib\\iomgr\\iomgr.cc " +
@ -114,7 +116,6 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\iomgr\\is_epollexclusive_available.cc " + "src\\core\\lib\\iomgr\\is_epollexclusive_available.cc " +
"src\\core\\lib\\iomgr\\load_file.cc " + "src\\core\\lib\\iomgr\\load_file.cc " +
"src\\core\\lib\\iomgr\\lockfree_event.cc " + "src\\core\\lib\\iomgr\\lockfree_event.cc " +
"src\\core\\lib\\iomgr\\network_status_tracker.cc " +
"src\\core\\lib\\iomgr\\polling_entity.cc " + "src\\core\\lib\\iomgr\\polling_entity.cc " +
"src\\core\\lib\\iomgr\\pollset.cc " + "src\\core\\lib\\iomgr\\pollset.cc " +
"src\\core\\lib\\iomgr\\pollset_custom.cc " + "src\\core\\lib\\iomgr\\pollset_custom.cc " +

@ -17,4 +17,5 @@
- 1.15 'g' stands for ['glider'](https://github.com/grpc/grpc/tree/v1.15.x) - 1.15 'g' stands for ['glider'](https://github.com/grpc/grpc/tree/v1.15.x)
- 1.16 'g' stands for ['gao'](https://github.com/grpc/grpc/tree/v1.16.x) - 1.16 'g' stands for ['gao'](https://github.com/grpc/grpc/tree/v1.16.x)
- 1.17 'g' stands for ['gizmo'](https://github.com/grpc/grpc/tree/v1.17.x) - 1.17 'g' stands for ['gizmo'](https://github.com/grpc/grpc/tree/v1.17.x)
- 1.18 'g' stands for ['goose'](https://github.com/grpc/grpc/tree/master) - 1.18 'g' stands for ['goose'](https://github.com/grpc/grpc/tree/v1.18.x)
- 1.19 'g' stands for ['gold'](https://github.com/grpc/grpc/tree/master)

@ -19,6 +19,11 @@ Go to `gRPC Python Examples <https://github.com/grpc/grpc/tree/master/examples/p
Module Contents Module Contents
--------------- ---------------
Version
^^^^^^^
The version string is available as :code:`grpc.__version__`.
Create Client Create Client
^^^^^^^^^^^^^ ^^^^^^^^^^^^^

@ -38,6 +38,11 @@ grpc_proto_library(
srcs = ["protos/route_guide.proto"], srcs = ["protos/route_guide.proto"],
) )
grpc_proto_library(
name = "keyvaluestore",
srcs = ["protos/keyvaluestore.proto"],
)
cc_binary( cc_binary(
name = "greeter_client", name = "greeter_client",
srcs = ["cpp/helloworld/greeter_client.cc"], srcs = ["cpp/helloworld/greeter_client.cc"],
@ -93,3 +98,17 @@ cc_binary(
defines = ["BAZEL_BUILD"], defines = ["BAZEL_BUILD"],
deps = [":helloworld", "//:grpc++"], deps = [":helloworld", "//:grpc++"],
) )
cc_binary(
name = "keyvaluestore_client",
srcs = ["cpp/keyvaluestore/client.cc"],
defines = ["BAZEL_BUILD"],
deps = [":keyvaluestore", "//:grpc++"],
)
cc_binary(
name = "keyvaluestore_server",
srcs = ["cpp/keyvaluestore/server.cc"],
defines = ["BAZEL_BUILD"],
deps = [":keyvaluestore", "//:grpc++"],
)

@ -0,0 +1,86 @@
/*
*
* Copyright 2018 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 <iostream>
#include <memory>
#include <string>
#include <vector>
#include <grpcpp/grpcpp.h>
#ifdef BAZEL_BUILD
#include "examples/protos/keyvaluestore.grpc.pb.h"
#else
#include "keyvaluestore.grpc.pb.h"
#endif
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using keyvaluestore::KeyValueStore;
using keyvaluestore::Request;
using keyvaluestore::Response;
class KeyValueStoreClient {
public:
KeyValueStoreClient(std::shared_ptr<Channel> channel)
: stub_(KeyValueStore::NewStub(channel)) {}
// Requests each key in the vector and displays the key and its corresponding
// value as a pair
void GetValues(const std::vector<std::string>& keys) {
// Context for the client. It could be used to convey extra information to
// the server and/or tweak certain RPC behaviors.
ClientContext context;
auto stream = stub_->GetValues(&context);
for (const auto& key : keys) {
// Key we are sending to the server.
Request request;
request.set_key(key);
stream->Write(request);
// Get the value for the sent key
Response response;
stream->Read(&response);
std::cout << key << " : " << response.value() << "\n";
}
stream->WritesDone();
Status status = stream->Finish();
if (!status.ok()) {
std::cout << status.error_code() << ": " << status.error_message()
<< std::endl;
std::cout << "RPC failed";
}
}
private:
std::unique_ptr<KeyValueStore::Stub> stub_;
};
int main(int argc, char** argv) {
// Instantiate the client. It requires a channel, out of which the actual RPCs
// are created. This channel models a connection to an endpoint (in this case,
// localhost at port 50051). We indicate that the channel isn't authenticated
// (use of InsecureChannelCredentials()).
KeyValueStoreClient client(grpc::CreateChannel(
"localhost:50051", grpc::InsecureChannelCredentials()));
std::vector<std::string> keys = {"key1", "key2", "key3", "key4", "key5"};
client.GetValues(keys);
return 0;
}

@ -0,0 +1,97 @@
/*
*
* Copyright 2018 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 <iostream>
#include <memory>
#include <string>
#include <vector>
#include <grpcpp/grpcpp.h>
#ifdef BAZEL_BUILD
#include "examples/protos/keyvaluestore.grpc.pb.h"
#else
#include "keyvaluestore.grpc.pb.h"
#endif
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::ServerReaderWriter;
using grpc::Status;
using keyvaluestore::KeyValueStore;
using keyvaluestore::Request;
using keyvaluestore::Response;
struct kv_pair {
const char* key;
const char* value;
};
static const kv_pair kvs_map[] = {
{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"},
{"key4", "value4"}, {"key5", "value5"},
};
const char* get_value_from_map(const char* key) {
for (size_t i = 0; i < sizeof(kvs_map) / sizeof(kv_pair); ++i) {
if (strcmp(key, kvs_map[i].key) == 0) {
return kvs_map[i].value;
}
}
return "";
}
// Logic and data behind the server's behavior.
class KeyValueStoreServiceImpl final : public KeyValueStore::Service {
Status GetValues(ServerContext* context,
ServerReaderWriter<Response, Request>* stream) override {
Request request;
while (stream->Read(&request)) {
Response response;
response.set_value(get_value_from_map(request.key().c_str()));
stream->Write(response);
}
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50051");
KeyValueStoreServiceImpl service;
ServerBuilder builder;
// Listen on the given address without any authentication mechanism.
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
// Register "service" as the instance through which we'll communicate with
// clients. In this case, it corresponds to an *synchronous* service.
builder.RegisterService(&service);
// Finally assemble the server.
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
// Wait for the server to shutdown. Note that some other thread must be
// responsible for shutting down the server for this call to ever return.
server->Wait();
}
int main(int argc, char** argv) {
RunServer();
return 0;
}

@ -0,0 +1,33 @@
// Copyright 2018 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.
syntax = "proto3";
package keyvaluestore;
// A simple key-value storage service
service KeyValueStore {
// Provides a value for each key request
rpc GetValues (stream Request) returns (stream Response) {}
}
// The request message containing the key
message Request {
string key = 1;
}
// The response message containing the value associated with the key
message Response {
string value = 1;
}

@ -11,7 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
"""The Python implementation of the GRPC helloworld.Greeter client with channel options and call timeout parameters.""" """gRPC Python helloworld.Greeter client with channel options and call timeout parameters."""
from __future__ import print_function from __future__ import print_function
import logging import logging

@ -39,7 +39,10 @@ def main
s = GRPC::RpcServer.new s = GRPC::RpcServer.new
s.add_http2_port('0.0.0.0:50051', :this_port_is_insecure) s.add_http2_port('0.0.0.0:50051', :this_port_is_insecure)
s.handle(GreeterServer) s.handle(GreeterServer)
s.run_till_terminated # Runs the server with SIGHUP, SIGINT and SIGQUIT signal handlers to
# gracefully shutdown.
# User could also choose to run server via call to run_till_terminated
s.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT'])
end end
main main

@ -172,7 +172,10 @@ def main
s.add_http2_port(port, :this_port_is_insecure) s.add_http2_port(port, :this_port_is_insecure)
GRPC.logger.info("... running insecurely on #{port}") GRPC.logger.info("... running insecurely on #{port}")
s.handle(ServerImpl.new(feature_db)) s.handle(ServerImpl.new(feature_db))
s.run_till_terminated # Runs the server with SIGHUP, SIGINT and SIGQUIT signal handlers to
# gracefully shutdown.
# User could also choose to run server via call to run_till_terminated
s.run_till_terminated_or_interrupted([1, 'int', 'SIGQUIT'])
end end
main main

@ -23,7 +23,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'gRPC-C++' s.name = 'gRPC-C++'
# TODO (mxyan): use version that match gRPC version when pod is stabilized # TODO (mxyan): use version that match gRPC version when pod is stabilized
# version = '1.18.0-dev' # version = '1.19.0-dev'
version = '0.0.6-dev' version = '0.0.6-dev'
s.version = version s.version = version
s.summary = 'gRPC C++ library' s.summary = 'gRPC C++ library'
@ -31,7 +31,7 @@ Pod::Spec.new do |s|
s.license = 'Apache License, Version 2.0' s.license = 'Apache License, Version 2.0'
s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' } s.authors = { 'The gRPC contributors' => 'grpc-packages@google.com' }
grpc_version = '1.18.0-dev' grpc_version = '1.19.0-dev'
s.source = { s.source = {
:git => 'https://github.com/grpc/grpc.git', :git => 'https://github.com/grpc/grpc.git',
@ -423,6 +423,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/exec_ctx.h', 'src/core/lib/iomgr/exec_ctx.h',
'src/core/lib/iomgr/executor.h', 'src/core/lib/iomgr/executor.h',
'src/core/lib/iomgr/gethostname.h', 'src/core/lib/iomgr/gethostname.h',
'src/core/lib/iomgr/grpc_if_nametoindex.h',
'src/core/lib/iomgr/internal_errqueue.h', 'src/core/lib/iomgr/internal_errqueue.h',
'src/core/lib/iomgr/iocp_windows.h', 'src/core/lib/iomgr/iocp_windows.h',
'src/core/lib/iomgr/iomgr.h', 'src/core/lib/iomgr/iomgr.h',
@ -433,7 +434,6 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/load_file.h', 'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h', 'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/iomgr/nameser.h', 'src/core/lib/iomgr/nameser.h',
'src/core/lib/iomgr/network_status_tracker.h',
'src/core/lib/iomgr/polling_entity.h', 'src/core/lib/iomgr/polling_entity.h',
'src/core/lib/iomgr/pollset.h', 'src/core/lib/iomgr/pollset.h',
'src/core/lib/iomgr/pollset_custom.h', 'src/core/lib/iomgr/pollset_custom.h',
@ -616,6 +616,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/exec_ctx.h', 'src/core/lib/iomgr/exec_ctx.h',
'src/core/lib/iomgr/executor.h', 'src/core/lib/iomgr/executor.h',
'src/core/lib/iomgr/gethostname.h', 'src/core/lib/iomgr/gethostname.h',
'src/core/lib/iomgr/grpc_if_nametoindex.h',
'src/core/lib/iomgr/internal_errqueue.h', 'src/core/lib/iomgr/internal_errqueue.h',
'src/core/lib/iomgr/iocp_windows.h', 'src/core/lib/iomgr/iocp_windows.h',
'src/core/lib/iomgr/iomgr.h', 'src/core/lib/iomgr/iomgr.h',
@ -626,7 +627,6 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/load_file.h', 'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h', 'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/iomgr/nameser.h', 'src/core/lib/iomgr/nameser.h',
'src/core/lib/iomgr/network_status_tracker.h',
'src/core/lib/iomgr/polling_entity.h', 'src/core/lib/iomgr/polling_entity.h',
'src/core/lib/iomgr/pollset.h', 'src/core/lib/iomgr/pollset.h',
'src/core/lib/iomgr/pollset_custom.h', 'src/core/lib/iomgr/pollset_custom.h',

@ -22,7 +22,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'gRPC-Core' s.name = 'gRPC-Core'
version = '1.18.0-dev' version = '1.19.0-dev'
s.version = version s.version = version
s.summary = 'Core cross-platform gRPC library, written in C' s.summary = 'Core cross-platform gRPC library, written in C'
s.homepage = 'https://grpc.io' s.homepage = 'https://grpc.io'
@ -93,7 +93,7 @@ Pod::Spec.new do |s|
} }
s.default_subspecs = 'Interface', 'Implementation' s.default_subspecs = 'Interface', 'Implementation'
s.compiler_flags = '-DGRPC_ARES=0', '-DPB_FIELD_16BIT' s.compiler_flags = '-DGRPC_ARES=0', '-DPB_FIELD_32BIT'
s.libraries = 'c++' s.libraries = 'c++'
# Like many other C libraries, gRPC-Core has its public headers under `include/<libname>/` and its # Like many other C libraries, gRPC-Core has its public headers under `include/<libname>/` and its
@ -417,6 +417,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/exec_ctx.h', 'src/core/lib/iomgr/exec_ctx.h',
'src/core/lib/iomgr/executor.h', 'src/core/lib/iomgr/executor.h',
'src/core/lib/iomgr/gethostname.h', 'src/core/lib/iomgr/gethostname.h',
'src/core/lib/iomgr/grpc_if_nametoindex.h',
'src/core/lib/iomgr/internal_errqueue.h', 'src/core/lib/iomgr/internal_errqueue.h',
'src/core/lib/iomgr/iocp_windows.h', 'src/core/lib/iomgr/iocp_windows.h',
'src/core/lib/iomgr/iomgr.h', 'src/core/lib/iomgr/iomgr.h',
@ -427,7 +428,6 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/load_file.h', 'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h', 'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/iomgr/nameser.h', 'src/core/lib/iomgr/nameser.h',
'src/core/lib/iomgr/network_status_tracker.h',
'src/core/lib/iomgr/polling_entity.h', 'src/core/lib/iomgr/polling_entity.h',
'src/core/lib/iomgr/pollset.h', 'src/core/lib/iomgr/pollset.h',
'src/core/lib/iomgr/pollset_custom.h', 'src/core/lib/iomgr/pollset_custom.h',
@ -571,6 +571,8 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/gethostname_fallback.cc', 'src/core/lib/iomgr/gethostname_fallback.cc',
'src/core/lib/iomgr/gethostname_host_name_max.cc', 'src/core/lib/iomgr/gethostname_host_name_max.cc',
'src/core/lib/iomgr/gethostname_sysconf.cc', 'src/core/lib/iomgr/gethostname_sysconf.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc',
'src/core/lib/iomgr/internal_errqueue.cc', 'src/core/lib/iomgr/internal_errqueue.cc',
'src/core/lib/iomgr/iocp_windows.cc', 'src/core/lib/iomgr/iocp_windows.cc',
'src/core/lib/iomgr/iomgr.cc', 'src/core/lib/iomgr/iomgr.cc',
@ -582,7 +584,6 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/is_epollexclusive_available.cc', 'src/core/lib/iomgr/is_epollexclusive_available.cc',
'src/core/lib/iomgr/load_file.cc', 'src/core/lib/iomgr/load_file.cc',
'src/core/lib/iomgr/lockfree_event.cc', 'src/core/lib/iomgr/lockfree_event.cc',
'src/core/lib/iomgr/network_status_tracker.cc',
'src/core/lib/iomgr/polling_entity.cc', 'src/core/lib/iomgr/polling_entity.cc',
'src/core/lib/iomgr/pollset.cc', 'src/core/lib/iomgr/pollset.cc',
'src/core/lib/iomgr/pollset_custom.cc', 'src/core/lib/iomgr/pollset_custom.cc',
@ -1040,6 +1041,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/exec_ctx.h', 'src/core/lib/iomgr/exec_ctx.h',
'src/core/lib/iomgr/executor.h', 'src/core/lib/iomgr/executor.h',
'src/core/lib/iomgr/gethostname.h', 'src/core/lib/iomgr/gethostname.h',
'src/core/lib/iomgr/grpc_if_nametoindex.h',
'src/core/lib/iomgr/internal_errqueue.h', 'src/core/lib/iomgr/internal_errqueue.h',
'src/core/lib/iomgr/iocp_windows.h', 'src/core/lib/iomgr/iocp_windows.h',
'src/core/lib/iomgr/iomgr.h', 'src/core/lib/iomgr/iomgr.h',
@ -1050,7 +1052,6 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/load_file.h', 'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h', 'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/iomgr/nameser.h', 'src/core/lib/iomgr/nameser.h',
'src/core/lib/iomgr/network_status_tracker.h',
'src/core/lib/iomgr/polling_entity.h', 'src/core/lib/iomgr/polling_entity.h',
'src/core/lib/iomgr/pollset.h', 'src/core/lib/iomgr/pollset.h',
'src/core/lib/iomgr/pollset_custom.h', 'src/core/lib/iomgr/pollset_custom.h',
@ -1296,7 +1297,6 @@ Pod::Spec.new do |s|
'test/core/end2end/tests/max_connection_idle.cc', 'test/core/end2end/tests/max_connection_idle.cc',
'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/max_message_length.cc',
'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/negative_deadline.cc',
'test/core/end2end/tests/network_status_change.cc',
'test/core/end2end/tests/no_error_on_hotpath.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc',
'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_logging.cc',
'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/no_op.cc',

@ -21,7 +21,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'gRPC-ProtoRPC' s.name = 'gRPC-ProtoRPC'
version = '1.18.0-dev' version = '1.19.0-dev'
s.version = version s.version = version
s.summary = 'RPC library for Protocol Buffers, based on gRPC' s.summary = 'RPC library for Protocol Buffers, based on gRPC'
s.homepage = 'https://grpc.io' s.homepage = 'https://grpc.io'

@ -21,7 +21,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'gRPC-RxLibrary' s.name = 'gRPC-RxLibrary'
version = '1.18.0-dev' version = '1.19.0-dev'
s.version = version s.version = version
s.summary = 'Reactive Extensions library for iOS/OSX.' s.summary = 'Reactive Extensions library for iOS/OSX.'
s.homepage = 'https://grpc.io' s.homepage = 'https://grpc.io'

@ -20,7 +20,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'gRPC' s.name = 'gRPC'
version = '1.18.0-dev' version = '1.19.0-dev'
s.version = version s.version = version
s.summary = 'gRPC client library for iOS/OSX' s.summary = 'gRPC client library for iOS/OSX'
s.homepage = 'https://grpc.io' s.homepage = 'https://grpc.io'
@ -58,7 +58,7 @@ Pod::Spec.new do |s|
ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}" ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
ss.exclude_files = "#{src_dir}/GRPCCall+GID.{h,m}" ss.exclude_files = "#{src_dir}/GRPCCall+GID.{h,m}"
ss.private_header_files = "#{src_dir}/private/*.h" ss.private_header_files = "#{src_dir}/private/*.h", "#{src_dir}/internal/*.h"
ss.dependency 'gRPC-Core', version ss.dependency 'gRPC-Core', version
end end

@ -353,6 +353,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/exec_ctx.h ) s.files += %w( src/core/lib/iomgr/exec_ctx.h )
s.files += %w( src/core/lib/iomgr/executor.h ) s.files += %w( src/core/lib/iomgr/executor.h )
s.files += %w( src/core/lib/iomgr/gethostname.h ) s.files += %w( src/core/lib/iomgr/gethostname.h )
s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex.h )
s.files += %w( src/core/lib/iomgr/internal_errqueue.h ) s.files += %w( src/core/lib/iomgr/internal_errqueue.h )
s.files += %w( src/core/lib/iomgr/iocp_windows.h ) s.files += %w( src/core/lib/iomgr/iocp_windows.h )
s.files += %w( src/core/lib/iomgr/iomgr.h ) s.files += %w( src/core/lib/iomgr/iomgr.h )
@ -363,7 +364,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/load_file.h ) s.files += %w( src/core/lib/iomgr/load_file.h )
s.files += %w( src/core/lib/iomgr/lockfree_event.h ) s.files += %w( src/core/lib/iomgr/lockfree_event.h )
s.files += %w( src/core/lib/iomgr/nameser.h ) s.files += %w( src/core/lib/iomgr/nameser.h )
s.files += %w( src/core/lib/iomgr/network_status_tracker.h )
s.files += %w( src/core/lib/iomgr/polling_entity.h ) s.files += %w( src/core/lib/iomgr/polling_entity.h )
s.files += %w( src/core/lib/iomgr/pollset.h ) s.files += %w( src/core/lib/iomgr/pollset.h )
s.files += %w( src/core/lib/iomgr/pollset_custom.h ) s.files += %w( src/core/lib/iomgr/pollset_custom.h )
@ -507,6 +507,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/gethostname_fallback.cc ) s.files += %w( src/core/lib/iomgr/gethostname_fallback.cc )
s.files += %w( src/core/lib/iomgr/gethostname_host_name_max.cc ) s.files += %w( src/core/lib/iomgr/gethostname_host_name_max.cc )
s.files += %w( src/core/lib/iomgr/gethostname_sysconf.cc ) s.files += %w( src/core/lib/iomgr/gethostname_sysconf.cc )
s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_posix.cc )
s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc )
s.files += %w( src/core/lib/iomgr/internal_errqueue.cc ) s.files += %w( src/core/lib/iomgr/internal_errqueue.cc )
s.files += %w( src/core/lib/iomgr/iocp_windows.cc ) s.files += %w( src/core/lib/iomgr/iocp_windows.cc )
s.files += %w( src/core/lib/iomgr/iomgr.cc ) s.files += %w( src/core/lib/iomgr/iomgr.cc )
@ -518,7 +520,6 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.cc ) s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.cc )
s.files += %w( src/core/lib/iomgr/load_file.cc ) s.files += %w( src/core/lib/iomgr/load_file.cc )
s.files += %w( src/core/lib/iomgr/lockfree_event.cc ) s.files += %w( src/core/lib/iomgr/lockfree_event.cc )
s.files += %w( src/core/lib/iomgr/network_status_tracker.cc )
s.files += %w( src/core/lib/iomgr/polling_entity.cc ) s.files += %w( src/core/lib/iomgr/polling_entity.cc )
s.files += %w( src/core/lib/iomgr/pollset.cc ) s.files += %w( src/core/lib/iomgr/pollset.cc )
s.files += %w( src/core/lib/iomgr/pollset_custom.cc ) s.files += %w( src/core/lib/iomgr/pollset_custom.cc )

@ -310,6 +310,8 @@
'src/core/lib/iomgr/gethostname_fallback.cc', 'src/core/lib/iomgr/gethostname_fallback.cc',
'src/core/lib/iomgr/gethostname_host_name_max.cc', 'src/core/lib/iomgr/gethostname_host_name_max.cc',
'src/core/lib/iomgr/gethostname_sysconf.cc', 'src/core/lib/iomgr/gethostname_sysconf.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc',
'src/core/lib/iomgr/internal_errqueue.cc', 'src/core/lib/iomgr/internal_errqueue.cc',
'src/core/lib/iomgr/iocp_windows.cc', 'src/core/lib/iomgr/iocp_windows.cc',
'src/core/lib/iomgr/iomgr.cc', 'src/core/lib/iomgr/iomgr.cc',
@ -321,7 +323,6 @@
'src/core/lib/iomgr/is_epollexclusive_available.cc', 'src/core/lib/iomgr/is_epollexclusive_available.cc',
'src/core/lib/iomgr/load_file.cc', 'src/core/lib/iomgr/load_file.cc',
'src/core/lib/iomgr/lockfree_event.cc', 'src/core/lib/iomgr/lockfree_event.cc',
'src/core/lib/iomgr/network_status_tracker.cc',
'src/core/lib/iomgr/polling_entity.cc', 'src/core/lib/iomgr/polling_entity.cc',
'src/core/lib/iomgr/pollset.cc', 'src/core/lib/iomgr/pollset.cc',
'src/core/lib/iomgr/pollset_custom.cc', 'src/core/lib/iomgr/pollset_custom.cc',
@ -672,6 +673,8 @@
'src/core/lib/iomgr/gethostname_fallback.cc', 'src/core/lib/iomgr/gethostname_fallback.cc',
'src/core/lib/iomgr/gethostname_host_name_max.cc', 'src/core/lib/iomgr/gethostname_host_name_max.cc',
'src/core/lib/iomgr/gethostname_sysconf.cc', 'src/core/lib/iomgr/gethostname_sysconf.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc',
'src/core/lib/iomgr/internal_errqueue.cc', 'src/core/lib/iomgr/internal_errqueue.cc',
'src/core/lib/iomgr/iocp_windows.cc', 'src/core/lib/iomgr/iocp_windows.cc',
'src/core/lib/iomgr/iomgr.cc', 'src/core/lib/iomgr/iomgr.cc',
@ -683,7 +686,6 @@
'src/core/lib/iomgr/is_epollexclusive_available.cc', 'src/core/lib/iomgr/is_epollexclusive_available.cc',
'src/core/lib/iomgr/load_file.cc', 'src/core/lib/iomgr/load_file.cc',
'src/core/lib/iomgr/lockfree_event.cc', 'src/core/lib/iomgr/lockfree_event.cc',
'src/core/lib/iomgr/network_status_tracker.cc',
'src/core/lib/iomgr/polling_entity.cc', 'src/core/lib/iomgr/polling_entity.cc',
'src/core/lib/iomgr/pollset.cc', 'src/core/lib/iomgr/pollset.cc',
'src/core/lib/iomgr/pollset_custom.cc', 'src/core/lib/iomgr/pollset_custom.cc',
@ -914,6 +916,8 @@
'src/core/lib/iomgr/gethostname_fallback.cc', 'src/core/lib/iomgr/gethostname_fallback.cc',
'src/core/lib/iomgr/gethostname_host_name_max.cc', 'src/core/lib/iomgr/gethostname_host_name_max.cc',
'src/core/lib/iomgr/gethostname_sysconf.cc', 'src/core/lib/iomgr/gethostname_sysconf.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc',
'src/core/lib/iomgr/internal_errqueue.cc', 'src/core/lib/iomgr/internal_errqueue.cc',
'src/core/lib/iomgr/iocp_windows.cc', 'src/core/lib/iomgr/iocp_windows.cc',
'src/core/lib/iomgr/iomgr.cc', 'src/core/lib/iomgr/iomgr.cc',
@ -925,7 +929,6 @@
'src/core/lib/iomgr/is_epollexclusive_available.cc', 'src/core/lib/iomgr/is_epollexclusive_available.cc',
'src/core/lib/iomgr/load_file.cc', 'src/core/lib/iomgr/load_file.cc',
'src/core/lib/iomgr/lockfree_event.cc', 'src/core/lib/iomgr/lockfree_event.cc',
'src/core/lib/iomgr/network_status_tracker.cc',
'src/core/lib/iomgr/polling_entity.cc', 'src/core/lib/iomgr/polling_entity.cc',
'src/core/lib/iomgr/pollset.cc', 'src/core/lib/iomgr/pollset.cc',
'src/core/lib/iomgr/pollset_custom.cc', 'src/core/lib/iomgr/pollset_custom.cc',
@ -1133,6 +1136,8 @@
'src/core/lib/iomgr/gethostname_fallback.cc', 'src/core/lib/iomgr/gethostname_fallback.cc',
'src/core/lib/iomgr/gethostname_host_name_max.cc', 'src/core/lib/iomgr/gethostname_host_name_max.cc',
'src/core/lib/iomgr/gethostname_sysconf.cc', 'src/core/lib/iomgr/gethostname_sysconf.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_posix.cc',
'src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc',
'src/core/lib/iomgr/internal_errqueue.cc', 'src/core/lib/iomgr/internal_errqueue.cc',
'src/core/lib/iomgr/iocp_windows.cc', 'src/core/lib/iomgr/iocp_windows.cc',
'src/core/lib/iomgr/iomgr.cc', 'src/core/lib/iomgr/iomgr.cc',
@ -1144,7 +1149,6 @@
'src/core/lib/iomgr/is_epollexclusive_available.cc', 'src/core/lib/iomgr/is_epollexclusive_available.cc',
'src/core/lib/iomgr/load_file.cc', 'src/core/lib/iomgr/load_file.cc',
'src/core/lib/iomgr/lockfree_event.cc', 'src/core/lib/iomgr/lockfree_event.cc',
'src/core/lib/iomgr/network_status_tracker.cc',
'src/core/lib/iomgr/polling_entity.cc', 'src/core/lib/iomgr/polling_entity.cc',
'src/core/lib/iomgr/pollset.cc', 'src/core/lib/iomgr/pollset.cc',
'src/core/lib/iomgr/pollset_custom.cc', 'src/core/lib/iomgr/pollset_custom.cc',
@ -2713,7 +2717,6 @@
'test/core/end2end/tests/max_connection_idle.cc', 'test/core/end2end/tests/max_connection_idle.cc',
'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/max_message_length.cc',
'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/negative_deadline.cc',
'test/core/end2end/tests/network_status_change.cc',
'test/core/end2end/tests/no_error_on_hotpath.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc',
'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_logging.cc',
'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/no_op.cc',
@ -2803,7 +2806,6 @@
'test/core/end2end/tests/max_connection_idle.cc', 'test/core/end2end/tests/max_connection_idle.cc',
'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/max_message_length.cc',
'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/negative_deadline.cc',
'test/core/end2end/tests/network_status_change.cc',
'test/core/end2end/tests/no_error_on_hotpath.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc',
'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_logging.cc',
'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/no_op.cc',

@ -163,7 +163,7 @@ typedef struct {
/** Maximum time that a channel may exist. Int valued, milliseconds. /** Maximum time that a channel may exist. Int valued, milliseconds.
* INT_MAX means unlimited. */ * INT_MAX means unlimited. */
#define GRPC_ARG_MAX_CONNECTION_AGE_MS "grpc.max_connection_age_ms" #define GRPC_ARG_MAX_CONNECTION_AGE_MS "grpc.max_connection_age_ms"
/** Grace period after the chennel reaches its max age. Int valued, /** Grace period after the channel reaches its max age. Int valued,
milliseconds. INT_MAX means unlimited. */ milliseconds. INT_MAX means unlimited. */
#define GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS "grpc.max_connection_age_grace_ms" #define GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS "grpc.max_connection_age_grace_ms"
/** Enable/disable support for per-message compression. Defaults to 1, unless /** Enable/disable support for per-message compression. Defaults to 1, unless
@ -355,6 +355,10 @@ typedef struct {
* is 10000. Setting this to "0" will disable c-ares query timeouts * is 10000. Setting this to "0" will disable c-ares query timeouts
* entirely. */ * entirely. */
#define GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS "grpc.dns_ares_query_timeout" #define GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS "grpc.dns_ares_query_timeout"
/** gRPC Objective-C channel pooling domain string. */
#define GRPC_ARG_CHANNEL_POOL_DOMAIN "grpc.channel_pooling_domain"
/** gRPC Objective-C channel pooling id. */
#define GRPC_ARG_CHANNEL_ID "grpc.channel_id"
/** \} */ /** \} */
/** Result of a grpc call. If the caller satisfies the prerequisites of a /** Result of a grpc call. If the caller satisfies the prerequisites of a

@ -121,6 +121,7 @@
#else /* _LP64 */ #else /* _LP64 */
#define GPR_ARCH_32 1 #define GPR_ARCH_32 1
#endif /* _LP64 */ #endif /* _LP64 */
#include <linux/version.h>
#elif defined(ANDROID) || defined(__ANDROID__) #elif defined(ANDROID) || defined(__ANDROID__)
#define GPR_PLATFORM_STRING "android" #define GPR_PLATFORM_STRING "android"
#define GPR_ANDROID 1 #define GPR_ANDROID 1
@ -465,6 +466,10 @@ typedef unsigned __int64 uint64_t;
#define GRPC_ARES 1 #define GRPC_ARES 1
#endif #endif
#ifndef GRPC_IF_NAMETOINDEX
#define GRPC_IF_NAMETOINDEX 1
#endif
#ifndef GRPC_MUST_USE_RESULT #ifndef GRPC_MUST_USE_RESULT
#if defined(__GNUC__) && !defined(__MINGW32__) #if defined(__GNUC__) && !defined(__MINGW32__)
#define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result)) #define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result))

@ -303,9 +303,29 @@ class CallOpSendMessage {
template <class M> template <class M>
Status SendMessage(const M& message) GRPC_MUST_USE_RESULT; Status SendMessage(const M& message) GRPC_MUST_USE_RESULT;
/// Send \a message using \a options for the write. The \a options are cleared
/// after use. This form of SendMessage allows gRPC to reference \a message
/// beyond the lifetime of SendMessage.
template <class M>
Status SendMessagePtr(const M* message,
WriteOptions options) GRPC_MUST_USE_RESULT;
/// This form of SendMessage allows gRPC to reference \a message beyond the
/// lifetime of SendMessage.
template <class M>
Status SendMessagePtr(const M* message) GRPC_MUST_USE_RESULT;
protected: protected:
void AddOp(grpc_op* ops, size_t* nops) { void AddOp(grpc_op* ops, size_t* nops) {
if (!send_buf_.Valid() || hijacked_) return; if (msg_ == nullptr && !send_buf_.Valid()) return;
if (hijacked_) {
serializer_ = nullptr;
return;
}
if (msg_ != nullptr) {
GPR_CODEGEN_ASSERT(serializer_(msg_).ok());
}
serializer_ = nullptr;
grpc_op* op = &ops[(*nops)++]; grpc_op* op = &ops[(*nops)++];
op->op = GRPC_OP_SEND_MESSAGE; op->op = GRPC_OP_SEND_MESSAGE;
op->flags = write_options_.flags(); op->flags = write_options_.flags();
@ -314,21 +334,38 @@ class CallOpSendMessage {
// Flags are per-message: clear them after use. // Flags are per-message: clear them after use.
write_options_.Clear(); write_options_.Clear();
} }
void FinishOp(bool* status) { send_buf_.Clear(); } void FinishOp(bool* status) {
if (msg_ == nullptr && !send_buf_.Valid()) return;
if (hijacked_ && failed_send_) {
// Hijacking interceptor failed this Op
*status = false;
} else if (!*status) {
// This Op was passed down to core and the Op failed
failed_send_ = true;
}
}
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InterceptorBatchMethodsImpl* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!send_buf_.Valid()) return; if (msg_ == nullptr && !send_buf_.Valid()) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::PRE_SEND_MESSAGE); experimental::InterceptionHookPoints::PRE_SEND_MESSAGE);
interceptor_methods->SetSendMessage(&send_buf_); interceptor_methods->SetSendMessage(&send_buf_, &msg_, &failed_send_,
serializer_);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InterceptorBatchMethodsImpl* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (msg_ != nullptr || send_buf_.Valid()) {
interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_SEND_MESSAGE);
}
send_buf_.Clear();
msg_ = nullptr;
// The contents of the SendMessage value that was previously set // The contents of the SendMessage value that was previously set
// has had its references stolen by core's operations // has had its references stolen by core's operations
interceptor_methods->SetSendMessage(nullptr); interceptor_methods->SetSendMessage(nullptr, nullptr, &failed_send_,
nullptr);
} }
void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
@ -336,25 +373,38 @@ class CallOpSendMessage {
} }
private: private:
const void* msg_ = nullptr; // The original non-serialized message
bool hijacked_ = false; bool hijacked_ = false;
bool failed_send_ = false;
ByteBuffer send_buf_; ByteBuffer send_buf_;
WriteOptions write_options_; WriteOptions write_options_;
std::function<Status(const void*)> serializer_;
}; };
template <class M> template <class M>
Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) { Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) {
write_options_ = options; write_options_ = options;
bool own_buf; serializer_ = [this](const void* message) {
// TODO(vjpai): Remove the void below when possible bool own_buf;
// The void in the template parameter below should not be needed send_buf_.Clear();
// (since it should be implicit) but is needed due to an observed // TODO(vjpai): Remove the void below when possible
// difference in behavior between clang and gcc for certain internal users // The void in the template parameter below should not be needed
Status result = SerializationTraits<M, void>::Serialize( // (since it should be implicit) but is needed due to an observed
message, send_buf_.bbuf_ptr(), &own_buf); // difference in behavior between clang and gcc for certain internal users
if (!own_buf) { Status result = SerializationTraits<M, void>::Serialize(
send_buf_.Duplicate(); *static_cast<const M*>(message), send_buf_.bbuf_ptr(), &own_buf);
} if (!own_buf) {
return result; send_buf_.Duplicate();
}
return result;
};
// Serialize immediately only if we do not have access to the message pointer
if (msg_ == nullptr) {
Status result = serializer_(&message);
serializer_ = nullptr;
return result;
}
return Status();
} }
template <class M> template <class M>
@ -362,6 +412,19 @@ Status CallOpSendMessage::SendMessage(const M& message) {
return SendMessage(message, WriteOptions()); return SendMessage(message, WriteOptions());
} }
template <class M>
Status CallOpSendMessage::SendMessagePtr(const M* message,
WriteOptions options) {
msg_ = message;
return SendMessage(*message, options);
}
template <class M>
Status CallOpSendMessage::SendMessagePtr(const M* message) {
msg_ = message;
return SendMessage(*message, WriteOptions());
}
template <class R> template <class R>
class CallOpRecvMessage { class CallOpRecvMessage {
public: public:
@ -410,14 +473,16 @@ class CallOpRecvMessage {
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InterceptorBatchMethodsImpl* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
interceptor_methods->SetRecvMessage(message_); if (message_ == nullptr) return;
interceptor_methods->SetRecvMessage(message_, &got_message);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InterceptorBatchMethodsImpl* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!got_message) return; if (message_ == nullptr) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
if (!got_message) interceptor_methods->SetRecvMessage(nullptr, nullptr);
} }
void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
@ -505,20 +570,23 @@ class CallOpGenericRecvMessage {
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InterceptorBatchMethodsImpl* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
interceptor_methods->SetRecvMessage(message_); if (!deserialize_) return;
interceptor_methods->SetRecvMessage(message_, &got_message);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InterceptorBatchMethodsImpl* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!got_message) return; if (!deserialize_) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
if (!got_message) interceptor_methods->SetRecvMessage(nullptr, nullptr);
} }
void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
if (!deserialize_) return; if (!deserialize_) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::PRE_RECV_MESSAGE); experimental::InterceptionHookPoints::PRE_RECV_MESSAGE);
got_message = true;
} }
private: private:

@ -73,7 +73,7 @@ class CallbackUnaryCallImpl {
CallbackWithStatusTag(call.call(), on_completion, ops); CallbackWithStatusTag(call.call(), on_completion, ops);
// TODO(vjpai): Unify code with sync API as much as possible // TODO(vjpai): Unify code with sync API as much as possible
Status s = ops->SendMessage(*request); Status s = ops->SendMessagePtr(request);
if (!s.ok()) { if (!s.ok()) {
tag->force_run(s); tag->force_run(s);
return; return;
@ -340,13 +340,13 @@ class ClientCallbackReaderWriterImpl
context_->initial_metadata_flags()); context_->initial_metadata_flags());
start_corked_ = false; start_corked_ = false;
} }
// TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(*msg).ok());
if (options.is_last_message()) { if (options.is_last_message()) {
options.set_buffer_hint(); options.set_buffer_hint();
write_ops_.ClientSendClose(); write_ops_.ClientSendClose();
} }
// TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok());
callbacks_outstanding_++; callbacks_outstanding_++;
if (started_) { if (started_) {
call_.PerformOps(&write_ops_); call_.PerformOps(&write_ops_);
@ -524,7 +524,7 @@ class ClientCallbackReaderImpl
: context_(context), call_(call), reactor_(reactor) { : context_(context), call_(call), reactor_(reactor) {
this->BindReactor(reactor); this->BindReactor(reactor);
// TODO(vjpai): don't assert // TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(start_ops_.SendMessage(*request).ok()); GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok());
start_ops_.ClientSendClose(); start_ops_.ClientSendClose();
} }
@ -649,13 +649,13 @@ class ClientCallbackWriterImpl
context_->initial_metadata_flags()); context_->initial_metadata_flags());
start_corked_ = false; start_corked_ = false;
} }
// TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(*msg).ok());
if (options.is_last_message()) { if (options.is_last_message()) {
options.set_buffer_hint(); options.set_buffer_hint();
write_ops_.ClientSendClose(); write_ops_.ClientSendClose();
} }
// TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok());
callbacks_outstanding_++; callbacks_outstanding_++;
if (started_) { if (started_) {
call_.PerformOps(&write_ops_); call_.PerformOps(&write_ops_);

@ -57,7 +57,7 @@ class BlockingUnaryCallImpl {
CallOpRecvInitialMetadata, CallOpRecvMessage<OutputMessage>, CallOpRecvInitialMetadata, CallOpRecvMessage<OutputMessage>,
CallOpClientSendClose, CallOpClientRecvStatus> CallOpClientSendClose, CallOpClientRecvStatus>
ops; ops;
status_ = ops.SendMessage(request); status_ = ops.SendMessagePtr(&request);
if (!status_.ok()) { if (!status_.ok()) {
return; return;
} }

@ -46,9 +46,10 @@ namespace experimental {
/// operation has been requested and it is available. POST_RECV means that a /// operation has been requested and it is available. POST_RECV means that a
/// result is available but has not yet been passed back to the application. /// result is available but has not yet been passed back to the application.
enum class InterceptionHookPoints { enum class InterceptionHookPoints {
/// The first two in this list are for clients and servers /// The first three in this list are for clients and servers
PRE_SEND_INITIAL_METADATA, PRE_SEND_INITIAL_METADATA,
PRE_SEND_MESSAGE, PRE_SEND_MESSAGE,
POST_SEND_MESSAGE,
PRE_SEND_STATUS, // server only PRE_SEND_STATUS, // server only
PRE_SEND_CLOSE, // client only: WritesDone for stream; after write in unary PRE_SEND_CLOSE, // client only: WritesDone for stream; after write in unary
/// The following three are for hijacked clients only and can only be /// The following three are for hijacked clients only and can only be
@ -109,7 +110,24 @@ class InterceptorBatchMethods {
/// Returns a modifable ByteBuffer holding the serialized form of the message /// Returns a modifable ByteBuffer holding the serialized form of the message
/// that is going to be sent. Valid for PRE_SEND_MESSAGE interceptions. /// that is going to be sent. Valid for PRE_SEND_MESSAGE interceptions.
/// A return value of nullptr indicates that this ByteBuffer is not valid. /// A return value of nullptr indicates that this ByteBuffer is not valid.
virtual ByteBuffer* GetSendMessage() = 0; virtual ByteBuffer* GetSerializedSendMessage() = 0;
/// Returns a non-modifiable pointer to the non-serialized form of the message
/// to be sent. Valid for PRE_SEND_MESSAGE interceptions. A return value of
/// nullptr indicates that this field is not valid. Also note that this is
/// only supported for sync and callback APIs at the present moment.
virtual const void* GetSendMessage() = 0;
/// Overwrites the message to be sent with \a message. \a message should be in
/// the non-serialized form expected by the method. Valid for PRE_SEND_MESSAGE
/// interceptions. Note that the interceptor is responsible for maintaining
/// the life of the message for the duration on the send operation, i.e., till
/// POST_SEND_MESSAGE.
virtual void ModifySendMessage(const void* message) = 0;
/// Checks whether the SEND MESSAGE op succeeded. Valid for POST_SEND_MESSAGE
/// interceptions.
virtual bool GetSendMessageStatus() = 0;
/// Returns a modifiable multimap of the initial metadata to be sent. Valid /// Returns a modifiable multimap of the initial metadata to be sent. Valid
/// for PRE_SEND_INITIAL_METADATA interceptions. A value of nullptr indicates /// for PRE_SEND_INITIAL_METADATA interceptions. A value of nullptr indicates
@ -156,6 +174,15 @@ class InterceptorBatchMethods {
/// started from interceptors without infinite regress through the interceptor /// started from interceptors without infinite regress through the interceptor
/// list. /// list.
virtual std::unique_ptr<ChannelInterface> GetInterceptedChannel() = 0; virtual std::unique_ptr<ChannelInterface> GetInterceptedChannel() = 0;
/// On a hijacked RPC, an interceptor can decide to fail a PRE_RECV_MESSAGE
/// op. This would be a signal to the reader that there will be no more
/// messages, or the stream has failed or been cancelled.
virtual void FailHijackedRecvMessage() = 0;
/// On a hijacked RPC/ to-be hijacked RPC, this can be called to fail a SEND
/// MESSAGE op
virtual void FailHijackedSendMessage() = 0;
}; };
/// Interface for an interceptor. Interceptor authors must create a class /// Interface for an interceptor. Interceptor authors must create a class

@ -79,7 +79,26 @@ class InterceptorBatchMethodsImpl
hooks_[static_cast<size_t>(type)] = true; hooks_[static_cast<size_t>(type)] = true;
} }
ByteBuffer* GetSendMessage() override { return send_message_; } ByteBuffer* GetSerializedSendMessage() override {
GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr);
if (*orig_send_message_ != nullptr) {
GPR_CODEGEN_ASSERT(serializer_(*orig_send_message_).ok());
*orig_send_message_ = nullptr;
}
return send_message_;
}
const void* GetSendMessage() override {
GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr);
return *orig_send_message_;
}
void ModifySendMessage(const void* message) override {
GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr);
*orig_send_message_ = message;
}
bool GetSendMessageStatus() override { return !*fail_send_message_; }
std::multimap<grpc::string, grpc::string>* GetSendInitialMetadata() override { std::multimap<grpc::string, grpc::string>* GetSendInitialMetadata() override {
return send_initial_metadata_; return send_initial_metadata_;
@ -110,12 +129,25 @@ class InterceptorBatchMethodsImpl
Status* GetRecvStatus() override { return recv_status_; } Status* GetRecvStatus() override { return recv_status_; }
void FailHijackedSendMessage() override {
GPR_CODEGEN_ASSERT(hooks_[static_cast<size_t>(
experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)]);
*fail_send_message_ = true;
}
std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvTrailingMetadata() std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvTrailingMetadata()
override { override {
return recv_trailing_metadata_->map(); return recv_trailing_metadata_->map();
} }
void SetSendMessage(ByteBuffer* buf) { send_message_ = buf; } void SetSendMessage(ByteBuffer* buf, const void** msg,
bool* fail_send_message,
std::function<Status(const void*)> serializer) {
send_message_ = buf;
orig_send_message_ = msg;
fail_send_message_ = fail_send_message;
serializer_ = serializer;
}
void SetSendInitialMetadata( void SetSendInitialMetadata(
std::multimap<grpc::string, grpc::string>* metadata) { std::multimap<grpc::string, grpc::string>* metadata) {
@ -134,7 +166,10 @@ class InterceptorBatchMethodsImpl
send_trailing_metadata_ = metadata; send_trailing_metadata_ = metadata;
} }
void SetRecvMessage(void* message) { recv_message_ = message; } void SetRecvMessage(void* message, bool* got_message) {
recv_message_ = message;
got_message_ = got_message;
}
void SetRecvInitialMetadata(MetadataMap* map) { void SetRecvInitialMetadata(MetadataMap* map) {
recv_initial_metadata_ = map; recv_initial_metadata_ = map;
@ -157,6 +192,12 @@ class InterceptorBatchMethodsImpl
info->channel(), current_interceptor_index_ + 1)); info->channel(), current_interceptor_index_ + 1));
} }
void FailHijackedRecvMessage() override {
GPR_CODEGEN_ASSERT(hooks_[static_cast<size_t>(
experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)]);
*got_message_ = false;
}
// Clears all state // Clears all state
void ClearState() { void ClearState() {
reverse_ = false; reverse_ = false;
@ -334,6 +375,9 @@ class InterceptorBatchMethodsImpl
std::function<void(void)> callback_; std::function<void(void)> callback_;
ByteBuffer* send_message_ = nullptr; ByteBuffer* send_message_ = nullptr;
bool* fail_send_message_ = nullptr;
const void** orig_send_message_ = nullptr;
std::function<Status(const void*)> serializer_;
std::multimap<grpc::string, grpc::string>* send_initial_metadata_; std::multimap<grpc::string, grpc::string>* send_initial_metadata_;
@ -345,6 +389,7 @@ class InterceptorBatchMethodsImpl
std::multimap<grpc::string, grpc::string>* send_trailing_metadata_ = nullptr; std::multimap<grpc::string, grpc::string>* send_trailing_metadata_ = nullptr;
void* recv_message_ = nullptr; void* recv_message_ = nullptr;
bool* got_message_ = nullptr;
MetadataMap* recv_initial_metadata_ = nullptr; MetadataMap* recv_initial_metadata_ = nullptr;
@ -379,13 +424,36 @@ class CancelInterceptorBatchMethods
"Cancel notification"); "Cancel notification");
} }
ByteBuffer* GetSendMessage() override { ByteBuffer* GetSerializedSendMessage() override {
GPR_CODEGEN_ASSERT(false && GPR_CODEGEN_ASSERT(false &&
"It is illegal to call GetSendMessage on a method which " "It is illegal to call GetSendMessage on a method which "
"has a Cancel notification"); "has a Cancel notification");
return nullptr; return nullptr;
} }
bool GetSendMessageStatus() override {
GPR_CODEGEN_ASSERT(
false &&
"It is illegal to call GetSendMessageStatus on a method which "
"has a Cancel notification");
return false;
}
const void* GetSendMessage() override {
GPR_CODEGEN_ASSERT(
false &&
"It is illegal to call GetOriginalSendMessage on a method which "
"has a Cancel notification");
return nullptr;
}
void ModifySendMessage(const void* message) override {
GPR_CODEGEN_ASSERT(
false &&
"It is illegal to call ModifySendMessage on a method which "
"has a Cancel notification");
}
std::multimap<grpc::string, grpc::string>* GetSendInitialMetadata() override { std::multimap<grpc::string, grpc::string>* GetSendInitialMetadata() override {
GPR_CODEGEN_ASSERT(false && GPR_CODEGEN_ASSERT(false &&
"It is illegal to call GetSendInitialMetadata on a " "It is illegal to call GetSendInitialMetadata on a "
@ -451,6 +519,18 @@ class CancelInterceptorBatchMethods
"method which has a Cancel notification"); "method which has a Cancel notification");
return std::unique_ptr<ChannelInterface>(nullptr); return std::unique_ptr<ChannelInterface>(nullptr);
} }
void FailHijackedRecvMessage() override {
GPR_CODEGEN_ASSERT(false &&
"It is illegal to call FailHijackedRecvMessage on a "
"method which has a Cancel notification");
}
void FailHijackedSendMessage() override {
GPR_CODEGEN_ASSERT(false &&
"It is illegal to call FailHijackedSendMessage on a "
"method which has a Cancel notification");
}
}; };
} // namespace internal } // namespace internal
} // namespace grpc } // namespace grpc

@ -79,7 +79,7 @@ class RpcMethodHandler : public MethodHandler {
ops.set_compression_level(param.server_context->compression_level()); ops.set_compression_level(param.server_context->compression_level());
} }
if (status.ok()) { if (status.ok()) {
status = ops.SendMessage(rsp); status = ops.SendMessagePtr(&rsp);
} }
ops.ServerSendStatus(&param.server_context->trailing_metadata_, status); ops.ServerSendStatus(&param.server_context->trailing_metadata_, status);
param.call->PerformOps(&ops); param.call->PerformOps(&ops);
@ -139,7 +139,7 @@ class ClientStreamingHandler : public MethodHandler {
} }
} }
if (status.ok()) { if (status.ok()) {
status = ops.SendMessage(rsp); status = ops.SendMessagePtr(&rsp);
} }
ops.ServerSendStatus(&param.server_context->trailing_metadata_, status); ops.ServerSendStatus(&param.server_context->trailing_metadata_, status);
param.call->PerformOps(&ops); param.call->PerformOps(&ops);

@ -320,7 +320,7 @@ class CallbackUnaryHandler : public MethodHandler {
// The response is dropped if the status is not OK. // The response is dropped if the status is not OK.
if (s.ok()) { if (s.ok()) {
finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
finish_ops_.SendMessage(resp_)); finish_ops_.SendMessagePtr(&resp_));
} else { } else {
finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s); finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
} }
@ -449,7 +449,7 @@ class CallbackClientStreamingHandler : public MethodHandler {
// The response is dropped if the status is not OK. // The response is dropped if the status is not OK.
if (s.ok()) { if (s.ok()) {
finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
finish_ops_.SendMessage(resp_)); finish_ops_.SendMessagePtr(&resp_));
} else { } else {
finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s); finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
} }
@ -642,7 +642,7 @@ class CallbackServerStreamingHandler : public MethodHandler {
ctx_->sent_initial_metadata_ = true; ctx_->sent_initial_metadata_ = true;
} }
// TODO(vjpai): don't assert // TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(*resp, options).ok()); GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(resp, options).ok());
call_.PerformOps(&write_ops_); call_.PerformOps(&write_ops_);
} }
@ -652,7 +652,7 @@ class CallbackServerStreamingHandler : public MethodHandler {
// Don't send any message if the status is bad // Don't send any message if the status is bad
if (s.ok()) { if (s.ok()) {
// TODO(vjpai): don't assert // TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(finish_ops_.SendMessage(*resp, options).ok()); GPR_CODEGEN_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok());
} }
Finish(std::move(s)); Finish(std::move(s));
} }
@ -804,7 +804,7 @@ class CallbackBidiHandler : public MethodHandler {
ctx_->sent_initial_metadata_ = true; ctx_->sent_initial_metadata_ = true;
} }
// TODO(vjpai): don't assert // TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(*resp, options).ok()); GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(resp, options).ok());
call_.PerformOps(&write_ops_); call_.PerformOps(&write_ops_);
} }
@ -813,7 +813,7 @@ class CallbackBidiHandler : public MethodHandler {
// Don't send any message if the status is bad // Don't send any message if the status is bad
if (s.ok()) { if (s.ok()) {
// TODO(vjpai): don't assert // TODO(vjpai): don't assert
GPR_CODEGEN_ASSERT(finish_ops_.SendMessage(*resp, options).ok()); GPR_CODEGEN_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok());
} }
Finish(std::move(s)); Finish(std::move(s));
} }

@ -272,7 +272,7 @@ class ServerInterface : public internal::CallHook {
/* Set interception point for recv message */ /* Set interception point for recv message */
interceptor_methods_.AddInterceptionHookPoint( interceptor_methods_.AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
interceptor_methods_.SetRecvMessage(request_); interceptor_methods_.SetRecvMessage(request_, nullptr);
return RegisteredAsyncRequest::FinalizeResult(tag, status); return RegisteredAsyncRequest::FinalizeResult(tag, status);
} }

@ -253,7 +253,7 @@ class ClientReader final : public ClientReaderInterface<R> {
ops.SendInitialMetadata(&context->send_initial_metadata_, ops.SendInitialMetadata(&context->send_initial_metadata_,
context->initial_metadata_flags()); context->initial_metadata_flags());
// TODO(ctiller): don't assert // TODO(ctiller): don't assert
GPR_CODEGEN_ASSERT(ops.SendMessage(request).ok()); GPR_CODEGEN_ASSERT(ops.SendMessagePtr(&request).ok());
ops.ClientSendClose(); ops.ClientSendClose();
call_.PerformOps(&ops); call_.PerformOps(&ops);
cq_.Pluck(&ops); cq_.Pluck(&ops);
@ -331,7 +331,7 @@ class ClientWriter : public ClientWriterInterface<W> {
context_->initial_metadata_flags()); context_->initial_metadata_flags());
context_->set_initial_metadata_corked(false); context_->set_initial_metadata_corked(false);
} }
if (!ops.SendMessage(msg, options).ok()) { if (!ops.SendMessagePtr(&msg, options).ok()) {
return false; return false;
} }
@ -502,7 +502,7 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
context_->initial_metadata_flags()); context_->initial_metadata_flags());
context_->set_initial_metadata_corked(false); context_->set_initial_metadata_corked(false);
} }
if (!ops.SendMessage(msg, options).ok()) { if (!ops.SendMessagePtr(&msg, options).ok()) {
return false; return false;
} }
@ -656,7 +656,7 @@ class ServerWriter final : public ServerWriterInterface<W> {
options.set_buffer_hint(); options.set_buffer_hint();
} }
if (!ctx_->pending_ops_.SendMessage(msg, options).ok()) { if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) {
return false; return false;
} }
if (!ctx_->sent_initial_metadata_) { if (!ctx_->sent_initial_metadata_) {
@ -734,7 +734,7 @@ class ServerReaderWriterBody final {
if (options.is_last_message()) { if (options.is_last_message()) {
options.set_buffer_hint(); options.set_buffer_hint();
} }
if (!ctx_->pending_ops_.SendMessage(msg, options).ok()) { if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) {
return false; return false;
} }
if (!ctx_->sent_initial_metadata_) { if (!ctx_->sent_initial_metadata_) {

@ -35,18 +35,17 @@ class GrpcLibrary final : public GrpcLibraryInterface {
void shutdown() override { grpc_shutdown(); } void shutdown() override { grpc_shutdown(); }
}; };
static GrpcLibrary g_gli;
static CoreCodegen g_core_codegen;
/// Instantiating this class ensures the proper initialization of gRPC. /// Instantiating this class ensures the proper initialization of gRPC.
class GrpcLibraryInitializer final { class GrpcLibraryInitializer final {
public: public:
GrpcLibraryInitializer() { GrpcLibraryInitializer() {
if (grpc::g_glip == nullptr) { if (grpc::g_glip == nullptr) {
grpc::g_glip = &g_gli; static auto* const g_gli = new GrpcLibrary();
grpc::g_glip = g_gli;
} }
if (grpc::g_core_codegen_interface == nullptr) { if (grpc::g_core_codegen_interface == nullptr) {
grpc::g_core_codegen_interface = &g_core_codegen; static auto* const g_core_codegen = new CoreCodegen();
grpc::g_core_codegen_interface = g_core_codegen;
} }
} }

@ -13,8 +13,8 @@
<date>2018-01-19</date> <date>2018-01-19</date>
<time>16:06:07</time> <time>16:06:07</time>
<version> <version>
<release>1.18.0dev</release> <release>1.19.0dev</release>
<api>1.18.0dev</api> <api>1.19.0dev</api>
</version> </version>
<stability> <stability>
<release>beta</release> <release>beta</release>
@ -358,6 +358,7 @@
<file baseinstalldir="/" name="src/core/lib/iomgr/exec_ctx.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/exec_ctx.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/executor.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/executor.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/gethostname.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/gethostname.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/grpc_if_nametoindex.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/internal_errqueue.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/internal_errqueue.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iocp_windows.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/iocp_windows.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/iomgr.h" role="src" />
@ -368,7 +369,6 @@
<file baseinstalldir="/" name="src/core/lib/iomgr/load_file.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/load_file.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/lockfree_event.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/lockfree_event.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/nameser.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/nameser.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/network_status_tracker.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/polling_entity.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/polling_entity.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/pollset.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/pollset.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/pollset_custom.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/pollset_custom.h" role="src" />
@ -512,6 +512,8 @@
<file baseinstalldir="/" name="src/core/lib/iomgr/gethostname_fallback.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/gethostname_fallback.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/gethostname_host_name_max.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/gethostname_host_name_max.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/gethostname_sysconf.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/gethostname_sysconf.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/grpc_if_nametoindex_posix.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/internal_errqueue.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/internal_errqueue.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iocp_windows.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/iocp_windows.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/iomgr.cc" role="src" />
@ -523,7 +525,6 @@
<file baseinstalldir="/" name="src/core/lib/iomgr/is_epollexclusive_available.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/is_epollexclusive_available.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/load_file.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/load_file.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/lockfree_event.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/lockfree_event.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/network_status_tracker.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/polling_entity.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/polling_entity.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/pollset.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/pollset.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/pollset_custom.cc" role="src" /> <file baseinstalldir="/" name="src/core/lib/iomgr/pollset_custom.cc" role="src" />

@ -160,7 +160,7 @@ if EXTRA_ENV_COMPILE_ARGS is None:
EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions' EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions'
elif "darwin" in sys.platform: elif "darwin" in sys.platform:
EXTRA_ENV_COMPILE_ARGS += ' -fvisibility=hidden -fno-wrapv -fno-exceptions' EXTRA_ENV_COMPILE_ARGS += ' -fvisibility=hidden -fno-wrapv -fno-exceptions'
EXTRA_ENV_COMPILE_ARGS += ' -DPB_FIELD_16BIT' EXTRA_ENV_COMPILE_ARGS += ' -DPB_FIELD_32BIT'
if EXTRA_ENV_LINK_ARGS is None: if EXTRA_ENV_LINK_ARGS is None:
EXTRA_ENV_LINK_ARGS = '' EXTRA_ENV_LINK_ARGS = ''

@ -113,6 +113,29 @@ void PrintAdvancedSignature(Printer* printer, const MethodDescriptor* method,
PrintMethodSignature(printer, method, vars); PrintMethodSignature(printer, method, vars);
} }
void PrintV2Signature(Printer* printer, const MethodDescriptor* method,
map< ::grpc::string, ::grpc::string> vars) {
if (method->client_streaming()) {
vars["return_type"] = "GRPCStreamingProtoCall *";
} else {
vars["return_type"] = "GRPCUnaryProtoCall *";
}
vars["method_name"] =
grpc_generator::LowercaseFirstLetter(vars["method_name"]);
PrintAllComments(method, printer);
printer->Print(vars, "- ($return_type$)$method_name$With");
if (method->client_streaming()) {
printer->Print("ResponseHandler:(id<GRPCProtoResponseHandler>)handler");
} else {
printer->Print(vars,
"Message:($request_class$ *)message "
"responseHandler:(id<GRPCProtoResponseHandler>)handler");
}
printer->Print(" callOptions:(GRPCCallOptions *_Nullable)callOptions");
}
inline map< ::grpc::string, ::grpc::string> GetMethodVars( inline map< ::grpc::string, ::grpc::string> GetMethodVars(
const MethodDescriptor* method) { const MethodDescriptor* method) {
map< ::grpc::string, ::grpc::string> res; map< ::grpc::string, ::grpc::string> res;
@ -135,6 +158,16 @@ void PrintMethodDeclarations(Printer* printer, const MethodDescriptor* method) {
printer->Print(";\n\n\n"); printer->Print(";\n\n\n");
} }
void PrintV2MethodDeclarations(Printer* printer,
const MethodDescriptor* method) {
map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method);
PrintProtoRpcDeclarationAsPragma(printer, method, vars);
PrintV2Signature(printer, method, vars);
printer->Print(";\n\n");
}
void PrintSimpleImplementation(Printer* printer, const MethodDescriptor* method, void PrintSimpleImplementation(Printer* printer, const MethodDescriptor* method,
map< ::grpc::string, ::grpc::string> vars) { map< ::grpc::string, ::grpc::string> vars) {
printer->Print("{\n"); printer->Print("{\n");
@ -177,6 +210,25 @@ void PrintAdvancedImplementation(Printer* printer,
printer->Print("}\n"); printer->Print("}\n");
} }
void PrintV2Implementation(Printer* printer, const MethodDescriptor* method,
map< ::grpc::string, ::grpc::string> vars) {
printer->Print(" {\n");
if (method->client_streaming()) {
printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n");
printer->Print(" responseHandler:handler\n");
printer->Print(" callOptions:callOptions\n");
printer->Print(
vars, " responseClass:[$response_class$ class]];\n}\n\n");
} else {
printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n");
printer->Print(" message:message\n");
printer->Print(" responseHandler:handler\n");
printer->Print(" callOptions:callOptions\n");
printer->Print(
vars, " responseClass:[$response_class$ class]];\n}\n\n");
}
}
void PrintMethodImplementations(Printer* printer, void PrintMethodImplementations(Printer* printer,
const MethodDescriptor* method) { const MethodDescriptor* method) {
map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method); map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method);
@ -184,12 +236,16 @@ void PrintMethodImplementations(Printer* printer,
PrintProtoRpcDeclarationAsPragma(printer, method, vars); PrintProtoRpcDeclarationAsPragma(printer, method, vars);
// TODO(jcanizales): Print documentation from the method. // TODO(jcanizales): Print documentation from the method.
printer->Print("// Deprecated methods.\n");
PrintSimpleSignature(printer, method, vars); PrintSimpleSignature(printer, method, vars);
PrintSimpleImplementation(printer, method, vars); PrintSimpleImplementation(printer, method, vars);
printer->Print("// Returns a not-yet-started RPC object.\n"); printer->Print("// Returns a not-yet-started RPC object.\n");
PrintAdvancedSignature(printer, method, vars); PrintAdvancedSignature(printer, method, vars);
PrintAdvancedImplementation(printer, method, vars); PrintAdvancedImplementation(printer, method, vars);
PrintV2Signature(printer, method, vars);
PrintV2Implementation(printer, method, vars);
} }
} // namespace } // namespace
@ -231,6 +287,25 @@ void PrintMethodImplementations(Printer* printer,
return output; return output;
} }
::grpc::string GetV2Protocol(const ServiceDescriptor* service) {
::grpc::string output;
// Scope the output stream so it closes and finalizes output to the string.
grpc::protobuf::io::StringOutputStream output_stream(&output);
Printer printer(&output_stream, '$');
map< ::grpc::string, ::grpc::string> vars = {
{"service_class", ServiceClassName(service) + "2"}};
printer.Print(vars, "@protocol $service_class$ <NSObject>\n\n");
for (int i = 0; i < service->method_count(); i++) {
PrintV2MethodDeclarations(&printer, service->method(i));
}
printer.Print("@end\n\n");
return output;
}
::grpc::string GetInterface(const ServiceDescriptor* service) { ::grpc::string GetInterface(const ServiceDescriptor* service) {
::grpc::string output; ::grpc::string output;
@ -248,10 +323,16 @@ void PrintMethodImplementations(Printer* printer,
" */\n"); " */\n");
printer.Print(vars, printer.Print(vars,
"@interface $service_class$ :" "@interface $service_class$ :"
" GRPCProtoService<$service_class$>\n"); " GRPCProtoService<$service_class$, $service_class$2>\n");
printer.Print( printer.Print(
"- (instancetype)initWithHost:(NSString *)host" "- (instancetype)initWithHost:(NSString *)host "
"callOptions:(GRPCCallOptions "
"*_Nullable)callOptions"
" NS_DESIGNATED_INITIALIZER;\n"); " NS_DESIGNATED_INITIALIZER;\n");
printer.Print("- (instancetype)initWithHost:(NSString *)host;\n");
printer.Print(
"+ (instancetype)serviceWithHost:(NSString *)host "
"callOptions:(GRPCCallOptions *_Nullable)callOptions;\n");
printer.Print("+ (instancetype)serviceWithHost:(NSString *)host;\n"); printer.Print("+ (instancetype)serviceWithHost:(NSString *)host;\n");
printer.Print("@end\n"); printer.Print("@end\n");
@ -272,13 +353,23 @@ void PrintMethodImplementations(Printer* printer,
printer.Print(vars, printer.Print(vars,
"@implementation $service_class$\n\n" "@implementation $service_class$\n\n"
"#pragma clang diagnostic push\n"
"#pragma clang diagnostic ignored "
"\"-Wobjc-designated-initializers\"\n\n"
"// Designated initializer\n" "// Designated initializer\n"
"- (instancetype)initWithHost:(NSString *)host "
"callOptions:(GRPCCallOptions *_Nullable)callOptions {\n"
" return [super initWithHost:host\n"
" packageName:@\"$package$\"\n"
" serviceName:@\"$service_name$\"\n"
" callOptions:callOptions];\n"
"}\n\n"
"- (instancetype)initWithHost:(NSString *)host {\n" "- (instancetype)initWithHost:(NSString *)host {\n"
" self = [super initWithHost:host\n" " return [super initWithHost:host\n"
" packageName:@\"$package$\"\n" " packageName:@\"$package$\"\n"
" serviceName:@\"$service_name$\"];\n" " serviceName:@\"$service_name$\"];\n"
" return self;\n" "}\n\n"
"}\n\n"); "#pragma clang diagnostic pop\n\n");
printer.Print( printer.Print(
"// Override superclass initializer to disallow different" "// Override superclass initializer to disallow different"
@ -287,12 +378,22 @@ void PrintMethodImplementations(Printer* printer,
" packageName:(NSString *)packageName\n" " packageName:(NSString *)packageName\n"
" serviceName:(NSString *)serviceName {\n" " serviceName:(NSString *)serviceName {\n"
" return [self initWithHost:host];\n" " return [self initWithHost:host];\n"
"}\n\n"
"- (instancetype)initWithHost:(NSString *)host\n"
" packageName:(NSString *)packageName\n"
" serviceName:(NSString *)serviceName\n"
" callOptions:(GRPCCallOptions *)callOptions {\n"
" return [self initWithHost:host callOptions:callOptions];\n"
"}\n\n"); "}\n\n");
printer.Print( printer.Print(
"#pragma mark - Class Methods\n\n" "#pragma mark - Class Methods\n\n"
"+ (instancetype)serviceWithHost:(NSString *)host {\n" "+ (instancetype)serviceWithHost:(NSString *)host {\n"
" return [[self alloc] initWithHost:host];\n" " return [[self alloc] initWithHost:host];\n"
"}\n\n"
"+ (instancetype)serviceWithHost:(NSString *)host "
"callOptions:(GRPCCallOptions *_Nullable)callOptions {\n"
" return [[self alloc] initWithHost:host callOptions:callOptions];\n"
"}\n\n"); "}\n\n");
printer.Print("#pragma mark - Method Implementations\n\n"); printer.Print("#pragma mark - Method Implementations\n\n");

@ -32,9 +32,14 @@ using ::grpc::string;
string GetAllMessageClasses(const FileDescriptor* file); string GetAllMessageClasses(const FileDescriptor* file);
// Returns the content to be included defining the @protocol segment at the // Returns the content to be included defining the @protocol segment at the
// insertion point of the generated implementation file. // insertion point of the generated implementation file. This interface is
// legacy and for backwards compatibility.
string GetProtocol(const ServiceDescriptor* service); string GetProtocol(const ServiceDescriptor* service);
// Returns the content to be included defining the @protocol segment at the
// insertion point of the generated implementation file.
string GetV2Protocol(const ServiceDescriptor* service);
// Returns the content to be included defining the @interface segment at the // Returns the content to be included defining the @interface segment at the
// insertion point of the generated implementation file. // insertion point of the generated implementation file.
string GetInterface(const ServiceDescriptor* service); string GetInterface(const ServiceDescriptor* service);

@ -93,7 +93,13 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
SystemImport("RxLibrary/GRXWriteable.h") + SystemImport("RxLibrary/GRXWriteable.h") +
SystemImport("RxLibrary/GRXWriter.h"); SystemImport("RxLibrary/GRXWriter.h");
::grpc::string forward_declarations = "@class GRPCProtoCall;\n\n"; ::grpc::string forward_declarations =
"@class GRPCProtoCall;\n"
"@class GRPCUnaryProtoCall;\n"
"@class GRPCStreamingProtoCall;\n"
"@class GRPCCallOptions;\n"
"@protocol GRPCProtoResponseHandler;\n"
"\n";
::grpc::string class_declarations = ::grpc::string class_declarations =
grpc_objective_c_generator::GetAllMessageClasses(file); grpc_objective_c_generator::GetAllMessageClasses(file);
@ -103,6 +109,12 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
class_imports += ImportProtoHeaders(file->dependency(i), " "); class_imports += ImportProtoHeaders(file->dependency(i), " ");
} }
::grpc::string ng_protocols;
for (int i = 0; i < file->service_count(); i++) {
const grpc::protobuf::ServiceDescriptor* service = file->service(i);
ng_protocols += grpc_objective_c_generator::GetV2Protocol(service);
}
::grpc::string protocols; ::grpc::string protocols;
for (int i = 0; i < file->service_count(); i++) { for (int i = 0; i < file->service_count(); i++) {
const grpc::protobuf::ServiceDescriptor* service = file->service(i); const grpc::protobuf::ServiceDescriptor* service = file->service(i);
@ -120,9 +132,10 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
PreprocIfNot(kProtocolOnly, system_imports) + "\n" + PreprocIfNot(kProtocolOnly, system_imports) + "\n" +
class_declarations + "\n" + class_declarations + "\n" +
PreprocIfNot(kForwardDeclare, class_imports) + "\n" + PreprocIfNot(kForwardDeclare, class_imports) + "\n" +
forward_declarations + "\n" + kNonNullBegin + "\n" + protocols + forward_declarations + "\n" + kNonNullBegin + "\n" +
"\n" + PreprocIfNot(kProtocolOnly, interfaces) + "\n" + ng_protocols + protocols + "\n" +
kNonNullEnd + "\n"); PreprocIfNot(kProtocolOnly, interfaces) + "\n" + kNonNullEnd +
"\n");
} }
{ {

@ -30,7 +30,7 @@ void grpc_client_channel_factory_unref(grpc_client_channel_factory* factory) {
} }
grpc_subchannel* grpc_client_channel_factory_create_subchannel( grpc_subchannel* grpc_client_channel_factory_create_subchannel(
grpc_client_channel_factory* factory, const grpc_subchannel_args* args) { grpc_client_channel_factory* factory, const grpc_channel_args* args) {
return factory->vtable->create_subchannel(factory, args); return factory->vtable->create_subchannel(factory, args);
} }

@ -49,7 +49,7 @@ struct grpc_client_channel_factory_vtable {
void (*ref)(grpc_client_channel_factory* factory); void (*ref)(grpc_client_channel_factory* factory);
void (*unref)(grpc_client_channel_factory* factory); void (*unref)(grpc_client_channel_factory* factory);
grpc_subchannel* (*create_subchannel)(grpc_client_channel_factory* factory, grpc_subchannel* (*create_subchannel)(grpc_client_channel_factory* factory,
const grpc_subchannel_args* args); const grpc_channel_args* args);
grpc_channel* (*create_client_channel)(grpc_client_channel_factory* factory, grpc_channel* (*create_client_channel)(grpc_client_channel_factory* factory,
const char* target, const char* target,
grpc_client_channel_type type, grpc_client_channel_type type,
@ -61,7 +61,7 @@ void grpc_client_channel_factory_unref(grpc_client_channel_factory* factory);
/** Create a new grpc_subchannel */ /** Create a new grpc_subchannel */
grpc_subchannel* grpc_client_channel_factory_create_subchannel( grpc_subchannel* grpc_client_channel_factory_create_subchannel(
grpc_client_channel_factory* factory, const grpc_subchannel_args* args); grpc_client_channel_factory* factory, const grpc_channel_args* args);
/** Create a new grpc_channel */ /** Create a new grpc_channel */
grpc_channel* grpc_client_channel_factory_create_channel( grpc_channel* grpc_client_channel_factory_create_channel(

@ -509,12 +509,10 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
GRPC_ARG_SERVER_ADDRESS_LIST, GRPC_ARG_SERVER_ADDRESS_LIST,
GRPC_ARG_INHIBIT_HEALTH_CHECKING}; GRPC_ARG_INHIBIT_HEALTH_CHECKING};
// Create a subchannel for each address. // Create a subchannel for each address.
grpc_subchannel_args sc_args;
for (size_t i = 0; i < addresses.size(); i++) { for (size_t i = 0; i < addresses.size(); i++) {
// If there were any balancer addresses, we would have chosen grpclb // If there were any balancer addresses, we would have chosen grpclb
// policy, which does not use a SubchannelList. // policy, which does not use a SubchannelList.
GPR_ASSERT(!addresses[i].IsBalancer()); GPR_ASSERT(!addresses[i].IsBalancer());
memset(&sc_args, 0, sizeof(grpc_subchannel_args));
InlinedVector<grpc_arg, 4> args_to_add; InlinedVector<grpc_arg, 4> args_to_add;
args_to_add.emplace_back( args_to_add.emplace_back(
grpc_create_subchannel_address_arg(&addresses[i].address())); grpc_create_subchannel_address_arg(&addresses[i].address()));
@ -527,9 +525,8 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
&args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove),
args_to_add.data(), args_to_add.size()); args_to_add.data(), args_to_add.size());
gpr_free(args_to_add[0].value.string); gpr_free(args_to_add[0].value.string);
sc_args.args = new_args;
grpc_subchannel* subchannel = grpc_client_channel_factory_create_subchannel( grpc_subchannel* subchannel = grpc_client_channel_factory_create_subchannel(
client_channel_factory, &sc_args); client_channel_factory, new_args);
grpc_channel_args_destroy(new_args); grpc_channel_args_destroy(new_args);
if (subchannel == nullptr) { if (subchannel == nullptr) {
// Subchannel could not be created. // Subchannel could not be created.

@ -19,6 +19,7 @@
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/parse_address.h"
#include "src/core/lib/iomgr/grpc_if_nametoindex.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"
@ -35,6 +36,11 @@
#include "src/core/lib/gpr/host_port.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_POSIX_SOCKET
#include <errno.h>
#include <net/if.h>
#endif
#ifdef GRPC_HAVE_UNIX_SOCKET #ifdef GRPC_HAVE_UNIX_SOCKET
bool grpc_parse_unix(const grpc_uri* uri, bool grpc_parse_unix(const grpc_uri* uri,
@ -69,7 +75,12 @@ bool grpc_parse_ipv4_hostport(const char* hostport, grpc_resolved_address* addr,
// Split host and port. // Split host and port.
char* host; char* host;
char* port; char* port;
if (!gpr_split_host_port(hostport, &host, &port)) return false; if (!gpr_split_host_port(hostport, &host, &port)) {
if (log_errors) {
gpr_log(GPR_ERROR, "Failed gpr_split_host_port(%s, ...)", hostport);
}
return false;
}
// Parse IP address. // Parse IP address.
memset(addr, 0, sizeof(*addr)); memset(addr, 0, sizeof(*addr));
addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in)); addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in));
@ -115,7 +126,12 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr,
// Split host and port. // Split host and port.
char* host; char* host;
char* port; char* port;
if (!gpr_split_host_port(hostport, &host, &port)) return false; if (!gpr_split_host_port(hostport, &host, &port)) {
if (log_errors) {
gpr_log(GPR_ERROR, "Failed gpr_split_host_port(%s, ...)", hostport);
}
return false;
}
// Parse IP address. // Parse IP address.
memset(addr, 0, sizeof(*addr)); memset(addr, 0, sizeof(*addr));
addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6)); addr->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
@ -150,10 +166,13 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr,
if (gpr_parse_bytes_to_uint32(host_end + 1, if (gpr_parse_bytes_to_uint32(host_end + 1,
strlen(host) - host_without_scope_len - 1, strlen(host) - host_without_scope_len - 1,
&sin6_scope_id) == 0) { &sin6_scope_id) == 0) {
if (log_errors) { if ((sin6_scope_id = grpc_if_nametoindex(host_end + 1)) == 0) {
gpr_log(GPR_ERROR, "invalid ipv6 scope id: '%s'", host_end + 1); gpr_log(GPR_ERROR,
"Invalid interface name: '%s'. "
"Non-numeric and failed if_nametoindex.",
host_end + 1);
goto done;
} }
goto done;
} }
// Handle "sin6_scope_id" being type "u_long". See grpc issue #10027. // Handle "sin6_scope_id" being type "u_long". See grpc issue #10027.
in6->sin6_scope_id = sin6_scope_id; in6->sin6_scope_id = sin6_scope_id;

@ -64,18 +64,6 @@
#define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120 #define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120
#define GRPC_SUBCHANNEL_RECONNECT_JITTER 0.2 #define GRPC_SUBCHANNEL_RECONNECT_JITTER 0.2
namespace {
struct state_watcher {
grpc_closure closure;
grpc_subchannel* subchannel;
grpc_connectivity_state connectivity_state;
grpc_connectivity_state last_connectivity_state;
grpc_core::OrphanablePtr<grpc_core::HealthCheckClient> health_check_client;
grpc_closure health_check_closure;
grpc_connectivity_state health_state;
};
} // namespace
typedef struct external_state_watcher { typedef struct external_state_watcher {
grpc_subchannel* subchannel; grpc_subchannel* subchannel;
grpc_pollset_set* pollset_set; grpc_pollset_set* pollset_set;
@ -101,9 +89,6 @@ struct grpc_subchannel {
keep the subchannel open */ keep the subchannel open */
gpr_atm ref_pair; gpr_atm ref_pair;
/** non-transport related channel filters */
const grpc_channel_filter** filters;
size_t num_filters;
/** channel arguments */ /** channel arguments */
grpc_channel_args* args; grpc_channel_args* args;
@ -384,7 +369,6 @@ static void subchannel_destroy(void* arg, grpc_error* error) {
c->channelz_subchannel->MarkSubchannelDestroyed(); c->channelz_subchannel->MarkSubchannelDestroyed();
c->channelz_subchannel.reset(); c->channelz_subchannel.reset();
} }
gpr_free((void*)c->filters);
c->health_check_service_name.reset(); c->health_check_service_name.reset();
grpc_channel_args_destroy(c->args); grpc_channel_args_destroy(c->args);
grpc_connectivity_state_destroy(&c->state_tracker); grpc_connectivity_state_destroy(&c->state_tracker);
@ -553,7 +537,7 @@ struct HealthCheckParams {
} // namespace grpc_core } // namespace grpc_core
grpc_subchannel* grpc_subchannel_create(grpc_connector* connector, grpc_subchannel* grpc_subchannel_create(grpc_connector* connector,
const grpc_subchannel_args* args) { const grpc_channel_args* args) {
grpc_subchannel_key* key = grpc_subchannel_key_create(args); grpc_subchannel_key* key = grpc_subchannel_key_create(args);
grpc_subchannel* c = grpc_subchannel_index_find(key); grpc_subchannel* c = grpc_subchannel_index_find(key);
if (c) { if (c) {
@ -567,23 +551,13 @@ grpc_subchannel* grpc_subchannel_create(grpc_connector* connector,
gpr_atm_no_barrier_store(&c->ref_pair, 1 << INTERNAL_REF_BITS); gpr_atm_no_barrier_store(&c->ref_pair, 1 << INTERNAL_REF_BITS);
c->connector = connector; c->connector = connector;
grpc_connector_ref(c->connector); grpc_connector_ref(c->connector);
c->num_filters = args->filter_count;
if (c->num_filters > 0) {
c->filters = static_cast<const grpc_channel_filter**>(
gpr_malloc(sizeof(grpc_channel_filter*) * c->num_filters));
memcpy((void*)c->filters, args->filters,
sizeof(grpc_channel_filter*) * c->num_filters);
} else {
c->filters = nullptr;
}
c->pollset_set = grpc_pollset_set_create(); c->pollset_set = grpc_pollset_set_create();
grpc_resolved_address* addr = grpc_resolved_address* addr =
static_cast<grpc_resolved_address*>(gpr_malloc(sizeof(*addr))); static_cast<grpc_resolved_address*>(gpr_malloc(sizeof(*addr)));
grpc_get_subchannel_address_arg(args->args, addr); grpc_get_subchannel_address_arg(args, addr);
grpc_resolved_address* new_address = nullptr; grpc_resolved_address* new_address = nullptr;
grpc_channel_args* new_args = nullptr; grpc_channel_args* new_args = nullptr;
if (grpc_proxy_mappers_map_address(addr, args->args, &new_address, if (grpc_proxy_mappers_map_address(addr, args, &new_address, &new_args)) {
&new_args)) {
GPR_ASSERT(new_address != nullptr); GPR_ASSERT(new_address != nullptr);
gpr_free(addr); gpr_free(addr);
addr = new_address; addr = new_address;
@ -592,7 +566,7 @@ grpc_subchannel* grpc_subchannel_create(grpc_connector* connector,
grpc_arg new_arg = grpc_create_subchannel_address_arg(addr); grpc_arg new_arg = grpc_create_subchannel_address_arg(addr);
gpr_free(addr); gpr_free(addr);
c->args = grpc_channel_args_copy_and_add_and_remove( c->args = grpc_channel_args_copy_and_add_and_remove(
new_args != nullptr ? new_args : args->args, keys_to_remove, new_args != nullptr ? new_args : args, keys_to_remove,
GPR_ARRAY_SIZE(keys_to_remove), &new_arg, 1); GPR_ARRAY_SIZE(keys_to_remove), &new_arg, 1);
gpr_free(new_arg.value.string); gpr_free(new_arg.value.string);
if (new_args != nullptr) grpc_channel_args_destroy(new_args); if (new_args != nullptr) grpc_channel_args_destroy(new_args);
@ -605,7 +579,7 @@ grpc_subchannel* grpc_subchannel_create(grpc_connector* connector,
grpc_connectivity_state_init(&c->state_and_health_tracker, GRPC_CHANNEL_IDLE, grpc_connectivity_state_init(&c->state_and_health_tracker, GRPC_CHANNEL_IDLE,
"subchannel"); "subchannel");
grpc_core::BackOff::Options backoff_options; grpc_core::BackOff::Options backoff_options;
parse_args_for_backoff_values(args->args, &backoff_options, parse_args_for_backoff_values(args, &backoff_options,
&c->min_connect_timeout_ms); &c->min_connect_timeout_ms);
c->backoff.Init(backoff_options); c->backoff.Init(backoff_options);
gpr_mu_init(&c->mu); gpr_mu_init(&c->mu);

@ -38,7 +38,6 @@
address. Provides a target for load balancing. */ address. Provides a target for load balancing. */
typedef struct grpc_subchannel grpc_subchannel; typedef struct grpc_subchannel grpc_subchannel;
typedef struct grpc_subchannel_call grpc_subchannel_call; typedef struct grpc_subchannel_call grpc_subchannel_call;
typedef struct grpc_subchannel_args grpc_subchannel_args;
typedef struct grpc_subchannel_key grpc_subchannel_key; typedef struct grpc_subchannel_key grpc_subchannel_key;
#ifndef NDEBUG #ifndef NDEBUG
@ -186,21 +185,9 @@ void grpc_subchannel_call_set_cleanup_closure(
grpc_call_stack* grpc_subchannel_call_get_call_stack( grpc_call_stack* grpc_subchannel_call_get_call_stack(
grpc_subchannel_call* subchannel_call); grpc_subchannel_call* subchannel_call);
struct grpc_subchannel_args {
/* When updating this struct, also update subchannel_index.c */
/** Channel filters for this channel - wrapped factories will likely
want to mutate this */
const grpc_channel_filter** filters;
/** The number of filters in the above array */
size_t filter_count;
/** Channel arguments to be supplied to the newly created channel */
const grpc_channel_args* args;
};
/** create a subchannel given a connector */ /** create a subchannel given a connector */
grpc_subchannel* grpc_subchannel_create(grpc_connector* connector, grpc_subchannel* grpc_subchannel_create(grpc_connector* connector,
const grpc_subchannel_args* args); const grpc_channel_args* args);
/// Sets \a addr from \a args. /// Sets \a addr from \a args.
void grpc_get_subchannel_address_arg(const grpc_channel_args* args, void grpc_get_subchannel_address_arg(const grpc_channel_args* args,

@ -39,55 +39,37 @@ static gpr_mu g_mu;
static gpr_refcount g_refcount; static gpr_refcount g_refcount;
struct grpc_subchannel_key { struct grpc_subchannel_key {
grpc_subchannel_args args; grpc_channel_args* args;
}; };
static bool g_force_creation = false; static bool g_force_creation = false;
static grpc_subchannel_key* create_key( static grpc_subchannel_key* create_key(
const grpc_subchannel_args* args, const grpc_channel_args* args,
grpc_channel_args* (*copy_channel_args)(const grpc_channel_args* args)) { grpc_channel_args* (*copy_channel_args)(const grpc_channel_args* args)) {
grpc_subchannel_key* k = grpc_subchannel_key* k =
static_cast<grpc_subchannel_key*>(gpr_malloc(sizeof(*k))); static_cast<grpc_subchannel_key*>(gpr_malloc(sizeof(*k)));
k->args.filter_count = args->filter_count; k->args = copy_channel_args(args);
if (k->args.filter_count > 0) {
k->args.filters = static_cast<const grpc_channel_filter**>(
gpr_malloc(sizeof(*k->args.filters) * k->args.filter_count));
memcpy(reinterpret_cast<grpc_channel_filter*>(k->args.filters),
args->filters, sizeof(*k->args.filters) * k->args.filter_count);
} else {
k->args.filters = nullptr;
}
k->args.args = copy_channel_args(args->args);
return k; return k;
} }
grpc_subchannel_key* grpc_subchannel_key_create( grpc_subchannel_key* grpc_subchannel_key_create(const grpc_channel_args* args) {
const grpc_subchannel_args* args) {
return create_key(args, grpc_channel_args_normalize); return create_key(args, grpc_channel_args_normalize);
} }
static grpc_subchannel_key* subchannel_key_copy(grpc_subchannel_key* k) { static grpc_subchannel_key* subchannel_key_copy(grpc_subchannel_key* k) {
return create_key(&k->args, grpc_channel_args_copy); return create_key(k->args, grpc_channel_args_copy);
} }
int grpc_subchannel_key_compare(const grpc_subchannel_key* a, int grpc_subchannel_key_compare(const grpc_subchannel_key* a,
const grpc_subchannel_key* b) { const grpc_subchannel_key* b) {
// To pretend the keys are different, return a non-zero value. // To pretend the keys are different, return a non-zero value.
if (GPR_UNLIKELY(g_force_creation)) return 1; if (GPR_UNLIKELY(g_force_creation)) return 1;
int c = GPR_ICMP(a->args.filter_count, b->args.filter_count); return grpc_channel_args_compare(a->args, b->args);
if (c != 0) return c;
if (a->args.filter_count > 0) {
c = memcmp(a->args.filters, b->args.filters,
a->args.filter_count * sizeof(*a->args.filters));
if (c != 0) return c;
}
return grpc_channel_args_compare(a->args.args, b->args.args);
} }
void grpc_subchannel_key_destroy(grpc_subchannel_key* k) { void grpc_subchannel_key_destroy(grpc_subchannel_key* k) {
gpr_free(reinterpret_cast<grpc_channel_args*>(k->args.filters)); grpc_channel_args_destroy(k->args);
grpc_channel_args_destroy(const_cast<grpc_channel_args*>(k->args.args));
gpr_free(k); gpr_free(k);
} }

@ -27,8 +27,7 @@
shared amongst channels */ shared amongst channels */
/** Create a key that can be used to uniquely identify a subchannel */ /** Create a key that can be used to uniquely identify a subchannel */
grpc_subchannel_key* grpc_subchannel_key_create( grpc_subchannel_key* grpc_subchannel_key_create(const grpc_channel_args* args);
const grpc_subchannel_args* args);
/** Destroy a subchannel key */ /** Destroy a subchannel key */
void grpc_subchannel_key_destroy(grpc_subchannel_key* key); void grpc_subchannel_key_destroy(grpc_subchannel_key* key);

@ -40,14 +40,12 @@ static void client_channel_factory_unref(
grpc_client_channel_factory* cc_factory) {} grpc_client_channel_factory* cc_factory) {}
static grpc_subchannel* client_channel_factory_create_subchannel( static grpc_subchannel* client_channel_factory_create_subchannel(
grpc_client_channel_factory* cc_factory, const grpc_subchannel_args* args) { grpc_client_channel_factory* cc_factory, const grpc_channel_args* args) {
grpc_subchannel_args final_sc_args; grpc_channel_args* new_args = grpc_default_authority_add_if_not_present(args);
memcpy(&final_sc_args, args, sizeof(*args));
final_sc_args.args = grpc_default_authority_add_if_not_present(args->args);
grpc_connector* connector = grpc_chttp2_connector_create(); grpc_connector* connector = grpc_chttp2_connector_create();
grpc_subchannel* s = grpc_subchannel_create(connector, &final_sc_args); grpc_subchannel* s = grpc_subchannel_create(connector, new_args);
grpc_connector_unref(connector); grpc_connector_unref(connector);
grpc_channel_args_destroy(const_cast<grpc_channel_args*>(final_sc_args.args)); grpc_channel_args_destroy(new_args);
return s; return s;
} }

@ -46,10 +46,10 @@ static void client_channel_factory_ref(
static void client_channel_factory_unref( static void client_channel_factory_unref(
grpc_client_channel_factory* cc_factory) {} grpc_client_channel_factory* cc_factory) {}
static grpc_subchannel_args* get_secure_naming_subchannel_args( static grpc_channel_args* get_secure_naming_channel_args(
const grpc_subchannel_args* args) { const grpc_channel_args* args) {
grpc_channel_credentials* channel_credentials = grpc_channel_credentials* channel_credentials =
grpc_channel_credentials_find_in_args(args->args); grpc_channel_credentials_find_in_args(args);
if (channel_credentials == nullptr) { if (channel_credentials == nullptr) {
gpr_log(GPR_ERROR, gpr_log(GPR_ERROR,
"Can't create subchannel: channel credentials missing for secure " "Can't create subchannel: channel credentials missing for secure "
@ -57,7 +57,7 @@ static grpc_subchannel_args* get_secure_naming_subchannel_args(
return nullptr; return nullptr;
} }
// Make sure security connector does not already exist in args. // Make sure security connector does not already exist in args.
if (grpc_security_connector_find_in_args(args->args) != nullptr) { if (grpc_security_connector_find_in_args(args) != nullptr) {
gpr_log(GPR_ERROR, gpr_log(GPR_ERROR,
"Can't create subchannel: security connector already present in " "Can't create subchannel: security connector already present in "
"channel args."); "channel args.");
@ -65,19 +65,18 @@ static grpc_subchannel_args* get_secure_naming_subchannel_args(
} }
// To which address are we connecting? By default, use the server URI. // To which address are we connecting? By default, use the server URI.
const grpc_arg* server_uri_arg = const grpc_arg* server_uri_arg =
grpc_channel_args_find(args->args, GRPC_ARG_SERVER_URI); grpc_channel_args_find(args, GRPC_ARG_SERVER_URI);
const char* server_uri_str = grpc_channel_arg_get_string(server_uri_arg); const char* server_uri_str = grpc_channel_arg_get_string(server_uri_arg);
GPR_ASSERT(server_uri_str != nullptr); GPR_ASSERT(server_uri_str != nullptr);
grpc_uri* server_uri = grpc_uri* server_uri =
grpc_uri_parse(server_uri_str, true /* supress errors */); grpc_uri_parse(server_uri_str, true /* supress errors */);
GPR_ASSERT(server_uri != nullptr); GPR_ASSERT(server_uri != nullptr);
const grpc_core::TargetAuthorityTable* target_authority_table = const grpc_core::TargetAuthorityTable* target_authority_table =
grpc_core::FindTargetAuthorityTableInArgs(args->args); grpc_core::FindTargetAuthorityTableInArgs(args);
grpc_core::UniquePtr<char> authority; grpc_core::UniquePtr<char> authority;
if (target_authority_table != nullptr) { if (target_authority_table != nullptr) {
// Find the authority for the target. // Find the authority for the target.
const char* target_uri_str = const char* target_uri_str = grpc_get_subchannel_address_uri_arg(args);
grpc_get_subchannel_address_uri_arg(args->args);
grpc_uri* target_uri = grpc_uri* target_uri =
grpc_uri_parse(target_uri_str, false /* suppress errors */); grpc_uri_parse(target_uri_str, false /* suppress errors */);
GPR_ASSERT(target_uri != nullptr); GPR_ASSERT(target_uri != nullptr);
@ -100,15 +99,14 @@ static grpc_subchannel_args* get_secure_naming_subchannel_args(
} }
grpc_arg args_to_add[2]; grpc_arg args_to_add[2];
size_t num_args_to_add = 0; size_t num_args_to_add = 0;
if (grpc_channel_args_find(args->args, GRPC_ARG_DEFAULT_AUTHORITY) == if (grpc_channel_args_find(args, GRPC_ARG_DEFAULT_AUTHORITY) == nullptr) {
nullptr) {
// If the channel args don't already contain GRPC_ARG_DEFAULT_AUTHORITY, add // If the channel args don't already contain GRPC_ARG_DEFAULT_AUTHORITY, add
// the arg, setting it to the value just obtained. // the arg, setting it to the value just obtained.
args_to_add[num_args_to_add++] = grpc_channel_arg_string_create( args_to_add[num_args_to_add++] = grpc_channel_arg_string_create(
const_cast<char*>(GRPC_ARG_DEFAULT_AUTHORITY), authority.get()); const_cast<char*>(GRPC_ARG_DEFAULT_AUTHORITY), authority.get());
} }
grpc_channel_args* args_with_authority = grpc_channel_args* args_with_authority =
grpc_channel_args_copy_and_add(args->args, args_to_add, num_args_to_add); grpc_channel_args_copy_and_add(args, args_to_add, num_args_to_add);
grpc_uri_destroy(server_uri); grpc_uri_destroy(server_uri);
// Create the security connector using the credentials and target name. // Create the security connector using the credentials and target name.
grpc_channel_args* new_args_from_connector = nullptr; grpc_channel_args* new_args_from_connector = nullptr;
@ -137,29 +135,21 @@ static grpc_subchannel_args* get_secure_naming_subchannel_args(
grpc_channel_args_destroy(new_args_from_connector); grpc_channel_args_destroy(new_args_from_connector);
} }
grpc_channel_args_destroy(args_with_authority); grpc_channel_args_destroy(args_with_authority);
grpc_subchannel_args* final_sc_args = return new_args;
static_cast<grpc_subchannel_args*>(gpr_malloc(sizeof(*final_sc_args)));
memcpy(final_sc_args, args, sizeof(*args));
final_sc_args->args = new_args;
return final_sc_args;
} }
static grpc_subchannel* client_channel_factory_create_subchannel( static grpc_subchannel* client_channel_factory_create_subchannel(
grpc_client_channel_factory* cc_factory, const grpc_subchannel_args* args) { grpc_client_channel_factory* cc_factory, const grpc_channel_args* args) {
grpc_subchannel_args* subchannel_args = grpc_channel_args* new_args = get_secure_naming_channel_args(args);
get_secure_naming_subchannel_args(args); if (new_args == nullptr) {
if (subchannel_args == nullptr) { gpr_log(GPR_ERROR,
gpr_log( "Failed to create channel args during subchannel creation.");
GPR_ERROR,
"Failed to create subchannel arguments during subchannel creation.");
return nullptr; return nullptr;
} }
grpc_connector* connector = grpc_chttp2_connector_create(); grpc_connector* connector = grpc_chttp2_connector_create();
grpc_subchannel* s = grpc_subchannel_create(connector, subchannel_args); grpc_subchannel* s = grpc_subchannel_create(connector, new_args);
grpc_connector_unref(connector); grpc_connector_unref(connector);
grpc_channel_args_destroy( grpc_channel_args_destroy(new_args);
const_cast<grpc_channel_args*>(subchannel_args->args));
gpr_free(subchannel_args);
return s; return s;
} }

@ -170,7 +170,12 @@ grpc_chttp2_transport::~grpc_chttp2_transport() {
grpc_slice_buffer_destroy_internal(&outbuf); grpc_slice_buffer_destroy_internal(&outbuf);
grpc_chttp2_hpack_compressor_destroy(&hpack_compressor); grpc_chttp2_hpack_compressor_destroy(&hpack_compressor);
grpc_core::ContextList::Execute(cl, nullptr, GRPC_ERROR_NONE); grpc_error* error =
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport destroyed");
// ContextList::Execute follows semantics of a callback function and does not
// take a ref on error
grpc_core::ContextList::Execute(cl, nullptr, error);
GRPC_ERROR_UNREF(error);
cl = nullptr; cl = nullptr;
grpc_slice_buffer_destroy_internal(&read_buffer); grpc_slice_buffer_destroy_internal(&read_buffer);

@ -21,31 +21,47 @@
#include "src/core/ext/transport/chttp2/transport/context_list.h" #include "src/core/ext/transport/chttp2/transport/context_list.h"
namespace { namespace {
void (*write_timestamps_callback_g)(void*, grpc_core::Timestamps*) = nullptr; void (*write_timestamps_callback_g)(void*, grpc_core::Timestamps*,
} grpc_error* error) = nullptr;
void* (*get_copied_context_fn_g)(void*) = nullptr;
} // namespace
namespace grpc_core { namespace grpc_core {
void ContextList::Append(ContextList** head, grpc_chttp2_stream* s) {
if (get_copied_context_fn_g == nullptr ||
write_timestamps_callback_g == nullptr) {
return;
}
/* Create a new element in the list and add it at the front */
ContextList* elem = grpc_core::New<ContextList>();
elem->trace_context_ = get_copied_context_fn_g(s->context);
elem->byte_offset_ = s->byte_counter;
elem->next_ = *head;
*head = elem;
}
void ContextList::Execute(void* arg, grpc_core::Timestamps* ts, void ContextList::Execute(void* arg, grpc_core::Timestamps* ts,
grpc_error* error) { grpc_error* error) {
ContextList* head = static_cast<ContextList*>(arg); ContextList* head = static_cast<ContextList*>(arg);
ContextList* to_be_freed; ContextList* to_be_freed;
while (head != nullptr) { while (head != nullptr) {
if (error == GRPC_ERROR_NONE && ts != nullptr) { if (write_timestamps_callback_g) {
if (write_timestamps_callback_g) { ts->byte_offset = static_cast<uint32_t>(head->byte_offset_);
ts->byte_offset = static_cast<uint32_t>(head->byte_offset_); write_timestamps_callback_g(head->trace_context_, ts, error);
write_timestamps_callback_g(head->s_->context, ts);
}
} }
GRPC_CHTTP2_STREAM_UNREF(static_cast<grpc_chttp2_stream*>(head->s_),
"timestamp");
to_be_freed = head; to_be_freed = head;
head = head->next_; head = head->next_;
grpc_core::Delete(to_be_freed); grpc_core::Delete(to_be_freed);
} }
} }
void grpc_http2_set_write_timestamps_callback( void grpc_http2_set_write_timestamps_callback(void (*fn)(void*,
void (*fn)(void*, grpc_core::Timestamps*)) { grpc_core::Timestamps*,
grpc_error* error)) {
write_timestamps_callback_g = fn; write_timestamps_callback_g = fn;
} }
void grpc_http2_set_fn_get_copied_context(void* (*fn)(void*)) {
get_copied_context_fn_g = fn;
}
} /* namespace grpc_core */ } /* namespace grpc_core */

@ -31,42 +31,23 @@ class ContextList {
public: public:
/* Creates a new element with \a context as the value and appends it to the /* Creates a new element with \a context as the value and appends it to the
* list. */ * list. */
static void Append(ContextList** head, grpc_chttp2_stream* s) { static void Append(ContextList** head, grpc_chttp2_stream* s);
/* Make sure context is not already present */
GRPC_CHTTP2_STREAM_REF(s, "timestamp");
#ifndef NDEBUG
ContextList* ptr = *head;
while (ptr != nullptr) {
if (ptr->s_ == s) {
GPR_ASSERT(
false &&
"Trying to append a stream that is already present in the list");
}
ptr = ptr->next_;
}
#endif
/* Create a new element in the list and add it at the front */
ContextList* elem = grpc_core::New<ContextList>();
elem->s_ = s;
elem->byte_offset_ = s->byte_counter;
elem->next_ = *head;
*head = elem;
}
/* Executes a function \a fn with each context in the list and \a ts. It also /* Executes a function \a fn with each context in the list and \a ts. It also
* frees up the entire list after this operation. */ * frees up the entire list after this operation. It is intended as a callback
* and hence does not take a ref on \a error */
static void Execute(void* arg, grpc_core::Timestamps* ts, grpc_error* error); static void Execute(void* arg, grpc_core::Timestamps* ts, grpc_error* error);
private: private:
grpc_chttp2_stream* s_ = nullptr; void* trace_context_ = nullptr;
ContextList* next_ = nullptr; ContextList* next_ = nullptr;
size_t byte_offset_ = 0; size_t byte_offset_ = 0;
}; };
void grpc_http2_set_write_timestamps_callback( void grpc_http2_set_write_timestamps_callback(void (*fn)(void*,
void (*fn)(void*, grpc_core::Timestamps*)); grpc_core::Timestamps*,
grpc_error* error));
void grpc_http2_set_fn_get_copied_context(void* (*fn)(void*));
} /* namespace grpc_core */ } /* namespace grpc_core */
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CONTEXT_LIST_H */ #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_CONTEXT_LIST_H */

@ -46,9 +46,21 @@ GRPCAPI grpc_channel* grpc_cronet_secure_channel_create(
"grpc_create_cronet_transport: stream_engine = %p, target=%s", engine, "grpc_create_cronet_transport: stream_engine = %p, target=%s", engine,
target); target);
// Disable client authority filter when using Cronet
grpc_arg disable_client_authority_filter_arg;
disable_client_authority_filter_arg.key =
const_cast<char*>(GRPC_ARG_DISABLE_CLIENT_AUTHORITY_FILTER);
disable_client_authority_filter_arg.type = GRPC_ARG_INTEGER;
disable_client_authority_filter_arg.value.integer = 1;
grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
args, &disable_client_authority_filter_arg, 1);
grpc_transport* ct = grpc_transport* ct =
grpc_create_cronet_transport(engine, target, args, reserved); grpc_create_cronet_transport(engine, target, new_args, reserved);
grpc_core::ExecCtx exec_ctx; grpc_core::ExecCtx exec_ctx;
return grpc_channel_create(target, args, GRPC_CLIENT_DIRECT_CHANNEL, ct); grpc_channel* channel =
grpc_channel_create(target, new_args, GRPC_CLIENT_DIRECT_CHANNEL, ct);
grpc_channel_args_destroy(new_args);
return channel;
} }

@ -335,6 +335,9 @@ static void add_to_storage(struct stream_obj* s,
/* add new op at the beginning of the linked list. The memory is freed /* add new op at the beginning of the linked list. The memory is freed
in remove_from_storage */ in remove_from_storage */
op_and_state* new_op = grpc_core::New<op_and_state>(s, *op); op_and_state* new_op = grpc_core::New<op_and_state>(s, *op);
// Pontential fix to crash on GPR_ASSERT(!curr->done)
// TODO (mxyan): check if this is indeed necessary.
new_op->done = false;
gpr_mu_lock(&s->mu); gpr_mu_lock(&s->mu);
storage->head = new_op; storage->head = new_op;
storage->num_pending_ops++; storage->num_pending_ops++;
@ -391,7 +394,7 @@ static void execute_from_storage(stream_obj* s) {
gpr_mu_lock(&s->mu); gpr_mu_lock(&s->mu);
for (struct op_and_state* curr = s->storage.head; curr != nullptr;) { for (struct op_and_state* curr = s->storage.head; curr != nullptr;) {
CRONET_LOG(GPR_DEBUG, "calling op at %p. done = %d", curr, curr->done); CRONET_LOG(GPR_DEBUG, "calling op at %p. done = %d", curr, curr->done);
GPR_ASSERT(curr->done == 0); GPR_ASSERT(!curr->done);
enum e_op_result result = execute_stream_op(curr); enum e_op_result result = execute_stream_op(curr);
CRONET_LOG(GPR_DEBUG, "execute_stream_op[%p] returns %s", curr, CRONET_LOG(GPR_DEBUG, "execute_stream_op[%p] returns %s", curr,
op_result_string(result)); op_result_string(result));
@ -400,13 +403,12 @@ static void execute_from_storage(stream_obj* s) {
struct op_and_state* next = curr->next; struct op_and_state* next = curr->next;
remove_from_storage(s, curr); remove_from_storage(s, curr);
curr = next; curr = next;
} } else if (result == NO_ACTION_POSSIBLE) {
/* continue processing the same op if ACTION_TAKEN_WITHOUT_CALLBACK */
if (result == NO_ACTION_POSSIBLE) {
curr = curr->next; curr = curr->next;
} else if (result == ACTION_TAKEN_WITH_CALLBACK) { } else if (result == ACTION_TAKEN_WITH_CALLBACK) {
/* wait for the callback */
break; break;
} } /* continue processing the same op if ACTION_TAKEN_WITHOUT_CALLBACK */
} }
gpr_mu_unlock(&s->mu); gpr_mu_unlock(&s->mu);
} }

@ -52,62 +52,52 @@ CFStreamHandle* CFStreamHandle::CreateStreamHandle(
void CFStreamHandle::ReadCallback(CFReadStreamRef stream, void CFStreamHandle::ReadCallback(CFReadStreamRef stream,
CFStreamEventType type, CFStreamEventType type,
void* client_callback_info) { void* client_callback_info) {
grpc_core::ExecCtx exec_ctx;
CFStreamHandle* handle = static_cast<CFStreamHandle*>(client_callback_info); CFStreamHandle* handle = static_cast<CFStreamHandle*>(client_callback_info);
CFSTREAM_HANDLE_REF(handle, "read callback"); if (grpc_tcp_trace.enabled()) {
dispatch_async( gpr_log(GPR_DEBUG, "CFStream ReadCallback (%p, %p, %lu, %p)", handle,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ stream, type, client_callback_info);
grpc_core::ExecCtx exec_ctx; }
if (grpc_tcp_trace.enabled()) { switch (type) {
gpr_log(GPR_DEBUG, "CFStream ReadCallback (%p, %p, %lu, %p)", handle, case kCFStreamEventOpenCompleted:
stream, type, client_callback_info); handle->open_event_.SetReady();
} break;
switch (type) { case kCFStreamEventHasBytesAvailable:
case kCFStreamEventOpenCompleted: case kCFStreamEventEndEncountered:
handle->open_event_.SetReady(); handle->read_event_.SetReady();
break; break;
case kCFStreamEventHasBytesAvailable: case kCFStreamEventErrorOccurred:
case kCFStreamEventEndEncountered: handle->open_event_.SetReady();
handle->read_event_.SetReady(); handle->read_event_.SetReady();
break; break;
case kCFStreamEventErrorOccurred: default:
handle->open_event_.SetReady(); GPR_UNREACHABLE_CODE(return );
handle->read_event_.SetReady(); }
break;
default:
GPR_UNREACHABLE_CODE(return );
}
CFSTREAM_HANDLE_UNREF(handle, "read callback");
});
} }
void CFStreamHandle::WriteCallback(CFWriteStreamRef stream, void CFStreamHandle::WriteCallback(CFWriteStreamRef stream,
CFStreamEventType type, CFStreamEventType type,
void* clientCallBackInfo) { void* clientCallBackInfo) {
grpc_core::ExecCtx exec_ctx;
CFStreamHandle* handle = static_cast<CFStreamHandle*>(clientCallBackInfo); CFStreamHandle* handle = static_cast<CFStreamHandle*>(clientCallBackInfo);
CFSTREAM_HANDLE_REF(handle, "write callback"); if (grpc_tcp_trace.enabled()) {
dispatch_async( gpr_log(GPR_DEBUG, "CFStream WriteCallback (%p, %p, %lu, %p)", handle,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ stream, type, clientCallBackInfo);
grpc_core::ExecCtx exec_ctx; }
if (grpc_tcp_trace.enabled()) { switch (type) {
gpr_log(GPR_DEBUG, "CFStream WriteCallback (%p, %p, %lu, %p)", handle, case kCFStreamEventOpenCompleted:
stream, type, clientCallBackInfo); handle->open_event_.SetReady();
} break;
switch (type) { case kCFStreamEventCanAcceptBytes:
case kCFStreamEventOpenCompleted: case kCFStreamEventEndEncountered:
handle->open_event_.SetReady(); handle->write_event_.SetReady();
break; break;
case kCFStreamEventCanAcceptBytes: case kCFStreamEventErrorOccurred:
case kCFStreamEventEndEncountered: handle->open_event_.SetReady();
handle->write_event_.SetReady(); handle->write_event_.SetReady();
break; break;
case kCFStreamEventErrorOccurred: default:
handle->open_event_.SetReady(); GPR_UNREACHABLE_CODE(return );
handle->write_event_.SetReady(); }
break;
default:
GPR_UNREACHABLE_CODE(return );
}
CFSTREAM_HANDLE_UNREF(handle, "write callback");
});
} }
CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream, CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream,
@ -116,6 +106,7 @@ CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream,
open_event_.InitEvent(); open_event_.InitEvent();
read_event_.InitEvent(); read_event_.InitEvent();
write_event_.InitEvent(); write_event_.InitEvent();
dispatch_queue_ = dispatch_queue_create(nullptr, DISPATCH_QUEUE_SERIAL);
CFStreamClientContext ctx = {0, static_cast<void*>(this), CFStreamClientContext ctx = {0, static_cast<void*>(this),
CFStreamHandle::Retain, CFStreamHandle::Release, CFStreamHandle::Retain, CFStreamHandle::Release,
nil}; nil};
@ -129,10 +120,8 @@ CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream,
kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes |
kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
CFStreamHandle::WriteCallback, &ctx); CFStreamHandle::WriteCallback, &ctx);
CFReadStreamScheduleWithRunLoop(read_stream, CFRunLoopGetMain(), CFReadStreamSetDispatchQueue(read_stream, dispatch_queue_);
kCFRunLoopCommonModes); CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue_);
CFWriteStreamScheduleWithRunLoop(write_stream, CFRunLoopGetMain(),
kCFRunLoopCommonModes);
} }
CFStreamHandle::~CFStreamHandle() { CFStreamHandle::~CFStreamHandle() {

@ -62,6 +62,8 @@ class CFStreamHandle final {
grpc_core::LockfreeEvent read_event_; grpc_core::LockfreeEvent read_event_;
grpc_core::LockfreeEvent write_event_; grpc_core::LockfreeEvent write_event_;
dispatch_queue_t dispatch_queue_;
gpr_refcount refcount_; gpr_refcount refcount_;
}; };

@ -29,6 +29,7 @@
#include "src/core/lib/debug/stats.h" #include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/iomgr.h"
#include "src/core/lib/profiling/timers.h" #include "src/core/lib/profiling/timers.h"
grpc_core::DebugOnlyTraceFlag grpc_combiner_trace(false, "combiner"); grpc_core::DebugOnlyTraceFlag grpc_combiner_trace(false, "combiner");
@ -228,8 +229,14 @@ bool grpc_combiner_continue_exec_ctx() {
grpc_core::ExecCtx::Get()->IsReadyToFinish(), grpc_core::ExecCtx::Get()->IsReadyToFinish(),
lock->time_to_execute_final_list)); lock->time_to_execute_final_list));
// offload only if all the following conditions are true:
// 1. the combiner is contended and has more than one closure to execute
// 2. the current execution context needs to finish as soon as possible
// 3. the DEFAULT executor is threaded
// 4. the current thread is not a worker for any background poller
if (contended && grpc_core::ExecCtx::Get()->IsReadyToFinish() && if (contended && grpc_core::ExecCtx::Get()->IsReadyToFinish() &&
grpc_executor_is_threaded()) { grpc_executor_is_threaded() &&
!grpc_iomgr_is_any_background_poller_thread()) {
GPR_TIMER_MARK("offload_from_finished_exec_ctx", 0); GPR_TIMER_MARK("offload_from_finished_exec_ctx", 0);
// this execution context wants to move on: schedule remaining work to be // this execution context wants to move on: schedule remaining work to be
// picked up on the executor // picked up on the executor

@ -1242,6 +1242,8 @@ static void pollset_set_del_pollset_set(grpc_pollset_set* bag,
* Event engine binding * Event engine binding
*/ */
static bool is_any_background_poller_thread(void) { return false; }
static void shutdown_background_closure(void) {} static void shutdown_background_closure(void) {}
static void shutdown_engine(void) { static void shutdown_engine(void) {
@ -1287,6 +1289,7 @@ static const grpc_event_engine_vtable vtable = {
pollset_set_add_fd, pollset_set_add_fd,
pollset_set_del_fd, pollset_set_del_fd,
is_any_background_poller_thread,
shutdown_background_closure, shutdown_background_closure,
shutdown_engine, shutdown_engine,
}; };

@ -1604,6 +1604,8 @@ static void pollset_set_del_pollset_set(grpc_pollset_set* bag,
* Event engine binding * Event engine binding
*/ */
static bool is_any_background_poller_thread(void) { return false; }
static void shutdown_background_closure(void) {} static void shutdown_background_closure(void) {}
static void shutdown_engine(void) { static void shutdown_engine(void) {
@ -1644,6 +1646,7 @@ static const grpc_event_engine_vtable vtable = {
pollset_set_add_fd, pollset_set_add_fd,
pollset_set_del_fd, pollset_set_del_fd,
is_any_background_poller_thread,
shutdown_background_closure, shutdown_background_closure,
shutdown_engine, shutdown_engine,
}; };

@ -1782,6 +1782,8 @@ static void global_cv_fd_table_shutdown() {
* event engine binding * event engine binding
*/ */
static bool is_any_background_poller_thread(void) { return false; }
static void shutdown_background_closure(void) {} static void shutdown_background_closure(void) {}
static void shutdown_engine(void) { static void shutdown_engine(void) {
@ -1828,6 +1830,7 @@ static const grpc_event_engine_vtable vtable = {
pollset_set_add_fd, pollset_set_add_fd,
pollset_set_del_fd, pollset_set_del_fd,
is_any_background_poller_thread,
shutdown_background_closure, shutdown_background_closure,
shutdown_engine, shutdown_engine,
}; };

@ -399,6 +399,10 @@ void grpc_pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd) {
g_event_engine->pollset_set_del_fd(pollset_set, fd); g_event_engine->pollset_set_del_fd(pollset_set, fd);
} }
bool grpc_is_any_background_poller_thread(void) {
return g_event_engine->is_any_background_poller_thread();
}
void grpc_shutdown_background_closure(void) { void grpc_shutdown_background_closure(void) {
g_event_engine->shutdown_background_closure(); g_event_engine->shutdown_background_closure();
} }

@ -80,6 +80,7 @@ typedef struct grpc_event_engine_vtable {
void (*pollset_set_add_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd); void (*pollset_set_add_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd);
void (*pollset_set_del_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd); void (*pollset_set_del_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd);
bool (*is_any_background_poller_thread)(void);
void (*shutdown_background_closure)(void); void (*shutdown_background_closure)(void);
void (*shutdown_engine)(void); void (*shutdown_engine)(void);
} grpc_event_engine_vtable; } grpc_event_engine_vtable;
@ -181,6 +182,9 @@ void grpc_pollset_add_fd(grpc_pollset* pollset, struct grpc_fd* fd);
void grpc_pollset_set_add_fd(grpc_pollset_set* pollset_set, grpc_fd* fd); void grpc_pollset_set_add_fd(grpc_pollset_set* pollset_set, grpc_fd* fd);
void grpc_pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd); void grpc_pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd);
/* Returns true if the caller is a worker thread for any background poller. */
bool grpc_is_any_background_poller_thread();
/* Shut down all the closures registered in the background poller. */ /* Shut down all the closures registered in the background poller. */
void grpc_shutdown_background_closure(); void grpc_shutdown_background_closure();

@ -16,21 +16,15 @@
* *
*/ */
#include <grpc/support/port_platform.h> #ifndef GRPC_CORE_LIB_IOMGR_GRPC_IF_NAMETOINDEX_H
#define GRPC_CORE_LIB_IOMGR_GRPC_IF_NAMETOINDEX_H
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/network_status_tracker.h"
void grpc_network_status_shutdown(void) {}
void grpc_network_status_init(void) { #include <grpc/support/port_platform.h>
// TODO(makarandd): Install callback with OS to monitor network status.
}
void grpc_destroy_network_status_monitor() {}
void grpc_network_status_register_endpoint(grpc_endpoint* ep) { (void)ep; } #include <stddef.h>
void grpc_network_status_unregister_endpoint(grpc_endpoint* ep) { (void)ep; } /* Returns the interface index corresponding to the interface "name" provided.
* Returns non-zero upon success, and zero upon failure. */
uint32_t grpc_if_nametoindex(char* name);
void grpc_network_status_shutdown_all_endpoints() {} #endif /* GRPC_CORE_LIB_IOMGR_GRPC_IF_NAMETOINDEX_H */

@ -0,0 +1,42 @@
/*
*
* Copyright 2016 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/support/port_platform.h>
#include "src/core/lib/iomgr/port.h"
#if GRPC_IF_NAMETOINDEX == 1 && defined(GRPC_POSIX_SOCKET_IF_NAMETOINDEX)
#include "src/core/lib/iomgr/grpc_if_nametoindex.h"
#include <errno.h>
#include <net/if.h>
#include <grpc/support/log.h>
uint32_t grpc_if_nametoindex(char* name) {
uint32_t out = if_nametoindex(name);
if (out == 0) {
gpr_log(GPR_DEBUG, "if_nametoindex failed for name %s. errno %d", name,
errno);
}
return out;
}
#endif /* GRPC_IF_NAMETOINDEX == 1 && \
defined(GRPC_POSIX_SOCKET_IF_NAMETOINDEX) */

@ -16,17 +16,23 @@
* *
*/ */
#ifndef GRPC_CORE_LIB_IOMGR_NETWORK_STATUS_TRACKER_H
#define GRPC_CORE_LIB_IOMGR_NETWORK_STATUS_TRACKER_H
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/port.h"
void grpc_network_status_init(void); #if GRPC_IF_NAMETOINDEX == 0 || !defined(GRPC_POSIX_SOCKET_IF_NAMETOINDEX)
void grpc_network_status_shutdown(void);
void grpc_network_status_register_endpoint(grpc_endpoint* ep); #include "src/core/lib/iomgr/grpc_if_nametoindex.h"
void grpc_network_status_unregister_endpoint(grpc_endpoint* ep);
void grpc_network_status_shutdown_all_endpoints();
#endif /* GRPC_CORE_LIB_IOMGR_NETWORK_STATUS_TRACKER_H */ #include <grpc/support/log.h>
uint32_t grpc_if_nametoindex(char* name) {
gpr_log(GPR_DEBUG,
"Not attempting to convert interface name %s to index for current "
"platform.",
name);
return 0;
}
#endif /* GRPC_IF_NAMETOINDEX == 0 || \
!defined(GRPC_POSIX_SOCKET_IF_NAMETOINDEX) */

@ -38,7 +38,6 @@
#include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/internal_errqueue.h" #include "src/core/lib/iomgr/internal_errqueue.h"
#include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/network_status_tracker.h"
#include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/iomgr/timer_manager.h" #include "src/core/lib/iomgr/timer_manager.h"
@ -57,7 +56,6 @@ void grpc_iomgr_init() {
grpc_timer_list_init(); grpc_timer_list_init();
g_root_object.next = g_root_object.prev = &g_root_object; g_root_object.next = g_root_object.prev = &g_root_object;
g_root_object.name = (char*)"root"; g_root_object.name = (char*)"root";
grpc_network_status_init();
grpc_iomgr_platform_init(); grpc_iomgr_platform_init();
grpc_core::grpc_errqueue_init(); grpc_core::grpc_errqueue_init();
} }
@ -152,7 +150,6 @@ void grpc_iomgr_shutdown() {
gpr_mu_unlock(&g_mu); gpr_mu_unlock(&g_mu);
grpc_iomgr_platform_shutdown(); grpc_iomgr_platform_shutdown();
grpc_network_status_shutdown();
gpr_mu_destroy(&g_mu); gpr_mu_destroy(&g_mu);
gpr_cv_destroy(&g_rcv); gpr_cv_destroy(&g_rcv);
} }
@ -161,6 +158,10 @@ void grpc_iomgr_shutdown_background_closure() {
grpc_iomgr_platform_shutdown_background_closure(); grpc_iomgr_platform_shutdown_background_closure();
} }
bool grpc_iomgr_is_any_background_poller_thread() {
return grpc_iomgr_platform_is_any_background_poller_thread();
}
void grpc_iomgr_register_object(grpc_iomgr_object* obj, const char* name) { void grpc_iomgr_register_object(grpc_iomgr_object* obj, const char* name) {
obj->name = gpr_strdup(name); obj->name = gpr_strdup(name);
gpr_mu_lock(&g_mu); gpr_mu_lock(&g_mu);

@ -39,6 +39,9 @@ void grpc_iomgr_shutdown();
* background poller. */ * background poller. */
void grpc_iomgr_shutdown_background_closure(); void grpc_iomgr_shutdown_background_closure();
/** Returns true if the caller is a worker thread for any background poller. */
bool grpc_iomgr_is_any_background_poller_thread();
/* Exposed only for testing */ /* Exposed only for testing */
size_t grpc_iomgr_count_objects_for_testing(); size_t grpc_iomgr_count_objects_for_testing();

@ -41,10 +41,14 @@ static void iomgr_platform_init(void) {
static void iomgr_platform_flush(void) {} static void iomgr_platform_flush(void) {}
static void iomgr_platform_shutdown(void) { grpc_pollset_global_shutdown(); } static void iomgr_platform_shutdown(void) { grpc_pollset_global_shutdown(); }
static void iomgr_platform_shutdown_background_closure(void) {} static void iomgr_platform_shutdown_background_closure(void) {}
static bool iomgr_platform_is_any_background_poller_thread(void) {
return false;
}
static grpc_iomgr_platform_vtable vtable = { static grpc_iomgr_platform_vtable vtable = {
iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown, iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown,
iomgr_platform_shutdown_background_closure}; iomgr_platform_shutdown_background_closure,
iomgr_platform_is_any_background_poller_thread};
void grpc_custom_iomgr_init(grpc_socket_vtable* socket, void grpc_custom_iomgr_init(grpc_socket_vtable* socket,
grpc_custom_resolver_vtable* resolver, grpc_custom_resolver_vtable* resolver,

@ -45,3 +45,7 @@ void grpc_iomgr_platform_shutdown() { iomgr_platform_vtable->shutdown(); }
void grpc_iomgr_platform_shutdown_background_closure() { void grpc_iomgr_platform_shutdown_background_closure() {
iomgr_platform_vtable->shutdown_background_closure(); iomgr_platform_vtable->shutdown_background_closure();
} }
bool grpc_iomgr_platform_is_any_background_poller_thread() {
return iomgr_platform_vtable->is_any_background_poller_thread();
}

@ -36,6 +36,7 @@ typedef struct grpc_iomgr_platform_vtable {
void (*flush)(void); void (*flush)(void);
void (*shutdown)(void); void (*shutdown)(void);
void (*shutdown_background_closure)(void); void (*shutdown_background_closure)(void);
bool (*is_any_background_poller_thread)(void);
} grpc_iomgr_platform_vtable; } grpc_iomgr_platform_vtable;
void grpc_iomgr_register_object(grpc_iomgr_object* obj, const char* name); void grpc_iomgr_register_object(grpc_iomgr_object* obj, const char* name);
@ -56,6 +57,9 @@ void grpc_iomgr_platform_shutdown(void);
/** shut down all the closures registered in the background poller */ /** shut down all the closures registered in the background poller */
void grpc_iomgr_platform_shutdown_background_closure(void); void grpc_iomgr_platform_shutdown_background_closure(void);
/** return true is the caller is a worker thread for any background poller */
bool grpc_iomgr_platform_is_any_background_poller_thread(void);
bool grpc_iomgr_abort_on_leaks(void); bool grpc_iomgr_abort_on_leaks(void);
#endif /* GRPC_CORE_LIB_IOMGR_IOMGR_INTERNAL_H */ #endif /* GRPC_CORE_LIB_IOMGR_IOMGR_INTERNAL_H */

@ -55,9 +55,14 @@ static void iomgr_platform_shutdown_background_closure(void) {
grpc_shutdown_background_closure(); grpc_shutdown_background_closure();
} }
static bool iomgr_platform_is_any_background_poller_thread(void) {
return grpc_is_any_background_poller_thread();
}
static grpc_iomgr_platform_vtable vtable = { static grpc_iomgr_platform_vtable vtable = {
iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown, iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown,
iomgr_platform_shutdown_background_closure}; iomgr_platform_shutdown_background_closure,
iomgr_platform_is_any_background_poller_thread};
void grpc_set_default_iomgr_platform() { void grpc_set_default_iomgr_platform() {
grpc_set_tcp_client_impl(&grpc_posix_tcp_client_vtable); grpc_set_tcp_client_impl(&grpc_posix_tcp_client_vtable);

@ -58,9 +58,14 @@ static void iomgr_platform_shutdown_background_closure(void) {
grpc_shutdown_background_closure(); grpc_shutdown_background_closure();
} }
static bool iomgr_platform_is_any_background_poller_thread(void) {
return grpc_is_any_background_poller_thread();
}
static grpc_iomgr_platform_vtable vtable = { static grpc_iomgr_platform_vtable vtable = {
iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown, iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown,
iomgr_platform_shutdown_background_closure}; iomgr_platform_shutdown_background_closure,
iomgr_platform_is_any_background_poller_thread};
void grpc_set_default_iomgr_platform() { void grpc_set_default_iomgr_platform() {
char* enable_cfstream = getenv(grpc_cfstream_env_var); char* enable_cfstream = getenv(grpc_cfstream_env_var);

@ -73,9 +73,14 @@ static void iomgr_platform_shutdown(void) {
static void iomgr_platform_shutdown_background_closure(void) {} static void iomgr_platform_shutdown_background_closure(void) {}
static bool iomgr_platform_is_any_background_poller_thread(void) {
return false;
}
static grpc_iomgr_platform_vtable vtable = { static grpc_iomgr_platform_vtable vtable = {
iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown, iomgr_platform_init, iomgr_platform_flush, iomgr_platform_shutdown,
iomgr_platform_shutdown_background_closure}; iomgr_platform_shutdown_background_closure,
iomgr_platform_is_any_background_poller_thread};
void grpc_set_default_iomgr_platform() { void grpc_set_default_iomgr_platform() {
grpc_set_tcp_client_impl(&grpc_windows_tcp_client_vtable); grpc_set_tcp_client_impl(&grpc_windows_tcp_client_vtable);

@ -184,6 +184,7 @@
#define GRPC_POSIX_SOCKET_EV_EPOLLEX 1 #define GRPC_POSIX_SOCKET_EV_EPOLLEX 1
#define GRPC_POSIX_SOCKET_EV_POLL 1 #define GRPC_POSIX_SOCKET_EV_POLL 1
#define GRPC_POSIX_SOCKET_EV_EPOLL1 1 #define GRPC_POSIX_SOCKET_EV_EPOLL1 1
#define GRPC_POSIX_SOCKET_IF_NAMETOINDEX 1
#define GRPC_POSIX_SOCKET_IOMGR 1 #define GRPC_POSIX_SOCKET_IOMGR 1
#define GRPC_POSIX_SOCKET_RESOLVE_ADDRESS 1 #define GRPC_POSIX_SOCKET_RESOLVE_ADDRESS 1
#define GRPC_POSIX_SOCKET_SOCKADDR 1 #define GRPC_POSIX_SOCKET_SOCKADDR 1

@ -665,6 +665,7 @@ void grpc_resource_quota_unref_internal(grpc_resource_quota* resource_quota) {
GPR_ASSERT(resource_quota->num_threads_allocated == 0); GPR_ASSERT(resource_quota->num_threads_allocated == 0);
GRPC_COMBINER_UNREF(resource_quota->combiner, "resource_quota"); GRPC_COMBINER_UNREF(resource_quota->combiner, "resource_quota");
gpr_free(resource_quota->name); gpr_free(resource_quota->name);
gpr_mu_destroy(&resource_quota->thread_count_mu);
gpr_free(resource_quota); gpr_free(resource_quota);
} }
} }

@ -31,7 +31,6 @@
#include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/iomgr_custom.h" #include "src/core/lib/iomgr/iomgr_custom.h"
#include "src/core/lib/iomgr/network_status_tracker.h"
#include "src/core/lib/iomgr/resource_quota.h" #include "src/core/lib/iomgr/resource_quota.h"
#include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/iomgr/tcp_client.h"
#include "src/core/lib/iomgr/tcp_custom.h" #include "src/core/lib/iomgr/tcp_custom.h"
@ -309,7 +308,6 @@ static void custom_close_callback(grpc_custom_socket* socket) {
} }
static void endpoint_destroy(grpc_endpoint* ep) { static void endpoint_destroy(grpc_endpoint* ep) {
grpc_network_status_unregister_endpoint(ep);
custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)ep; custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)ep;
grpc_custom_socket_vtable->close(tcp->socket, custom_close_callback); grpc_custom_socket_vtable->close(tcp->socket, custom_close_callback);
} }
@ -361,8 +359,6 @@ grpc_endpoint* custom_tcp_endpoint_create(grpc_custom_socket* socket,
tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string); tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string);
grpc_resource_user_slice_allocator_init( grpc_resource_user_slice_allocator_init(
&tcp->slice_allocator, tcp->resource_user, tcp_read_allocation_done, tcp); &tcp->slice_allocator, tcp->resource_user, tcp_read_allocation_done, tcp);
/* Tell network status tracking code about the new endpoint */
grpc_network_status_register_endpoint(&tcp->base);
return &tcp->base; return &tcp->base;
} }

@ -22,7 +22,6 @@
#ifdef GRPC_POSIX_SOCKET_TCP #ifdef GRPC_POSIX_SOCKET_TCP
#include "src/core/lib/iomgr/network_status_tracker.h"
#include "src/core/lib/iomgr/tcp_posix.h" #include "src/core/lib/iomgr/tcp_posix.h"
#include <errno.h> #include <errno.h>
@ -127,9 +126,8 @@ struct grpc_tcp {
bool socket_ts_enabled; /* True if timestamping options are set on the socket bool socket_ts_enabled; /* True if timestamping options are set on the socket
*/ */
bool ts_capable; /* Cache whether we can set timestamping options */ bool ts_capable; /* Cache whether we can set timestamping options */
gpr_atm gpr_atm stop_error_notification; /* Set to 1 if we do not want to be notified
stop_error_notification; /* Set to 1 if we do not want to be notified on on errors anymore */
errors anymore */
}; };
struct backup_poller { struct backup_poller {
@ -388,7 +386,6 @@ static void tcp_ref(grpc_tcp* tcp) { gpr_ref(&tcp->refcount); }
#endif #endif
static void tcp_destroy(grpc_endpoint* ep) { static void tcp_destroy(grpc_endpoint* ep) {
grpc_network_status_unregister_endpoint(ep);
grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep); grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer); grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
if (grpc_event_engine_can_track_errors()) { if (grpc_event_engine_can_track_errors()) {
@ -701,7 +698,8 @@ static void process_errors(grpc_tcp* tcp) {
union { union {
char rbuf[1024 /*CMSG_SPACE(sizeof(scm_timestamping)) + char rbuf[1024 /*CMSG_SPACE(sizeof(scm_timestamping)) +
CMSG_SPACE(sizeof(sock_extended_err) + sizeof(sockaddr_in))*/]; CMSG_SPACE(sizeof(sock_extended_err) + sizeof(sockaddr_in))*/
];
struct cmsghdr align; struct cmsghdr align;
} aligned_buf; } aligned_buf;
memset(&aligned_buf, 0, sizeof(aligned_buf)); memset(&aligned_buf, 0, sizeof(aligned_buf));
@ -1131,8 +1129,6 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string); tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string);
grpc_resource_user_slice_allocator_init( grpc_resource_user_slice_allocator_init(
&tcp->slice_allocator, tcp->resource_user, tcp_read_allocation_done, tcp); &tcp->slice_allocator, tcp->resource_user, tcp_read_allocation_done, tcp);
/* Tell network status tracker about new endpoint */
grpc_network_status_register_endpoint(&tcp->base);
grpc_resource_quota_unref_internal(resource_quota); grpc_resource_quota_unref_internal(resource_quota);
gpr_mu_init(&tcp->tb_mu); gpr_mu_init(&tcp->tb_mu);
tcp->tb_head = nullptr; tcp->tb_head = nullptr;
@ -1159,7 +1155,6 @@ int grpc_tcp_fd(grpc_endpoint* ep) {
void grpc_tcp_destroy_and_release_fd(grpc_endpoint* ep, int* fd, void grpc_tcp_destroy_and_release_fd(grpc_endpoint* ep, int* fd,
grpc_closure* done) { grpc_closure* done) {
grpc_network_status_unregister_endpoint(ep);
grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep); grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
GPR_ASSERT(ep->vtable == &vtable); GPR_ASSERT(ep->vtable == &vtable);
tcp->release_fd = fd; tcp->release_fd = fd;

@ -33,7 +33,6 @@
#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/iomgr_custom.h" #include "src/core/lib/iomgr/iomgr_custom.h"
#include "src/core/lib/iomgr/network_status_tracker.h"
#include "src/core/lib/iomgr/resolve_address_custom.h" #include "src/core/lib/iomgr/resolve_address_custom.h"
#include "src/core/lib/iomgr/resource_quota.h" #include "src/core/lib/iomgr/resource_quota.h"
#include "src/core/lib/iomgr/tcp_custom.h" #include "src/core/lib/iomgr/tcp_custom.h"

@ -24,7 +24,6 @@
#include <limits.h> #include <limits.h>
#include "src/core/lib/iomgr/network_status_tracker.h"
#include "src/core/lib/iomgr/sockaddr_windows.h" #include "src/core/lib/iomgr/sockaddr_windows.h"
#include <grpc/slice_buffer.h> #include <grpc/slice_buffer.h>
@ -42,6 +41,7 @@
#include "src/core/lib/iomgr/tcp_windows.h" #include "src/core/lib/iomgr/tcp_windows.h"
#include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#if defined(__MSYS__) && defined(GPR_ARCH_64) #if defined(__MSYS__) && defined(GPR_ARCH_64)
/* Nasty workaround for nasty bug when using the 64 bits msys compiler /* Nasty workaround for nasty bug when using the 64 bits msys compiler
@ -112,7 +112,10 @@ typedef struct grpc_tcp {
grpc_closure* read_cb; grpc_closure* read_cb;
grpc_closure* write_cb; grpc_closure* write_cb;
grpc_slice read_slice;
/* garbage after the last read */
grpc_slice_buffer last_read_buffer;
grpc_slice_buffer* write_slices; grpc_slice_buffer* write_slices;
grpc_slice_buffer* read_slices; grpc_slice_buffer* read_slices;
@ -131,6 +134,7 @@ static void tcp_free(grpc_tcp* tcp) {
grpc_winsocket_destroy(tcp->socket); grpc_winsocket_destroy(tcp->socket);
gpr_mu_destroy(&tcp->mu); gpr_mu_destroy(&tcp->mu);
gpr_free(tcp->peer_string); gpr_free(tcp->peer_string);
grpc_slice_buffer_destroy_internal(&tcp->last_read_buffer);
grpc_resource_user_unref(tcp->resource_user); grpc_resource_user_unref(tcp->resource_user);
if (tcp->shutting_down) GRPC_ERROR_UNREF(tcp->shutdown_error); if (tcp->shutting_down) GRPC_ERROR_UNREF(tcp->shutdown_error);
gpr_free(tcp); gpr_free(tcp);
@ -179,9 +183,12 @@ static void on_read(void* tcpp, grpc_error* error) {
grpc_tcp* tcp = (grpc_tcp*)tcpp; grpc_tcp* tcp = (grpc_tcp*)tcpp;
grpc_closure* cb = tcp->read_cb; grpc_closure* cb = tcp->read_cb;
grpc_winsocket* socket = tcp->socket; grpc_winsocket* socket = tcp->socket;
grpc_slice sub;
grpc_winsocket_callback_info* info = &socket->read_info; grpc_winsocket_callback_info* info = &socket->read_info;
if (grpc_tcp_trace.enabled()) {
gpr_log(GPR_INFO, "TCP:%p on_read", tcp);
}
GRPC_ERROR_REF(error); GRPC_ERROR_REF(error);
if (error == GRPC_ERROR_NONE) { if (error == GRPC_ERROR_NONE) {
@ -189,13 +196,35 @@ static void on_read(void* tcpp, grpc_error* error) {
char* utf8_message = gpr_format_message(info->wsa_error); char* utf8_message = gpr_format_message(info->wsa_error);
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(utf8_message); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(utf8_message);
gpr_free(utf8_message); gpr_free(utf8_message);
grpc_slice_unref_internal(tcp->read_slice); grpc_slice_buffer_reset_and_unref_internal(tcp->read_slices);
} else { } else {
if (info->bytes_transfered != 0 && !tcp->shutting_down) { if (info->bytes_transfered != 0 && !tcp->shutting_down) {
sub = grpc_slice_sub_no_ref(tcp->read_slice, 0, info->bytes_transfered); GPR_ASSERT((size_t)info->bytes_transfered <= tcp->read_slices->length);
grpc_slice_buffer_add(tcp->read_slices, sub); if (static_cast<size_t>(info->bytes_transfered) !=
tcp->read_slices->length) {
grpc_slice_buffer_trim_end(
tcp->read_slices,
tcp->read_slices->length -
static_cast<size_t>(info->bytes_transfered),
&tcp->last_read_buffer);
}
GPR_ASSERT((size_t)info->bytes_transfered == tcp->read_slices->length);
if (grpc_tcp_trace.enabled()) {
size_t i;
for (i = 0; i < tcp->read_slices->count; i++) {
char* dump = grpc_dump_slice(tcp->read_slices->slices[i],
GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_INFO, "READ %p (peer=%s): %s", tcp, tcp->peer_string,
dump);
gpr_free(dump);
}
}
} else { } else {
grpc_slice_unref_internal(tcp->read_slice); if (grpc_tcp_trace.enabled()) {
gpr_log(GPR_INFO, "TCP:%p unref read_slice", tcp);
}
grpc_slice_buffer_reset_and_unref_internal(tcp->read_slices);
error = tcp->shutting_down error = tcp->shutting_down
? GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( ? GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
"TCP stream shutting down", &tcp->shutdown_error, 1) "TCP stream shutting down", &tcp->shutdown_error, 1)
@ -209,6 +238,8 @@ static void on_read(void* tcpp, grpc_error* error) {
GRPC_CLOSURE_SCHED(cb, error); GRPC_CLOSURE_SCHED(cb, error);
} }
#define DEFAULT_TARGET_READ_SIZE 8192
#define MAX_WSABUF_COUNT 16
static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices, static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices,
grpc_closure* cb) { grpc_closure* cb) {
grpc_tcp* tcp = (grpc_tcp*)ep; grpc_tcp* tcp = (grpc_tcp*)ep;
@ -217,7 +248,12 @@ static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices,
int status; int status;
DWORD bytes_read = 0; DWORD bytes_read = 0;
DWORD flags = 0; DWORD flags = 0;
WSABUF buffer; WSABUF buffers[MAX_WSABUF_COUNT];
size_t i;
if (grpc_tcp_trace.enabled()) {
gpr_log(GPR_INFO, "TCP:%p win_read", tcp);
}
if (tcp->shutting_down) { if (tcp->shutting_down) {
GRPC_CLOSURE_SCHED( GRPC_CLOSURE_SCHED(
@ -229,18 +265,27 @@ static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices,
tcp->read_cb = cb; tcp->read_cb = cb;
tcp->read_slices = read_slices; tcp->read_slices = read_slices;
grpc_slice_buffer_reset_and_unref_internal(read_slices); grpc_slice_buffer_reset_and_unref_internal(read_slices);
grpc_slice_buffer_swap(read_slices, &tcp->last_read_buffer);
tcp->read_slice = GRPC_SLICE_MALLOC(8192); if (tcp->read_slices->length < DEFAULT_TARGET_READ_SIZE / 2 &&
tcp->read_slices->count < MAX_WSABUF_COUNT) {
// TODO(jtattermusch): slice should be allocated using resource quota
grpc_slice_buffer_add(tcp->read_slices,
GRPC_SLICE_MALLOC(DEFAULT_TARGET_READ_SIZE));
}
buffer.len = (ULONG)GRPC_SLICE_LENGTH( GPR_ASSERT(tcp->read_slices->count <= MAX_WSABUF_COUNT);
tcp->read_slice); // we know slice size fits in 32bit. for (i = 0; i < tcp->read_slices->count; i++) {
buffer.buf = (char*)GRPC_SLICE_START_PTR(tcp->read_slice); buffers[i].len = (ULONG)GRPC_SLICE_LENGTH(
tcp->read_slices->slices[i]); // we know slice size fits in 32bit.
buffers[i].buf = (char*)GRPC_SLICE_START_PTR(tcp->read_slices->slices[i]);
}
TCP_REF(tcp, "read"); TCP_REF(tcp, "read");
/* First let's try a synchronous, non-blocking read. */ /* First let's try a synchronous, non-blocking read. */
status = status = WSARecv(tcp->socket->socket, buffers, (DWORD)tcp->read_slices->count,
WSARecv(tcp->socket->socket, &buffer, 1, &bytes_read, &flags, NULL, NULL); &bytes_read, &flags, NULL, NULL);
info->wsa_error = status == 0 ? 0 : WSAGetLastError(); info->wsa_error = status == 0 ? 0 : WSAGetLastError();
/* Did we get data immediately ? Yay. */ /* Did we get data immediately ? Yay. */
@ -252,8 +297,8 @@ static void win_read(grpc_endpoint* ep, grpc_slice_buffer* read_slices,
/* Otherwise, let's retry, by queuing a read. */ /* Otherwise, let's retry, by queuing a read. */
memset(&tcp->socket->read_info.overlapped, 0, sizeof(OVERLAPPED)); memset(&tcp->socket->read_info.overlapped, 0, sizeof(OVERLAPPED));
status = WSARecv(tcp->socket->socket, &buffer, 1, &bytes_read, &flags, status = WSARecv(tcp->socket->socket, buffers, (DWORD)tcp->read_slices->count,
&info->overlapped, NULL); &bytes_read, &flags, &info->overlapped, NULL);
if (status != 0) { if (status != 0) {
int wsa_error = WSAGetLastError(); int wsa_error = WSAGetLastError();
@ -275,6 +320,10 @@ static void on_write(void* tcpp, grpc_error* error) {
grpc_winsocket_callback_info* info = &handle->write_info; grpc_winsocket_callback_info* info = &handle->write_info;
grpc_closure* cb; grpc_closure* cb;
if (grpc_tcp_trace.enabled()) {
gpr_log(GPR_INFO, "TCP:%p on_write", tcp);
}
GRPC_ERROR_REF(error); GRPC_ERROR_REF(error);
gpr_mu_lock(&tcp->mu); gpr_mu_lock(&tcp->mu);
@ -303,11 +352,21 @@ static void win_write(grpc_endpoint* ep, grpc_slice_buffer* slices,
unsigned i; unsigned i;
DWORD bytes_sent; DWORD bytes_sent;
int status; int status;
WSABUF local_buffers[16]; WSABUF local_buffers[MAX_WSABUF_COUNT];
WSABUF* allocated = NULL; WSABUF* allocated = NULL;
WSABUF* buffers = local_buffers; WSABUF* buffers = local_buffers;
size_t len; size_t len;
if (grpc_tcp_trace.enabled()) {
size_t i;
for (i = 0; i < slices->count; i++) {
char* data =
grpc_dump_slice(slices->slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII);
gpr_log(GPR_INFO, "WRITE %p (peer=%s): %s", tcp, tcp->peer_string, data);
gpr_free(data);
}
}
if (tcp->shutting_down) { if (tcp->shutting_down) {
GRPC_CLOSURE_SCHED( GRPC_CLOSURE_SCHED(
cb, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( cb, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
@ -410,8 +469,8 @@ static void win_shutdown(grpc_endpoint* ep, grpc_error* why) {
} }
static void win_destroy(grpc_endpoint* ep) { static void win_destroy(grpc_endpoint* ep) {
grpc_network_status_unregister_endpoint(ep);
grpc_tcp* tcp = (grpc_tcp*)ep; grpc_tcp* tcp = (grpc_tcp*)ep;
grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
TCP_UNREF(tcp, "destroy"); TCP_UNREF(tcp, "destroy");
} }
@ -463,9 +522,8 @@ grpc_endpoint* grpc_tcp_create(grpc_winsocket* socket,
GRPC_CLOSURE_INIT(&tcp->on_read, on_read, tcp, grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&tcp->on_read, on_read, tcp, grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&tcp->on_write, on_write, tcp, grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&tcp->on_write, on_write, tcp, grpc_schedule_on_exec_ctx);
tcp->peer_string = gpr_strdup(peer_string); tcp->peer_string = gpr_strdup(peer_string);
grpc_slice_buffer_init(&tcp->last_read_buffer);
tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string); tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string);
/* Tell network status tracking code about the new endpoint */
grpc_network_status_register_endpoint(&tcp->base);
grpc_resource_quota_unref_internal(resource_quota); grpc_resource_quota_unref_internal(resource_quota);
return &tcp->base; return &tcp->base;

@ -45,6 +45,11 @@ void grpc_channel_init_init(void);
/// registration order (in the case of a tie). /// registration order (in the case of a tie).
/// Stages are registered against one of the pre-determined channel stack /// Stages are registered against one of the pre-determined channel stack
/// types. /// types.
/// If the channel stack type is GRPC_CLIENT_SUBCHANNEL, the caller should
/// ensure that subchannels with different filter lists will always have
/// different channel args. This requires setting a channel arg in case the
/// registration function relies on some condition other than channel args to
/// decide whether to add a filter or not.
void grpc_channel_init_register_stage(grpc_channel_stack_type type, void grpc_channel_init_register_stage(grpc_channel_stack_type type,
int priority, int priority,
grpc_channel_init_stage stage_fn, grpc_channel_init_stage stage_fn,

@ -194,13 +194,10 @@ struct call_data {
}; };
struct request_matcher { struct request_matcher {
request_matcher(grpc_server* server);
~request_matcher();
grpc_server* server; grpc_server* server;
std::atomic<call_data*> pending_head{nullptr}; call_data* pending_head;
call_data* pending_tail = nullptr; call_data* pending_tail;
gpr_locked_mpscq* requests_per_cq = nullptr; gpr_locked_mpscq* requests_per_cq;
}; };
struct registered_method { struct registered_method {
@ -349,30 +346,22 @@ static void channel_broadcaster_shutdown(channel_broadcaster* cb,
* request_matcher * request_matcher
*/ */
namespace { static void request_matcher_init(request_matcher* rm, grpc_server* server) {
request_matcher::request_matcher(grpc_server* server) : server(server) { memset(rm, 0, sizeof(*rm));
requests_per_cq = static_cast<gpr_locked_mpscq*>( rm->server = server;
gpr_malloc(sizeof(*requests_per_cq) * server->cq_count)); rm->requests_per_cq = static_cast<gpr_locked_mpscq*>(
for (size_t i = 0; i < server->cq_count; i++) { gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count));
gpr_locked_mpscq_init(&requests_per_cq[i]);
}
}
request_matcher::~request_matcher() {
for (size_t i = 0; i < server->cq_count; i++) { for (size_t i = 0; i < server->cq_count; i++) {
GPR_ASSERT(gpr_locked_mpscq_pop(&requests_per_cq[i]) == nullptr); gpr_locked_mpscq_init(&rm->requests_per_cq[i]);
gpr_locked_mpscq_destroy(&requests_per_cq[i]);
} }
gpr_free(requests_per_cq);
}
} // namespace
static void request_matcher_init(request_matcher* rm, grpc_server* server) {
new (rm) request_matcher(server);
} }
static void request_matcher_destroy(request_matcher* rm) { static void request_matcher_destroy(request_matcher* rm) {
rm->~request_matcher(); for (size_t i = 0; i < rm->server->cq_count; i++) {
GPR_ASSERT(gpr_locked_mpscq_pop(&rm->requests_per_cq[i]) == nullptr);
gpr_locked_mpscq_destroy(&rm->requests_per_cq[i]);
}
gpr_free(rm->requests_per_cq);
} }
static void kill_zombie(void* elem, grpc_error* error) { static void kill_zombie(void* elem, grpc_error* error) {
@ -381,10 +370,9 @@ static void kill_zombie(void* elem, grpc_error* error) {
} }
static void request_matcher_zombify_all_pending_calls(request_matcher* rm) { static void request_matcher_zombify_all_pending_calls(request_matcher* rm) {
call_data* calld; while (rm->pending_head) {
while ((calld = rm->pending_head.load(std::memory_order_relaxed)) != call_data* calld = rm->pending_head;
nullptr) { rm->pending_head = calld->pending_next;
rm->pending_head.store(calld->pending_next, std::memory_order_relaxed);
gpr_atm_no_barrier_store(&calld->state, ZOMBIED); gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
GRPC_CLOSURE_INIT( GRPC_CLOSURE_INIT(
&calld->kill_zombie_closure, kill_zombie, &calld->kill_zombie_closure, kill_zombie,
@ -582,9 +570,8 @@ static void publish_new_rpc(void* arg, grpc_error* error) {
} }
gpr_atm_no_barrier_store(&calld->state, PENDING); gpr_atm_no_barrier_store(&calld->state, PENDING);
if (rm->pending_head.load(std::memory_order_relaxed) == nullptr) { if (rm->pending_head == nullptr) {
rm->pending_head.store(calld, std::memory_order_relaxed); rm->pending_tail = rm->pending_head = calld;
rm->pending_tail = calld;
} else { } else {
rm->pending_tail->pending_next = calld; rm->pending_tail->pending_next = calld;
rm->pending_tail = calld; rm->pending_tail = calld;
@ -1448,39 +1435,30 @@ static grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
rm = &rc->data.registered.method->matcher; rm = &rc->data.registered.method->matcher;
break; break;
} }
if (gpr_locked_mpscq_push(&rm->requests_per_cq[cq_idx], &rc->request_link)) {
// Fast path: if there is no pending request to be processed, immediately /* this was the first queued request: we need to lock and start
// return. matching calls */
if (!gpr_locked_mpscq_push(&rm->requests_per_cq[cq_idx], &rc->request_link) ||
// Note: We are reading the pending_head without holding the server's call
// mutex. Even if we read a non-null value here due to reordering,
// we will check it below again after grabbing the lock.
rm->pending_head.load(std::memory_order_relaxed) == nullptr) {
return GRPC_CALL_OK;
}
// Slow path: This was the first queued request and there are pendings:
// We need to lock and start matching calls.
gpr_mu_lock(&server->mu_call);
while ((calld = rm->pending_head.load(std::memory_order_relaxed)) !=
nullptr) {
rc = reinterpret_cast<requested_call*>(
gpr_locked_mpscq_pop(&rm->requests_per_cq[cq_idx]));
if (rc == nullptr) break;
rm->pending_head.store(calld->pending_next, std::memory_order_relaxed);
gpr_mu_unlock(&server->mu_call);
if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
// Zombied Call
GRPC_CLOSURE_INIT(
&calld->kill_zombie_closure, kill_zombie,
grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_NONE);
} else {
publish_call(server, calld, cq_idx, rc);
}
gpr_mu_lock(&server->mu_call); gpr_mu_lock(&server->mu_call);
while ((calld = rm->pending_head) != nullptr) {
rc = reinterpret_cast<requested_call*>(
gpr_locked_mpscq_pop(&rm->requests_per_cq[cq_idx]));
if (rc == nullptr) break;
rm->pending_head = calld->pending_next;
gpr_mu_unlock(&server->mu_call);
if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
// Zombied Call
GRPC_CLOSURE_INIT(
&calld->kill_zombie_closure, kill_zombie,
grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_NONE);
} else {
publish_call(server, calld, cq_idx, rc);
}
gpr_mu_lock(&server->mu_call);
}
gpr_mu_unlock(&server->mu_call);
} }
gpr_mu_unlock(&server->mu_call);
return GRPC_CALL_OK; return GRPC_CALL_OK;
} }

@ -25,4 +25,4 @@
const char* grpc_version_string(void) { return "7.0.0-dev"; } const char* grpc_version_string(void) { return "7.0.0-dev"; }
const char* grpc_g_stands_for(void) { return "goose"; } const char* grpc_g_stands_for(void) { return "gold"; }

@ -187,6 +187,7 @@ static void gc_mdtab(mdtab_shard* shard) {
((destroy_user_data_func)gpr_atm_no_barrier_load( ((destroy_user_data_func)gpr_atm_no_barrier_load(
&md->destroy_user_data))(user_data); &md->destroy_user_data))(user_data);
} }
gpr_mu_destroy(&md->mu_user_data);
gpr_free(md); gpr_free(md);
*prev_next = next; *prev_next = next;
num_freed++; num_freed++;

@ -366,6 +366,11 @@ void ChannelFilterPluginShutdown();
/// The \a include_filter argument specifies a function that will be called /// The \a include_filter argument specifies a function that will be called
/// to determine at run-time whether or not to add the filter. If the /// to determine at run-time whether or not to add the filter. If the
/// value is nullptr, the filter will be added unconditionally. /// value is nullptr, the filter will be added unconditionally.
/// If the channel stack type is GRPC_CLIENT_SUBCHANNEL, the caller should
/// ensure that subchannels with different filter lists will always have
/// different channel args. This requires setting a channel arg in case the
/// registration function relies on some condition other than channel args to
/// decide whether to add a filter or not.
template <typename ChannelDataType, typename CallDataType> template <typename ChannelDataType, typename CallDataType>
void RegisterChannelFilter( void RegisterChannelFilter(
const char* name, grpc_channel_stack_type stack_type, int priority, const char* name, grpc_channel_stack_type stack_type, int priority,

@ -22,5 +22,5 @@
#include <grpcpp/grpcpp.h> #include <grpcpp/grpcpp.h>
namespace grpc { namespace grpc {
grpc::string Version() { return "1.18.0-dev"; } grpc::string Version() { return "1.19.0-dev"; }
} // namespace grpc } // namespace grpc

@ -278,7 +278,7 @@ class Server::SyncRequest final : public internal::CompletionQueueTag {
request_payload_ = nullptr; request_payload_ = nullptr;
interceptor_methods_.AddInterceptionHookPoint( interceptor_methods_.AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
interceptor_methods_.SetRecvMessage(request_); interceptor_methods_.SetRecvMessage(request_, nullptr);
} }
if (interceptor_methods_.RunInterceptors( if (interceptor_methods_.RunInterceptors(
@ -446,7 +446,7 @@ class Server::CallbackRequest final : public internal::CompletionQueueTag {
req_->request_payload_ = nullptr; req_->request_payload_ = nullptr;
req_->interceptor_methods_.AddInterceptionHookPoint( req_->interceptor_methods_.AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
req_->interceptor_methods_.SetRecvMessage(req_->request_); req_->interceptor_methods_.SetRecvMessage(req_->request_, nullptr);
} }
if (req_->interceptor_methods_.RunInterceptors( if (req_->interceptor_methods_.RunInterceptors(

@ -76,4 +76,4 @@ namespace Grpc.Core.Interceptors
return serverServiceDefinition; return serverServiceDefinition;
} }
} }
} }

@ -1,7 +1,7 @@
<!-- This file is generated --> <!-- This file is generated -->
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<GrpcCsharpVersion>1.18.0-dev</GrpcCsharpVersion> <GrpcCsharpVersion>1.19.0-dev</GrpcCsharpVersion>
<GoogleProtobufVersion>3.6.1</GoogleProtobufVersion> <GoogleProtobufVersion>3.6.1</GoogleProtobufVersion>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

@ -33,11 +33,11 @@ namespace Grpc.Core
/// <summary> /// <summary>
/// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies /// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies
/// </summary> /// </summary>
public const string CurrentAssemblyFileVersion = "1.18.0.0"; public const string CurrentAssemblyFileVersion = "1.19.0.0";
/// <summary> /// <summary>
/// Current version of gRPC C# /// Current version of gRPC C#
/// </summary> /// </summary>
public const string CurrentVersion = "1.18.0-dev"; public const string CurrentVersion = "1.19.0-dev";
} }
} }

@ -13,7 +13,7 @@
@rem limitations under the License. @rem limitations under the License.
@rem Current package versions @rem Current package versions
set VERSION=1.18.0-dev set VERSION=1.19.0-dev
@rem Adjust the location of nuget.exe @rem Adjust the location of nuget.exe
set NUGET=C:\nuget\nuget.exe set NUGET=C:\nuget\nuget.exe

@ -13,7 +13,7 @@
@rem limitations under the License. @rem limitations under the License.
@rem Current package versions @rem Current package versions
set VERSION=1.18.0-dev set VERSION=1.19.0-dev
@rem Adjust the location of nuget.exe @rem Adjust the location of nuget.exe
set NUGET=C:\nuget\nuget.exe set NUGET=C:\nuget\nuget.exe

@ -42,7 +42,7 @@ Pod::Spec.new do |s|
# exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
# before them. # before them.
s.name = '!ProtoCompiler-gRPCPlugin' s.name = '!ProtoCompiler-gRPCPlugin'
v = '1.18.0-dev' v = '1.19.0-dev'
s.version = v s.version = v
s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.' s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.'
s.description = <<-DESC s.description = <<-DESC

@ -19,52 +19,20 @@
#include <AvailabilityMacros.h> #include <AvailabilityMacros.h>
typedef NS_ENUM(NSInteger, GRPCCompressAlgorithm) { // Deprecated interface. Please use GRPCCallOptions instead.
GRPCCompressNone,
GRPCCompressDeflate,
GRPCCompressGzip,
};
/**
* Methods to configure GRPC channel options.
*/
@interface GRPCCall (ChannelArg) @interface GRPCCall (ChannelArg)
/**
* Use the provided @c userAgentPrefix at the beginning of the HTTP User Agent string for all calls
* to the specified @c host.
*/
+ (void)setUserAgentPrefix:(nonnull NSString *)userAgentPrefix forHost:(nonnull NSString *)host; + (void)setUserAgentPrefix:(nonnull NSString *)userAgentPrefix forHost:(nonnull NSString *)host;
/** The default response size limit is 4MB. Set this to override that default. */
+ (void)setResponseSizeLimit:(NSUInteger)limit forHost:(nonnull NSString *)host; + (void)setResponseSizeLimit:(NSUInteger)limit forHost:(nonnull NSString *)host;
+ (void)closeOpenConnections DEPRECATED_MSG_ATTRIBUTE( + (void)closeOpenConnections DEPRECATED_MSG_ATTRIBUTE(
"The API for this feature is experimental, " "The API for this feature is experimental, "
"and might be removed or modified at any " "and might be removed or modified at any "
"time."); "time.");
+ (void)setDefaultCompressMethod:(GRPCCompressAlgorithm)algorithm forhost:(nonnull NSString *)host; + (void)setDefaultCompressMethod:(GRPCCompressAlgorithm)algorithm forhost:(nonnull NSString *)host;
/** Enable keepalive and configure keepalive parameters. A user should call this function once to
* enable keepalive for a particular host. gRPC client sends a ping after every \a interval ms to
* check if the transport is still alive. After waiting for \a timeout ms, if the client does not
* receive the ping ack, it closes the transport; all pending calls to this host will fail with
* error GRPC_STATUS_INTERNAL with error information "keepalive watchdog timeout". */
+ (void)setKeepaliveWithInterval:(int)interval + (void)setKeepaliveWithInterval:(int)interval
timeout:(int)timeout timeout:(int)timeout
forHost:(nonnull NSString *)host; forHost:(nonnull NSString *)host;
/** Enable/Disable automatic retry of gRPC calls on the channel. If automatic retry is enabled, the
* retry is controlled by server's service config. If automatic retry is disabled, failed calls are
* immediately returned to the application layer. */
+ (void)enableRetry:(BOOL)enabled forHost:(nonnull NSString *)host; + (void)enableRetry:(BOOL)enabled forHost:(nonnull NSString *)host;
/** Set channel connection timeout and backoff parameters. All parameters are positive integers in
* milliseconds. Set a parameter to 0 to make gRPC use default value for that parameter.
*
* Refer to gRPC's doc at https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md for the
* details of each parameter. */
+ (void)setMinConnectTimeout:(unsigned int)timeout + (void)setMinConnectTimeout:(unsigned int)timeout
initialBackoff:(unsigned int)initialBackoff initialBackoff:(unsigned int)initialBackoff
maxBackoff:(unsigned int)maxBackoff maxBackoff:(unsigned int)maxBackoff

@ -18,6 +18,7 @@
#import "GRPCCall+ChannelArg.h" #import "GRPCCall+ChannelArg.h"
#import "private/GRPCChannelPool.h"
#import "private/GRPCHost.h" #import "private/GRPCHost.h"
#import <grpc/impl/codegen/compression_types.h> #import <grpc/impl/codegen/compression_types.h>
@ -31,11 +32,11 @@
+ (void)setResponseSizeLimit:(NSUInteger)limit forHost:(nonnull NSString *)host { + (void)setResponseSizeLimit:(NSUInteger)limit forHost:(nonnull NSString *)host {
GRPCHost *hostConfig = [GRPCHost hostWithAddress:host]; GRPCHost *hostConfig = [GRPCHost hostWithAddress:host];
hostConfig.responseSizeLimitOverride = @(limit); hostConfig.responseSizeLimitOverride = limit;
} }
+ (void)closeOpenConnections { + (void)closeOpenConnections {
[GRPCHost flushChannelCache]; [[GRPCChannelPool sharedInstance] disconnectAllChannels];
} }
+ (void)setDefaultCompressMethod:(GRPCCompressAlgorithm)algorithm forhost:(nonnull NSString *)host { + (void)setDefaultCompressMethod:(GRPCCompressAlgorithm)algorithm forhost:(nonnull NSString *)host {

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

Loading…
Cancel
Save