Merge branch 'master' of https://github.com/grpc/grpc into tracing++

Lot's of manual work to make this merge work
reviewable/pr13109/r3
ncteisen 7 years ago
commit 72afb76f5e
  1. 2
      .clang-format
  2. 55
      BUILD
  3. 954
      CMakeLists.txt
  4. 1035
      Makefile
  5. 5
      WORKSPACE
  6. 995
      binding.gyp
  7. 523
      build.yaml
  8. 18
      config.m4
  9. 17
      config.w32
  10. 16
      doc/connectivity-semantics-and-api.md
  11. 14
      doc/environment_variables.md
  12. 3
      examples/php/README.md
  13. 10
      examples/php/greeter_client.php
  14. 11
      examples/php/greeter_proto_gen.sh
  15. 58
      examples/php/helloworld.pb.php
  16. 49
      examples/php/helloworld_grpc_pb.php
  17. 209
      examples/php/route_guide/route_guide.pb.php
  18. 43
      examples/php/route_guide/route_guide_client.php
  19. 101
      examples/php/route_guide/route_guide_grpc_pb.php
  20. 9
      examples/php/route_guide/route_guide_proto_gen.sh
  21. 143
      examples/python/helloworld/helloworld_pb2.py
  22. 3
      examples/python/helloworld/helloworld_pb2_grpc.py
  23. 300
      examples/python/route_guide/route_guide_pb2.py
  24. 3
      examples/python/route_guide/route_guide_pb2_grpc.py
  25. 75
      gRPC-Core.podspec
  26. 37
      grpc.def
  27. 38
      grpc.gemspec
  28. 347
      grpc.gyp
  29. 2
      include/grpc++/alarm.h
  30. 14
      include/grpc++/channel.h
  31. 4
      include/grpc++/impl/channel_argument_option.h
  32. 231
      include/grpc++/impl/codegen/async_stream.h
  33. 64
      include/grpc++/impl/codegen/async_unary_call.h
  34. 21
      include/grpc++/impl/codegen/byte_buffer.h
  35. 17
      include/grpc++/impl/codegen/call.h
  36. 2
      include/grpc++/impl/codegen/call_hook.h
  37. 41
      include/grpc++/impl/codegen/channel_interface.h
  38. 23
      include/grpc++/impl/codegen/client_context.h
  39. 37
      include/grpc++/impl/codegen/client_unary_call.h
  40. 93
      include/grpc++/impl/codegen/completion_queue.h
  41. 2
      include/grpc++/impl/codegen/completion_queue_tag.h
  42. 2
      include/grpc++/impl/codegen/config_protobuf.h
  43. 4
      include/grpc++/impl/codegen/core_codegen.h
  44. 8
      include/grpc++/impl/codegen/core_codegen_interface.h
  45. 40
      include/grpc++/impl/codegen/metadata_map.h
  46. 2
      include/grpc++/impl/codegen/method_handler_impl.h
  47. 64
      include/grpc++/impl/codegen/proto_utils.h
  48. 3
      include/grpc++/impl/codegen/rpc_method.h
  49. 3
      include/grpc++/impl/codegen/rpc_service_method.h
  50. 27
      include/grpc++/impl/codegen/server_context.h
  51. 42
      include/grpc++/impl/codegen/server_interface.h
  52. 46
      include/grpc++/impl/codegen/service_type.h
  53. 327
      include/grpc++/impl/codegen/sync_stream.h
  54. 6
      include/grpc++/impl/codegen/time.h
  55. 3
      include/grpc++/server.h
  56. 6
      include/grpc++/server_builder.h
  57. 433
      include/grpc/census.h
  58. 18
      include/grpc/compression.h
  59. 213
      include/grpc/grpc.h
  60. 6
      include/grpc/grpc_cronet.h
  61. 8
      include/grpc/grpc_posix.h
  62. 246
      include/grpc/grpc_security.h
  63. 7
      include/grpc/grpc_security_constants.h
  64. 10
      include/grpc/impl/codegen/atm.h
  65. 16
      include/grpc/impl/codegen/atm_gcc_atomic.h
  66. 10
      include/grpc/impl/codegen/atm_gcc_sync.h
  67. 44
      include/grpc/impl/codegen/atm_windows.h
  68. 28
      include/grpc/impl/codegen/byte_buffer.h
  69. 4
      include/grpc/impl/codegen/byte_buffer_reader.h
  70. 2
      include/grpc/impl/codegen/connectivity_state.h
  71. 56
      include/grpc/impl/codegen/grpc_types.h
  72. 20
      include/grpc/impl/codegen/slice.h
  73. 12
      include/grpc/impl/codegen/sync_generic.h
  74. 33
      include/grpc/slice.h
  75. 44
      include/grpc/slice_buffer.h
  76. 20
      include/grpc/support/alloc.h
  77. 40
      include/grpc/support/avl.h
  78. 26
      include/grpc/support/cmdline.h
  79. 34
      include/grpc/support/histogram.h
  80. 4
      include/grpc/support/host_port.h
  81. 16
      include/grpc/support/log.h
  82. 2
      include/grpc/support/log_windows.h
  83. 4
      include/grpc/support/string_util.h
  84. 10
      include/grpc/support/subprocess.h
  85. 56
      include/grpc/support/sync.h
  86. 12
      include/grpc/support/thd.h
  87. 2
      include/grpc/support/tls_gcc.h
  88. 2
      include/grpc/support/tls_pthread.h
  89. 103
      package.json
  90. 36
      package.xml
  91. 240
      src/compiler/cpp_generator.cc
  92. 64
      src/compiler/cpp_generator.h
  93. 12
      src/compiler/cpp_generator_helpers.h
  94. 16
      src/compiler/cpp_plugin.cc
  95. 85
      src/compiler/csharp_generator.cc
  96. 2
      src/compiler/csharp_generator.h
  97. 6
      src/compiler/csharp_generator_helpers.h
  98. 10
      src/compiler/csharp_plugin.cc
  99. 44
      src/compiler/generator_helpers.h
  100. 56
      src/compiler/node_generator.cc
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,5 +1,7 @@
--- ---
Language: Cpp Language: Cpp
BasedOnStyle: Google BasedOnStyle: Google
DerivePointerAlignment: false
PointerAlignment: Left
... ...

55
BUILD

@ -409,41 +409,7 @@ grpc_cc_library(
grpc_cc_library( grpc_cc_library(
name = "census", name = "census",
srcs = [ srcs = [
"src/core/ext/census/base_resources.cc",
"src/core/ext/census/context.cc",
"src/core/ext/census/gen/census.pb.c",
"src/core/ext/census/gen/trace_context.pb.c",
"src/core/ext/census/grpc_context.cc", "src/core/ext/census/grpc_context.cc",
"src/core/ext/census/grpc_filter.cc",
"src/core/ext/census/grpc_plugin.cc",
"src/core/ext/census/initialize.cc",
"src/core/ext/census/intrusive_hash_map.cc",
"src/core/ext/census/mlog.cc",
"src/core/ext/census/operation.cc",
"src/core/ext/census/placeholders.cc",
"src/core/ext/census/resource.cc",
"src/core/ext/census/trace_context.cc",
"src/core/ext/census/tracing.cc",
],
hdrs = [
"src/core/ext/census/aggregation.h",
"src/core/ext/census/base_resources.h",
"src/core/ext/census/census_interface.h",
"src/core/ext/census/census_rpc_stats.h",
"src/core/ext/census/gen/census.pb.h",
"src/core/ext/census/gen/trace_context.pb.h",
"src/core/ext/census/grpc_filter.h",
"src/core/ext/census/intrusive_hash_map.h",
"src/core/ext/census/intrusive_hash_map_internal.h",
"src/core/ext/census/mlog.h",
"src/core/ext/census/resource.h",
"src/core/ext/census/rpc_metric_id.h",
"src/core/ext/census/trace_context.h",
"src/core/ext/census/trace_label.h",
"src/core/ext/census/trace_propagation.h",
"src/core/ext/census/trace_status.h",
"src/core/ext/census/trace_string.h",
"src/core/ext/census/tracing.h",
], ],
external_deps = [ external_deps = [
"nanopb", "nanopb",
@ -872,6 +838,7 @@ grpc_cc_library(
grpc_cc_library( grpc_cc_library(
name = "grpc_client_channel", name = "grpc_client_channel",
srcs = [ srcs = [
"src/core/ext/filters/client_channel/backup_poller.cc",
"src/core/ext/filters/client_channel/channel_connectivity.cc", "src/core/ext/filters/client_channel/channel_connectivity.cc",
"src/core/ext/filters/client_channel/client_channel.cc", "src/core/ext/filters/client_channel/client_channel.cc",
"src/core/ext/filters/client_channel/client_channel_factory.cc", "src/core/ext/filters/client_channel/client_channel_factory.cc",
@ -894,6 +861,7 @@ grpc_cc_library(
"src/core/ext/filters/client_channel/uri_parser.cc", "src/core/ext/filters/client_channel/uri_parser.cc",
], ],
hdrs = [ hdrs = [
"src/core/ext/filters/client_channel/backup_poller.h",
"src/core/ext/filters/client_channel/client_channel.h", "src/core/ext/filters/client_channel/client_channel.h",
"src/core/ext/filters/client_channel/client_channel_factory.h", "src/core/ext/filters/client_channel/client_channel_factory.h",
"src/core/ext/filters/client_channel/connector.h", "src/core/ext/filters/client_channel/connector.h",
@ -1074,6 +1042,21 @@ grpc_cc_library(
], ],
) )
grpc_cc_library(
name = "grpc_lb_subchannel_list",
srcs = [
"src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc",
],
hdrs = [
"src/core/ext/filters/client_channel/lb_policy/subchannel_list.h",
],
language = "c++",
deps = [
"grpc_base",
"grpc_client_channel",
],
)
grpc_cc_library( grpc_cc_library(
name = "grpc_lb_policy_pick_first", name = "grpc_lb_policy_pick_first",
srcs = [ srcs = [
@ -1083,6 +1066,7 @@ grpc_cc_library(
deps = [ deps = [
"grpc_base", "grpc_base",
"grpc_client_channel", "grpc_client_channel",
"grpc_lb_subchannel_list",
], ],
) )
@ -1095,6 +1079,7 @@ grpc_cc_library(
deps = [ deps = [
"grpc_base", "grpc_base",
"grpc_client_channel", "grpc_client_channel",
"grpc_lb_subchannel_list",
], ],
) )
@ -1560,7 +1545,7 @@ grpc_cc_library(
grpc_cc_library( grpc_cc_library(
name = "grpc++_config_proto", name = "grpc++_config_proto",
external_deps = [ external_deps = [
"protobuf", "protobuf_headers",
], ],
language = "c++", language = "c++",
public_hdrs = [ public_hdrs = [

File diff suppressed because it is too large Load Diff

1035
Makefile

File diff suppressed because it is too large Load Diff

@ -23,6 +23,11 @@ bind(
actual = "@com_google_protobuf//:protoc_lib", actual = "@com_google_protobuf//:protoc_lib",
) )
bind(
name = "protobuf_headers",
actual = "@com_google_protobuf//:protobuf_headers",
)
bind( bind(
name = "protocol_compiler", name = "protocol_compiler",
actual = "@com_google_protobuf//:protoc", actual = "@com_google_protobuf//:protoc",

@ -1,995 +0,0 @@
# GRPC Node gyp file
# This currently builds the Node extension and dependencies
# This file has been automatically generated from a template file.
# Please look at the templates directory instead.
# This file can be regenerated from the template by running
# tools/buildgen/generate_projects.sh
# Copyright 2015 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.
# Some of this file is built with the help of
# https://n8.io/converting-a-c-library-to-gyp/
{
'variables': {
'runtime%': 'node',
# Some Node installations use the system installation of OpenSSL, and on
# some systems, the system OpenSSL still does not have ALPN support. This
# will let users recompile gRPC to work without ALPN.
'grpc_alpn%': 'true',
# Indicates that the library should be built with gcov.
'grpc_gcov%': 'false',
# Indicates that the library should be built with compatibility for musl
# libc, so that it can run on Alpine Linux. This is only necessary if not
# building on Alpine Linux
'grpc_alpine%': 'false'
},
'target_defaults': {
'configurations': {
'Release': {
'cflags': [
'-O2',
],
'defines': [
'NDEBUG',
],
},
'Debug': {
'cflags': [
'-O0',
],
'defines': [
'_DEBUG',
'DEBUG',
],
},
},
'cflags': [
'-g',
'-Wall',
'-Wextra',
'-Werror',
'-Wno-long-long',
'-Wno-unused-parameter',
'-DOSATOMIC_USE_INLINED=1',
'-Ithird_party/abseil-cpp',
],
'ldflags': [
'-g',
],
'cflags_c': [
'-Werror',
'-std=c99'
],
'cflags_cc': [
'-Werror',
'-std=c++11'
],
'include_dirs': [
'.',
'include'
],
'defines': [
'GPR_BACKWARDS_COMPATIBILITY_MODE',
'GRPC_ARES=0',
'GRPC_UV'
],
'conditions': [
['grpc_gcov=="true"', {
'cflags': [
'-O0',
'-fprofile-arcs',
'-ftest-coverage',
'-Wno-return-type',
],
'defines': [
'_DEBUG',
'DEBUG',
'GPR_GCOV',
],
'ldflags': [
'-fprofile-arcs',
'-ftest-coverage',
'-rdynamic',
'-lstdc++',
],
}],
['grpc_alpine=="true"', {
'defines': [
'GPR_MUSL_LIBC_COMPAT'
]
}],
['OS!="win" and runtime=="electron"', {
"defines": [
'OPENSSL_NO_THREADS'
]
}],
# This is the condition for using boringssl
['OS=="win" or runtime=="electron"', {
"include_dirs": [
"third_party/boringssl/include"
],
"defines": [
'OPENSSL_NO_ASM'
]
}, {
'conditions': [
["target_arch=='ia32'", {
"include_dirs": [ "<(node_root_dir)/deps/openssl/config/piii" ]
}],
["target_arch=='x64'", {
"include_dirs": [ "<(node_root_dir)/deps/openssl/config/k8" ]
}],
["target_arch=='arm'", {
"include_dirs": [ "<(node_root_dir)/deps/openssl/config/arm" ]
}],
['grpc_alpn=="true"', {
'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=1'
],
}, {
'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=0'
],
}]
],
'include_dirs': [
'<(node_root_dir)/deps/openssl/openssl/include',
]
}],
['OS == "win"', {
"include_dirs": [
"third_party/zlib",
"third_party/cares/cares"
],
"defines": [
'_WIN32_WINNT=0x0600',
'WIN32_LEAN_AND_MEAN',
'_HAS_EXCEPTIONS=0',
'UNICODE',
'_UNICODE',
'NOMINMAX',
],
"msvs_settings": {
'VCCLCompilerTool': {
'RuntimeLibrary': 1, # static debug
}
},
"libraries": [
"ws2_32"
]
}, { # OS != "win"
'include_dirs': [
'<(node_root_dir)/deps/zlib',
'<(node_root_dir)/deps/cares/include'
]
}],
['OS == "mac"', {
'xcode_settings': {
'OTHER_CFLAGS': [
'-g',
'-Wall',
'-Wextra',
'-Werror',
'-Wno-long-long',
'-Wno-unused-parameter',
'-DOSATOMIC_USE_INLINED=1',
'-Ithird_party/abseil-cpp',
],
'OTHER_CPLUSPLUSFLAGS': [
'-g',
'-Wall',
'-Wextra',
'-Werror',
'-Wno-long-long',
'-Wno-unused-parameter',
'-DOSATOMIC_USE_INLINED=1',
'-Ithird_party/abseil-cpp',
'-stdlib=libc++',
'-std=c++11',
'-Wno-error=deprecated-declarations'
],
},
}]
]
},
'conditions': [
['OS=="win" or runtime=="electron"', {
'targets': [
{
'target_name': 'boringssl',
'product_prefix': 'lib',
'type': 'static_library',
'dependencies': [
],
'sources': [
'src/boringssl/err_data.c',
'third_party/boringssl/crypto/aes/aes.c',
'third_party/boringssl/crypto/aes/key_wrap.c',
'third_party/boringssl/crypto/aes/mode_wrappers.c',
'third_party/boringssl/crypto/asn1/a_bitstr.c',
'third_party/boringssl/crypto/asn1/a_bool.c',
'third_party/boringssl/crypto/asn1/a_d2i_fp.c',
'third_party/boringssl/crypto/asn1/a_dup.c',
'third_party/boringssl/crypto/asn1/a_enum.c',
'third_party/boringssl/crypto/asn1/a_gentm.c',
'third_party/boringssl/crypto/asn1/a_i2d_fp.c',
'third_party/boringssl/crypto/asn1/a_int.c',
'third_party/boringssl/crypto/asn1/a_mbstr.c',
'third_party/boringssl/crypto/asn1/a_object.c',
'third_party/boringssl/crypto/asn1/a_octet.c',
'third_party/boringssl/crypto/asn1/a_print.c',
'third_party/boringssl/crypto/asn1/a_strnid.c',
'third_party/boringssl/crypto/asn1/a_time.c',
'third_party/boringssl/crypto/asn1/a_type.c',
'third_party/boringssl/crypto/asn1/a_utctm.c',
'third_party/boringssl/crypto/asn1/a_utf8.c',
'third_party/boringssl/crypto/asn1/asn1_lib.c',
'third_party/boringssl/crypto/asn1/asn1_par.c',
'third_party/boringssl/crypto/asn1/asn_pack.c',
'third_party/boringssl/crypto/asn1/f_enum.c',
'third_party/boringssl/crypto/asn1/f_int.c',
'third_party/boringssl/crypto/asn1/f_string.c',
'third_party/boringssl/crypto/asn1/t_bitst.c',
'third_party/boringssl/crypto/asn1/tasn_dec.c',
'third_party/boringssl/crypto/asn1/tasn_enc.c',
'third_party/boringssl/crypto/asn1/tasn_fre.c',
'third_party/boringssl/crypto/asn1/tasn_new.c',
'third_party/boringssl/crypto/asn1/tasn_typ.c',
'third_party/boringssl/crypto/asn1/tasn_utl.c',
'third_party/boringssl/crypto/asn1/time_support.c',
'third_party/boringssl/crypto/asn1/x_bignum.c',
'third_party/boringssl/crypto/asn1/x_long.c',
'third_party/boringssl/crypto/base64/base64.c',
'third_party/boringssl/crypto/bio/bio.c',
'third_party/boringssl/crypto/bio/bio_mem.c',
'third_party/boringssl/crypto/bio/connect.c',
'third_party/boringssl/crypto/bio/fd.c',
'third_party/boringssl/crypto/bio/file.c',
'third_party/boringssl/crypto/bio/hexdump.c',
'third_party/boringssl/crypto/bio/pair.c',
'third_party/boringssl/crypto/bio/printf.c',
'third_party/boringssl/crypto/bio/socket.c',
'third_party/boringssl/crypto/bio/socket_helper.c',
'third_party/boringssl/crypto/bn/add.c',
'third_party/boringssl/crypto/bn/asm/x86_64-gcc.c',
'third_party/boringssl/crypto/bn/bn.c',
'third_party/boringssl/crypto/bn/bn_asn1.c',
'third_party/boringssl/crypto/bn/cmp.c',
'third_party/boringssl/crypto/bn/convert.c',
'third_party/boringssl/crypto/bn/ctx.c',
'third_party/boringssl/crypto/bn/div.c',
'third_party/boringssl/crypto/bn/exponentiation.c',
'third_party/boringssl/crypto/bn/gcd.c',
'third_party/boringssl/crypto/bn/generic.c',
'third_party/boringssl/crypto/bn/kronecker.c',
'third_party/boringssl/crypto/bn/montgomery.c',
'third_party/boringssl/crypto/bn/montgomery_inv.c',
'third_party/boringssl/crypto/bn/mul.c',
'third_party/boringssl/crypto/bn/prime.c',
'third_party/boringssl/crypto/bn/random.c',
'third_party/boringssl/crypto/bn/rsaz_exp.c',
'third_party/boringssl/crypto/bn/shift.c',
'third_party/boringssl/crypto/bn/sqrt.c',
'third_party/boringssl/crypto/buf/buf.c',
'third_party/boringssl/crypto/bytestring/asn1_compat.c',
'third_party/boringssl/crypto/bytestring/ber.c',
'third_party/boringssl/crypto/bytestring/cbb.c',
'third_party/boringssl/crypto/bytestring/cbs.c',
'third_party/boringssl/crypto/chacha/chacha.c',
'third_party/boringssl/crypto/cipher/aead.c',
'third_party/boringssl/crypto/cipher/cipher.c',
'third_party/boringssl/crypto/cipher/derive_key.c',
'third_party/boringssl/crypto/cipher/e_aes.c',
'third_party/boringssl/crypto/cipher/e_chacha20poly1305.c',
'third_party/boringssl/crypto/cipher/e_des.c',
'third_party/boringssl/crypto/cipher/e_null.c',
'third_party/boringssl/crypto/cipher/e_rc2.c',
'third_party/boringssl/crypto/cipher/e_rc4.c',
'third_party/boringssl/crypto/cipher/e_ssl3.c',
'third_party/boringssl/crypto/cipher/e_tls.c',
'third_party/boringssl/crypto/cipher/tls_cbc.c',
'third_party/boringssl/crypto/cmac/cmac.c',
'third_party/boringssl/crypto/conf/conf.c',
'third_party/boringssl/crypto/cpu-aarch64-linux.c',
'third_party/boringssl/crypto/cpu-arm-linux.c',
'third_party/boringssl/crypto/cpu-arm.c',
'third_party/boringssl/crypto/cpu-intel.c',
'third_party/boringssl/crypto/cpu-ppc64le.c',
'third_party/boringssl/crypto/crypto.c',
'third_party/boringssl/crypto/curve25519/curve25519.c',
'third_party/boringssl/crypto/curve25519/spake25519.c',
'third_party/boringssl/crypto/curve25519/x25519-x86_64.c',
'third_party/boringssl/crypto/des/des.c',
'third_party/boringssl/crypto/dh/check.c',
'third_party/boringssl/crypto/dh/dh.c',
'third_party/boringssl/crypto/dh/dh_asn1.c',
'third_party/boringssl/crypto/dh/params.c',
'third_party/boringssl/crypto/digest/digest.c',
'third_party/boringssl/crypto/digest/digests.c',
'third_party/boringssl/crypto/dsa/dsa.c',
'third_party/boringssl/crypto/dsa/dsa_asn1.c',
'third_party/boringssl/crypto/ec/ec.c',
'third_party/boringssl/crypto/ec/ec_asn1.c',
'third_party/boringssl/crypto/ec/ec_key.c',
'third_party/boringssl/crypto/ec/ec_montgomery.c',
'third_party/boringssl/crypto/ec/oct.c',
'third_party/boringssl/crypto/ec/p224-64.c',
'third_party/boringssl/crypto/ec/p256-64.c',
'third_party/boringssl/crypto/ec/p256-x86_64.c',
'third_party/boringssl/crypto/ec/simple.c',
'third_party/boringssl/crypto/ec/util-64.c',
'third_party/boringssl/crypto/ec/wnaf.c',
'third_party/boringssl/crypto/ecdh/ecdh.c',
'third_party/boringssl/crypto/ecdsa/ecdsa.c',
'third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c',
'third_party/boringssl/crypto/engine/engine.c',
'third_party/boringssl/crypto/err/err.c',
'third_party/boringssl/crypto/evp/digestsign.c',
'third_party/boringssl/crypto/evp/evp.c',
'third_party/boringssl/crypto/evp/evp_asn1.c',
'third_party/boringssl/crypto/evp/evp_ctx.c',
'third_party/boringssl/crypto/evp/p_dsa_asn1.c',
'third_party/boringssl/crypto/evp/p_ec.c',
'third_party/boringssl/crypto/evp/p_ec_asn1.c',
'third_party/boringssl/crypto/evp/p_rsa.c',
'third_party/boringssl/crypto/evp/p_rsa_asn1.c',
'third_party/boringssl/crypto/evp/pbkdf.c',
'third_party/boringssl/crypto/evp/print.c',
'third_party/boringssl/crypto/evp/sign.c',
'third_party/boringssl/crypto/ex_data.c',
'third_party/boringssl/crypto/hkdf/hkdf.c',
'third_party/boringssl/crypto/hmac/hmac.c',
'third_party/boringssl/crypto/lhash/lhash.c',
'third_party/boringssl/crypto/md4/md4.c',
'third_party/boringssl/crypto/md5/md5.c',
'third_party/boringssl/crypto/mem.c',
'third_party/boringssl/crypto/modes/cbc.c',
'third_party/boringssl/crypto/modes/cfb.c',
'third_party/boringssl/crypto/modes/ctr.c',
'third_party/boringssl/crypto/modes/gcm.c',
'third_party/boringssl/crypto/modes/ofb.c',
'third_party/boringssl/crypto/modes/polyval.c',
'third_party/boringssl/crypto/obj/obj.c',
'third_party/boringssl/crypto/obj/obj_xref.c',
'third_party/boringssl/crypto/pem/pem_all.c',
'third_party/boringssl/crypto/pem/pem_info.c',
'third_party/boringssl/crypto/pem/pem_lib.c',
'third_party/boringssl/crypto/pem/pem_oth.c',
'third_party/boringssl/crypto/pem/pem_pk8.c',
'third_party/boringssl/crypto/pem/pem_pkey.c',
'third_party/boringssl/crypto/pem/pem_x509.c',
'third_party/boringssl/crypto/pem/pem_xaux.c',
'third_party/boringssl/crypto/pkcs8/p5_pbev2.c',
'third_party/boringssl/crypto/pkcs8/p8_pkey.c',
'third_party/boringssl/crypto/pkcs8/pkcs8.c',
'third_party/boringssl/crypto/poly1305/poly1305.c',
'third_party/boringssl/crypto/poly1305/poly1305_arm.c',
'third_party/boringssl/crypto/poly1305/poly1305_vec.c',
'third_party/boringssl/crypto/pool/pool.c',
'third_party/boringssl/crypto/rand/deterministic.c',
'third_party/boringssl/crypto/rand/fuchsia.c',
'third_party/boringssl/crypto/rand/rand.c',
'third_party/boringssl/crypto/rand/urandom.c',
'third_party/boringssl/crypto/rand/windows.c',
'third_party/boringssl/crypto/rc4/rc4.c',
'third_party/boringssl/crypto/refcount_c11.c',
'third_party/boringssl/crypto/refcount_lock.c',
'third_party/boringssl/crypto/rsa/blinding.c',
'third_party/boringssl/crypto/rsa/padding.c',
'third_party/boringssl/crypto/rsa/rsa.c',
'third_party/boringssl/crypto/rsa/rsa_asn1.c',
'third_party/boringssl/crypto/rsa/rsa_impl.c',
'third_party/boringssl/crypto/sha/sha1-altivec.c',
'third_party/boringssl/crypto/sha/sha1.c',
'third_party/boringssl/crypto/sha/sha256.c',
'third_party/boringssl/crypto/sha/sha512.c',
'third_party/boringssl/crypto/stack/stack.c',
'third_party/boringssl/crypto/thread.c',
'third_party/boringssl/crypto/thread_none.c',
'third_party/boringssl/crypto/thread_pthread.c',
'third_party/boringssl/crypto/thread_win.c',
'third_party/boringssl/crypto/x509/a_digest.c',
'third_party/boringssl/crypto/x509/a_sign.c',
'third_party/boringssl/crypto/x509/a_strex.c',
'third_party/boringssl/crypto/x509/a_verify.c',
'third_party/boringssl/crypto/x509/algorithm.c',
'third_party/boringssl/crypto/x509/asn1_gen.c',
'third_party/boringssl/crypto/x509/by_dir.c',
'third_party/boringssl/crypto/x509/by_file.c',
'third_party/boringssl/crypto/x509/i2d_pr.c',
'third_party/boringssl/crypto/x509/pkcs7.c',
'third_party/boringssl/crypto/x509/rsa_pss.c',
'third_party/boringssl/crypto/x509/t_crl.c',
'third_party/boringssl/crypto/x509/t_req.c',
'third_party/boringssl/crypto/x509/t_x509.c',
'third_party/boringssl/crypto/x509/t_x509a.c',
'third_party/boringssl/crypto/x509/x509.c',
'third_party/boringssl/crypto/x509/x509_att.c',
'third_party/boringssl/crypto/x509/x509_cmp.c',
'third_party/boringssl/crypto/x509/x509_d2.c',
'third_party/boringssl/crypto/x509/x509_def.c',
'third_party/boringssl/crypto/x509/x509_ext.c',
'third_party/boringssl/crypto/x509/x509_lu.c',
'third_party/boringssl/crypto/x509/x509_obj.c',
'third_party/boringssl/crypto/x509/x509_r2x.c',
'third_party/boringssl/crypto/x509/x509_req.c',
'third_party/boringssl/crypto/x509/x509_set.c',
'third_party/boringssl/crypto/x509/x509_trs.c',
'third_party/boringssl/crypto/x509/x509_txt.c',
'third_party/boringssl/crypto/x509/x509_v3.c',
'third_party/boringssl/crypto/x509/x509_vfy.c',
'third_party/boringssl/crypto/x509/x509_vpm.c',
'third_party/boringssl/crypto/x509/x509cset.c',
'third_party/boringssl/crypto/x509/x509name.c',
'third_party/boringssl/crypto/x509/x509rset.c',
'third_party/boringssl/crypto/x509/x509spki.c',
'third_party/boringssl/crypto/x509/x509type.c',
'third_party/boringssl/crypto/x509/x_algor.c',
'third_party/boringssl/crypto/x509/x_all.c',
'third_party/boringssl/crypto/x509/x_attrib.c',
'third_party/boringssl/crypto/x509/x_crl.c',
'third_party/boringssl/crypto/x509/x_exten.c',
'third_party/boringssl/crypto/x509/x_info.c',
'third_party/boringssl/crypto/x509/x_name.c',
'third_party/boringssl/crypto/x509/x_pkey.c',
'third_party/boringssl/crypto/x509/x_pubkey.c',
'third_party/boringssl/crypto/x509/x_req.c',
'third_party/boringssl/crypto/x509/x_sig.c',
'third_party/boringssl/crypto/x509/x_spki.c',
'third_party/boringssl/crypto/x509/x_val.c',
'third_party/boringssl/crypto/x509/x_x509.c',
'third_party/boringssl/crypto/x509/x_x509a.c',
'third_party/boringssl/crypto/x509v3/pcy_cache.c',
'third_party/boringssl/crypto/x509v3/pcy_data.c',
'third_party/boringssl/crypto/x509v3/pcy_lib.c',
'third_party/boringssl/crypto/x509v3/pcy_map.c',
'third_party/boringssl/crypto/x509v3/pcy_node.c',
'third_party/boringssl/crypto/x509v3/pcy_tree.c',
'third_party/boringssl/crypto/x509v3/v3_akey.c',
'third_party/boringssl/crypto/x509v3/v3_akeya.c',
'third_party/boringssl/crypto/x509v3/v3_alt.c',
'third_party/boringssl/crypto/x509v3/v3_bcons.c',
'third_party/boringssl/crypto/x509v3/v3_bitst.c',
'third_party/boringssl/crypto/x509v3/v3_conf.c',
'third_party/boringssl/crypto/x509v3/v3_cpols.c',
'third_party/boringssl/crypto/x509v3/v3_crld.c',
'third_party/boringssl/crypto/x509v3/v3_enum.c',
'third_party/boringssl/crypto/x509v3/v3_extku.c',
'third_party/boringssl/crypto/x509v3/v3_genn.c',
'third_party/boringssl/crypto/x509v3/v3_ia5.c',
'third_party/boringssl/crypto/x509v3/v3_info.c',
'third_party/boringssl/crypto/x509v3/v3_int.c',
'third_party/boringssl/crypto/x509v3/v3_lib.c',
'third_party/boringssl/crypto/x509v3/v3_ncons.c',
'third_party/boringssl/crypto/x509v3/v3_pci.c',
'third_party/boringssl/crypto/x509v3/v3_pcia.c',
'third_party/boringssl/crypto/x509v3/v3_pcons.c',
'third_party/boringssl/crypto/x509v3/v3_pku.c',
'third_party/boringssl/crypto/x509v3/v3_pmaps.c',
'third_party/boringssl/crypto/x509v3/v3_prn.c',
'third_party/boringssl/crypto/x509v3/v3_purp.c',
'third_party/boringssl/crypto/x509v3/v3_skey.c',
'third_party/boringssl/crypto/x509v3/v3_sxnet.c',
'third_party/boringssl/crypto/x509v3/v3_utl.c',
'third_party/boringssl/ssl/bio_ssl.c',
'third_party/boringssl/ssl/custom_extensions.c',
'third_party/boringssl/ssl/d1_both.c',
'third_party/boringssl/ssl/d1_lib.c',
'third_party/boringssl/ssl/d1_pkt.c',
'third_party/boringssl/ssl/d1_srtp.c',
'third_party/boringssl/ssl/dtls_method.c',
'third_party/boringssl/ssl/dtls_record.c',
'third_party/boringssl/ssl/handshake_client.c',
'third_party/boringssl/ssl/handshake_server.c',
'third_party/boringssl/ssl/s3_both.c',
'third_party/boringssl/ssl/s3_lib.c',
'third_party/boringssl/ssl/s3_pkt.c',
'third_party/boringssl/ssl/ssl_aead_ctx.c',
'third_party/boringssl/ssl/ssl_asn1.c',
'third_party/boringssl/ssl/ssl_buffer.c',
'third_party/boringssl/ssl/ssl_cert.c',
'third_party/boringssl/ssl/ssl_cipher.c',
'third_party/boringssl/ssl/ssl_ecdh.c',
'third_party/boringssl/ssl/ssl_file.c',
'third_party/boringssl/ssl/ssl_lib.c',
'third_party/boringssl/ssl/ssl_privkey.c',
'third_party/boringssl/ssl/ssl_privkey_cc.cc',
'third_party/boringssl/ssl/ssl_session.c',
'third_party/boringssl/ssl/ssl_stat.c',
'third_party/boringssl/ssl/ssl_transcript.c',
'third_party/boringssl/ssl/ssl_x509.c',
'third_party/boringssl/ssl/t1_enc.c',
'third_party/boringssl/ssl/t1_lib.c',
'third_party/boringssl/ssl/tls13_both.c',
'third_party/boringssl/ssl/tls13_client.c',
'third_party/boringssl/ssl/tls13_enc.c',
'third_party/boringssl/ssl/tls13_server.c',
'third_party/boringssl/ssl/tls_method.c',
'third_party/boringssl/ssl/tls_record.c',
],
'conditions': [
['OS == "mac"', {
'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET': '10.9'
}
}]
]
},
],
}],
['OS == "win" and runtime!="electron"', {
'targets': [
{
# IMPORTANT WINDOWS BUILD INFORMATION
# This library does not build on Windows without modifying the Node
# development packages that node-gyp downloads in order to build.
# Due to https://github.com/nodejs/node/issues/4932, the headers for
# BoringSSL conflict with the OpenSSL headers included by default
# when including the Node headers. The remedy for this is to remove
# the OpenSSL headers, from the downloaded Node development package,
# which is typically located in `.node-gyp` in your home directory.
#
# This is not true of Electron, which does not have OpenSSL headers.
'target_name': 'WINDOWS_BUILD_WARNING',
'rules': [
{
'rule_name': 'WINDOWS_BUILD_WARNING',
'extension': 'S',
'inputs': [
'package.json'
],
'outputs': [
'ignore_this_part'
],
'action': ['echo', 'IMPORTANT: Due to https://github.com/nodejs/node/issues/4932, to build this library on Windows, you must first remove <(node_root_dir)/include/node/openssl/']
}
]
},
]
}],
['OS == "win"', {
'targets': [
# Only want to compile zlib under Windows
{
'target_name': 'z',
'product_prefix': 'lib',
'type': 'static_library',
'dependencies': [
],
'sources': [
'third_party/zlib/adler32.c',
'third_party/zlib/compress.c',
'third_party/zlib/crc32.c',
'third_party/zlib/deflate.c',
'third_party/zlib/gzclose.c',
'third_party/zlib/gzlib.c',
'third_party/zlib/gzread.c',
'third_party/zlib/gzwrite.c',
'third_party/zlib/infback.c',
'third_party/zlib/inffast.c',
'third_party/zlib/inflate.c',
'third_party/zlib/inftrees.c',
'third_party/zlib/trees.c',
'third_party/zlib/uncompr.c',
'third_party/zlib/zutil.c',
]
},
]
}]
],
'targets': [
{
'target_name': 'gpr',
'product_prefix': 'lib',
'type': 'static_library',
'dependencies': [
],
'sources': [
'src/core/lib/profiling/basic_timers.cc',
'src/core/lib/profiling/stap_timers.cc',
'src/core/lib/support/alloc.cc',
'src/core/lib/support/arena.cc',
'src/core/lib/support/atm.cc',
'src/core/lib/support/avl.cc',
'src/core/lib/support/cmdline.cc',
'src/core/lib/support/cpu_iphone.cc',
'src/core/lib/support/cpu_linux.cc',
'src/core/lib/support/cpu_posix.cc',
'src/core/lib/support/cpu_windows.cc',
'src/core/lib/support/env_linux.cc',
'src/core/lib/support/env_posix.cc',
'src/core/lib/support/env_windows.cc',
'src/core/lib/support/histogram.cc',
'src/core/lib/support/host_port.cc',
'src/core/lib/support/log.cc',
'src/core/lib/support/log_android.cc',
'src/core/lib/support/log_linux.cc',
'src/core/lib/support/log_posix.cc',
'src/core/lib/support/log_windows.cc',
'src/core/lib/support/mpscq.cc',
'src/core/lib/support/murmur_hash.cc',
'src/core/lib/support/stack_lockfree.cc',
'src/core/lib/support/string.cc',
'src/core/lib/support/string_posix.cc',
'src/core/lib/support/string_util_windows.cc',
'src/core/lib/support/string_windows.cc',
'src/core/lib/support/subprocess_posix.cc',
'src/core/lib/support/subprocess_windows.cc',
'src/core/lib/support/sync.cc',
'src/core/lib/support/sync_posix.cc',
'src/core/lib/support/sync_windows.cc',
'src/core/lib/support/thd.cc',
'src/core/lib/support/thd_posix.cc',
'src/core/lib/support/thd_windows.cc',
'src/core/lib/support/time.cc',
'src/core/lib/support/time_posix.cc',
'src/core/lib/support/time_precise.cc',
'src/core/lib/support/time_windows.cc',
'src/core/lib/support/tls_pthread.cc',
'src/core/lib/support/tmpfile_msys.cc',
'src/core/lib/support/tmpfile_posix.cc',
'src/core/lib/support/tmpfile_windows.cc',
'src/core/lib/support/wrap_memcpy.cc',
],
'conditions': [
['OS == "mac"', {
'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET': '10.9'
}
}]
]
},
{
'target_name': 'grpc',
'product_prefix': 'lib',
'type': 'static_library',
'dependencies': [
'gpr',
],
'sources': [
'src/core/lib/surface/init.cc',
'src/core/lib/backoff/backoff.cc',
'src/core/lib/channel/channel_args.cc',
'src/core/lib/channel/channel_stack.cc',
'src/core/lib/channel/channel_stack_builder.cc',
'src/core/lib/channel/connected_channel.cc',
'src/core/lib/channel/handshaker.cc',
'src/core/lib/channel/handshaker_factory.cc',
'src/core/lib/channel/handshaker_registry.cc',
'src/core/lib/compression/compression.cc',
'src/core/lib/compression/message_compress.cc',
'src/core/lib/compression/stream_compression.cc',
'src/core/lib/compression/stream_compression_gzip.cc',
'src/core/lib/compression/stream_compression_identity.cc',
'src/core/lib/debug/stats.cc',
'src/core/lib/debug/stats_data.cc',
'src/core/lib/http/format_request.cc',
'src/core/lib/http/httpcli.cc',
'src/core/lib/http/parser.cc',
'src/core/lib/iomgr/call_combiner.cc',
'src/core/lib/iomgr/closure.cc',
'src/core/lib/iomgr/combiner.cc',
'src/core/lib/iomgr/endpoint.cc',
'src/core/lib/iomgr/endpoint_pair_posix.cc',
'src/core/lib/iomgr/endpoint_pair_uv.cc',
'src/core/lib/iomgr/endpoint_pair_windows.cc',
'src/core/lib/iomgr/error.cc',
'src/core/lib/iomgr/ev_epoll1_linux.cc',
'src/core/lib/iomgr/ev_epollex_linux.cc',
'src/core/lib/iomgr/ev_epollsig_linux.cc',
'src/core/lib/iomgr/ev_poll_posix.cc',
'src/core/lib/iomgr/ev_posix.cc',
'src/core/lib/iomgr/ev_windows.cc',
'src/core/lib/iomgr/exec_ctx.cc',
'src/core/lib/iomgr/executor.cc',
'src/core/lib/iomgr/gethostname_fallback.cc',
'src/core/lib/iomgr/gethostname_host_name_max.cc',
'src/core/lib/iomgr/gethostname_sysconf.cc',
'src/core/lib/iomgr/iocp_windows.cc',
'src/core/lib/iomgr/iomgr.cc',
'src/core/lib/iomgr/iomgr_posix.cc',
'src/core/lib/iomgr/iomgr_uv.cc',
'src/core/lib/iomgr/iomgr_windows.cc',
'src/core/lib/iomgr/is_epollexclusive_available.cc',
'src/core/lib/iomgr/load_file.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/pollset_set_uv.cc',
'src/core/lib/iomgr/pollset_set_windows.cc',
'src/core/lib/iomgr/pollset_uv.cc',
'src/core/lib/iomgr/pollset_windows.cc',
'src/core/lib/iomgr/resolve_address_posix.cc',
'src/core/lib/iomgr/resolve_address_uv.cc',
'src/core/lib/iomgr/resolve_address_windows.cc',
'src/core/lib/iomgr/resource_quota.cc',
'src/core/lib/iomgr/sockaddr_utils.cc',
'src/core/lib/iomgr/socket_factory_posix.cc',
'src/core/lib/iomgr/socket_mutator.cc',
'src/core/lib/iomgr/socket_utils_common_posix.cc',
'src/core/lib/iomgr/socket_utils_linux.cc',
'src/core/lib/iomgr/socket_utils_posix.cc',
'src/core/lib/iomgr/socket_utils_uv.cc',
'src/core/lib/iomgr/socket_utils_windows.cc',
'src/core/lib/iomgr/socket_windows.cc',
'src/core/lib/iomgr/tcp_client_posix.cc',
'src/core/lib/iomgr/tcp_client_uv.cc',
'src/core/lib/iomgr/tcp_client_windows.cc',
'src/core/lib/iomgr/tcp_posix.cc',
'src/core/lib/iomgr/tcp_server_posix.cc',
'src/core/lib/iomgr/tcp_server_utils_posix_common.cc',
'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc',
'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc',
'src/core/lib/iomgr/tcp_server_uv.cc',
'src/core/lib/iomgr/tcp_server_windows.cc',
'src/core/lib/iomgr/tcp_uv.cc',
'src/core/lib/iomgr/tcp_windows.cc',
'src/core/lib/iomgr/time_averaged_stats.cc',
'src/core/lib/iomgr/timer_generic.cc',
'src/core/lib/iomgr/timer_heap.cc',
'src/core/lib/iomgr/timer_manager.cc',
'src/core/lib/iomgr/timer_uv.cc',
'src/core/lib/iomgr/udp_server.cc',
'src/core/lib/iomgr/unix_sockets_posix.cc',
'src/core/lib/iomgr/unix_sockets_posix_noop.cc',
'src/core/lib/iomgr/wakeup_fd_cv.cc',
'src/core/lib/iomgr/wakeup_fd_eventfd.cc',
'src/core/lib/iomgr/wakeup_fd_nospecial.cc',
'src/core/lib/iomgr/wakeup_fd_pipe.cc',
'src/core/lib/iomgr/wakeup_fd_posix.cc',
'src/core/lib/json/json.cc',
'src/core/lib/json/json_reader.cc',
'src/core/lib/json/json_string.cc',
'src/core/lib/json/json_writer.cc',
'src/core/lib/slice/b64.cc',
'src/core/lib/slice/percent_encoding.cc',
'src/core/lib/slice/slice.cc',
'src/core/lib/slice/slice_buffer.cc',
'src/core/lib/slice/slice_hash_table.cc',
'src/core/lib/slice/slice_intern.cc',
'src/core/lib/slice/slice_string_helpers.cc',
'src/core/lib/surface/alarm.cc',
'src/core/lib/surface/api_trace.cc',
'src/core/lib/surface/byte_buffer.cc',
'src/core/lib/surface/byte_buffer_reader.cc',
'src/core/lib/surface/call.cc',
'src/core/lib/surface/call_details.cc',
'src/core/lib/surface/call_log_batch.cc',
'src/core/lib/surface/channel.cc',
'src/core/lib/surface/channel_init.cc',
'src/core/lib/surface/channel_ping.cc',
'src/core/lib/surface/channel_stack_type.cc',
'src/core/lib/surface/completion_queue.cc',
'src/core/lib/surface/completion_queue_factory.cc',
'src/core/lib/surface/event_string.cc',
'src/core/lib/surface/lame_client.cc',
'src/core/lib/surface/metadata_array.cc',
'src/core/lib/surface/server.cc',
'src/core/lib/surface/validate_metadata.cc',
'src/core/lib/surface/version.cc',
'src/core/lib/transport/bdp_estimator.cc',
'src/core/lib/transport/byte_stream.cc',
'src/core/lib/transport/connectivity_state.cc',
'src/core/lib/transport/error_utils.cc',
'src/core/lib/transport/metadata.cc',
'src/core/lib/transport/metadata_batch.cc',
'src/core/lib/transport/pid_controller.cc',
'src/core/lib/transport/service_config.cc',
'src/core/lib/transport/static_metadata.cc',
'src/core/lib/transport/status_conversion.cc',
'src/core/lib/transport/timeout_encoding.cc',
'src/core/lib/transport/transport.cc',
'src/core/lib/transport/transport_op_string.cc',
'src/core/lib/debug/trace.cc',
'src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc',
'src/core/ext/transport/chttp2/transport/bin_decoder.cc',
'src/core/ext/transport/chttp2/transport/bin_encoder.cc',
'src/core/ext/transport/chttp2/transport/chttp2_plugin.cc',
'src/core/ext/transport/chttp2/transport/chttp2_transport.cc',
'src/core/ext/transport/chttp2/transport/flow_control.cc',
'src/core/ext/transport/chttp2/transport/frame_data.cc',
'src/core/ext/transport/chttp2/transport/frame_goaway.cc',
'src/core/ext/transport/chttp2/transport/frame_ping.cc',
'src/core/ext/transport/chttp2/transport/frame_rst_stream.cc',
'src/core/ext/transport/chttp2/transport/frame_settings.cc',
'src/core/ext/transport/chttp2/transport/frame_window_update.cc',
'src/core/ext/transport/chttp2/transport/hpack_encoder.cc',
'src/core/ext/transport/chttp2/transport/hpack_parser.cc',
'src/core/ext/transport/chttp2/transport/hpack_table.cc',
'src/core/ext/transport/chttp2/transport/http2_settings.cc',
'src/core/ext/transport/chttp2/transport/huffsyms.cc',
'src/core/ext/transport/chttp2/transport/incoming_metadata.cc',
'src/core/ext/transport/chttp2/transport/parsing.cc',
'src/core/ext/transport/chttp2/transport/stream_lists.cc',
'src/core/ext/transport/chttp2/transport/stream_map.cc',
'src/core/ext/transport/chttp2/transport/varint.cc',
'src/core/ext/transport/chttp2/transport/writing.cc',
'src/core/ext/transport/chttp2/alpn/alpn.cc',
'src/core/ext/filters/http/client/http_client_filter.cc',
'src/core/ext/filters/http/http_filters_plugin.cc',
'src/core/ext/filters/http/message_compress/message_compress_filter.cc',
'src/core/ext/filters/http/server/http_server_filter.cc',
'src/core/lib/http/httpcli_security_connector.cc',
'src/core/lib/security/context/security_context.cc',
'src/core/lib/security/credentials/composite/composite_credentials.cc',
'src/core/lib/security/credentials/credentials.cc',
'src/core/lib/security/credentials/credentials_metadata.cc',
'src/core/lib/security/credentials/fake/fake_credentials.cc',
'src/core/lib/security/credentials/google_default/credentials_generic.cc',
'src/core/lib/security/credentials/google_default/google_default_credentials.cc',
'src/core/lib/security/credentials/iam/iam_credentials.cc',
'src/core/lib/security/credentials/jwt/json_token.cc',
'src/core/lib/security/credentials/jwt/jwt_credentials.cc',
'src/core/lib/security/credentials/jwt/jwt_verifier.cc',
'src/core/lib/security/credentials/oauth2/oauth2_credentials.cc',
'src/core/lib/security/credentials/plugin/plugin_credentials.cc',
'src/core/lib/security/credentials/ssl/ssl_credentials.cc',
'src/core/lib/security/transport/client_auth_filter.cc',
'src/core/lib/security/transport/lb_targets_info.cc',
'src/core/lib/security/transport/secure_endpoint.cc',
'src/core/lib/security/transport/security_connector.cc',
'src/core/lib/security/transport/security_handshaker.cc',
'src/core/lib/security/transport/server_auth_filter.cc',
'src/core/lib/security/transport/tsi_error.cc',
'src/core/lib/security/util/json_util.cc',
'src/core/lib/surface/init_secure.cc',
'src/core/tsi/fake_transport_security.cc',
'src/core/tsi/gts_transport_security.cc',
'src/core/tsi/ssl_transport_security.cc',
'src/core/tsi/transport_security_grpc.cc',
'src/core/tsi/transport_security.cc',
'src/core/tsi/transport_security_adapter.cc',
'src/core/ext/transport/chttp2/server/chttp2_server.cc',
'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc',
'src/core/ext/filters/client_channel/client_channel.cc',
'src/core/ext/filters/client_channel/client_channel_factory.cc',
'src/core/ext/filters/client_channel/client_channel_plugin.cc',
'src/core/ext/filters/client_channel/connector.cc',
'src/core/ext/filters/client_channel/http_connect_handshaker.cc',
'src/core/ext/filters/client_channel/http_proxy.cc',
'src/core/ext/filters/client_channel/lb_policy.cc',
'src/core/ext/filters/client_channel/lb_policy_factory.cc',
'src/core/ext/filters/client_channel/lb_policy_registry.cc',
'src/core/ext/filters/client_channel/parse_address.cc',
'src/core/ext/filters/client_channel/proxy_mapper.cc',
'src/core/ext/filters/client_channel/proxy_mapper_registry.cc',
'src/core/ext/filters/client_channel/resolver.cc',
'src/core/ext/filters/client_channel/resolver_factory.cc',
'src/core/ext/filters/client_channel/resolver_registry.cc',
'src/core/ext/filters/client_channel/retry_throttle.cc',
'src/core/ext/filters/client_channel/subchannel.cc',
'src/core/ext/filters/client_channel/subchannel_index.cc',
'src/core/ext/filters/client_channel/uri_parser.cc',
'src/core/ext/filters/deadline/deadline_filter.cc',
'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
'src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc',
'src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc',
'src/core/ext/transport/chttp2/client/insecure/channel_create.cc',
'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
'src/core/ext/transport/inproc/inproc_plugin.cc',
'src/core/ext/transport/inproc/inproc_transport.cc',
'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc',
'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc',
'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc',
'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc',
'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc',
'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
'third_party/nanopb/pb_common.c',
'third_party/nanopb/pb_decode.c',
'third_party/nanopb/pb_encode.c',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc',
'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc',
'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc',
'src/core/ext/filters/load_reporting/server_load_reporting_filter.cc',
'src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc',
'src/core/ext/census/base_resources.cc',
'src/core/ext/census/context.cc',
'src/core/ext/census/gen/census.pb.c',
'src/core/ext/census/gen/trace_context.pb.c',
'src/core/ext/census/grpc_context.cc',
'src/core/ext/census/grpc_filter.cc',
'src/core/ext/census/grpc_plugin.cc',
'src/core/ext/census/initialize.cc',
'src/core/ext/census/intrusive_hash_map.cc',
'src/core/ext/census/mlog.cc',
'src/core/ext/census/operation.cc',
'src/core/ext/census/placeholders.cc',
'src/core/ext/census/resource.cc',
'src/core/ext/census/trace_context.cc',
'src/core/ext/census/tracing.cc',
'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc',
'src/core/ext/filters/workarounds/workaround_utils.cc',
'src/core/plugin_registry/grpc_plugin_registry.cc',
],
'conditions': [
['OS == "mac"', {
'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET': '10.9'
}
}]
]
},
{
'include_dirs': [
"<!(node -e \"require('nan')\")"
],
'cflags': [
'-pthread',
'-zdefs',
'-Wno-error=deprecated-declarations'
],
"conditions": [
['OS=="win" or runtime=="electron"', {
'dependencies': [
"boringssl",
]
}],
['OS=="win"', {
'dependencies': [
"z",
]
}],
['OS=="linux"', {
'ldflags': [
'-Wl,-wrap,memcpy'
]
}],
['OS == "mac"', {
'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET': '10.9'
}
}]
],
"target_name": "grpc_node",
"sources": [
"src/node/ext/byte_buffer.cc",
"src/node/ext/call.cc",
"src/node/ext/call_credentials.cc",
"src/node/ext/channel.cc",
"src/node/ext/channel_credentials.cc",
"src/node/ext/completion_queue.cc",
"src/node/ext/node_grpc.cc",
"src/node/ext/server.cc",
"src/node/ext/server_credentials.cc",
"src/node/ext/slice.cc",
"src/node/ext/timeval.cc",
],
"dependencies": [
"grpc",
"gpr",
]
},
{
"target_name": "action_after_build",
"type": "none",
"dependencies": [ "<(module_name)" ],
"copies": [
{
"files": [ "<(PRODUCT_DIR)/<(module_name).node"],
"destination": "<(module_path)"
}
]
}
]
}

File diff suppressed because it is too large Load Diff

@ -278,6 +278,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/tsi/transport_security_adapter.cc \ src/core/tsi/transport_security_adapter.cc \
src/core/ext/transport/chttp2/server/chttp2_server.cc \ src/core/ext/transport/chttp2/server/chttp2_server.cc \
src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc \ src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc \
src/core/ext/filters/client_channel/backup_poller.cc \
src/core/ext/filters/client_channel/channel_connectivity.cc \ src/core/ext/filters/client_channel/channel_connectivity.cc \
src/core/ext/filters/client_channel/client_channel.cc \ src/core/ext/filters/client_channel/client_channel.cc \
src/core/ext/filters/client_channel/client_channel_factory.cc \ src/core/ext/filters/client_channel/client_channel_factory.cc \
@ -317,6 +318,7 @@ if test "$PHP_GRPC" != "no"; then
third_party/nanopb/pb_encode.c \ third_party/nanopb/pb_encode.c \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \ src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \
src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc \
src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \
src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \ src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \
src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \ src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \
@ -326,21 +328,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \ src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \
src/core/ext/filters/load_reporting/server_load_reporting_filter.cc \ src/core/ext/filters/load_reporting/server_load_reporting_filter.cc \
src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc \ src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc \
src/core/ext/census/base_resources.cc \
src/core/ext/census/context.cc \
src/core/ext/census/gen/census.pb.c \
src/core/ext/census/gen/trace_context.pb.c \
src/core/ext/census/grpc_context.cc \ src/core/ext/census/grpc_context.cc \
src/core/ext/census/grpc_filter.cc \
src/core/ext/census/grpc_plugin.cc \
src/core/ext/census/initialize.cc \
src/core/ext/census/intrusive_hash_map.cc \
src/core/ext/census/mlog.cc \
src/core/ext/census/operation.cc \
src/core/ext/census/placeholders.cc \
src/core/ext/census/resource.cc \
src/core/ext/census/trace_context.cc \
src/core/ext/census/tracing.cc \
src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \
src/core/ext/filters/message_size/message_size_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \
src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \ src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \
@ -658,8 +646,8 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/boringssl) PHP_ADD_BUILD_DIR($ext_builddir/src/boringssl)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/census) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/census)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/census/gen)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/pick_first) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/pick_first)

@ -255,6 +255,7 @@ if (PHP_GRPC != "no") {
"src\\core\\tsi\\transport_security_adapter.cc " + "src\\core\\tsi\\transport_security_adapter.cc " +
"src\\core\\ext\\transport\\chttp2\\server\\chttp2_server.cc " + "src\\core\\ext\\transport\\chttp2\\server\\chttp2_server.cc " +
"src\\core\\ext\\transport\\chttp2\\client\\secure\\secure_channel_create.cc " + "src\\core\\ext\\transport\\chttp2\\client\\secure\\secure_channel_create.cc " +
"src\\core\\ext\\filters\\client_channel\\backup_poller.cc " +
"src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " + "src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " +
"src\\core\\ext\\filters\\client_channel\\client_channel.cc " + "src\\core\\ext\\filters\\client_channel\\client_channel.cc " +
"src\\core\\ext\\filters\\client_channel\\client_channel_factory.cc " + "src\\core\\ext\\filters\\client_channel\\client_channel_factory.cc " +
@ -294,6 +295,7 @@ if (PHP_GRPC != "no") {
"third_party\\nanopb\\pb_encode.c " + "third_party\\nanopb\\pb_encode.c " +
"src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " + "src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy\\subchannel_list.cc " +
"src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_posix.cc " + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_posix.cc " +
@ -303,21 +305,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr\\sockaddr_resolver.cc " + "src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr\\sockaddr_resolver.cc " +
"src\\core\\ext\\filters\\load_reporting\\server_load_reporting_filter.cc " + "src\\core\\ext\\filters\\load_reporting\\server_load_reporting_filter.cc " +
"src\\core\\ext\\filters\\load_reporting\\server_load_reporting_plugin.cc " + "src\\core\\ext\\filters\\load_reporting\\server_load_reporting_plugin.cc " +
"src\\core\\ext\\census\\base_resources.cc " +
"src\\core\\ext\\census\\context.cc " +
"src\\core\\ext\\census\\gen\\census.pb.c " +
"src\\core\\ext\\census\\gen\\trace_context.pb.c " +
"src\\core\\ext\\census\\grpc_context.cc " + "src\\core\\ext\\census\\grpc_context.cc " +
"src\\core\\ext\\census\\grpc_filter.cc " +
"src\\core\\ext\\census\\grpc_plugin.cc " +
"src\\core\\ext\\census\\initialize.cc " +
"src\\core\\ext\\census\\intrusive_hash_map.cc " +
"src\\core\\ext\\census\\mlog.cc " +
"src\\core\\ext\\census\\operation.cc " +
"src\\core\\ext\\census\\placeholders.cc " +
"src\\core\\ext\\census\\resource.cc " +
"src\\core\\ext\\census\\trace_context.cc " +
"src\\core\\ext\\census\\tracing.cc " +
"src\\core\\ext\\filters\\max_age\\max_age_filter.cc " + "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " +
"src\\core\\ext\\filters\\message_size\\message_size_filter.cc " + "src\\core\\ext\\filters\\message_size\\message_size_filter.cc " +
"src\\core\\ext\\filters\\workarounds\\workaround_cronet_compression_filter.cc " + "src\\core\\ext\\filters\\workarounds\\workaround_cronet_compression_filter.cc " +
@ -661,7 +649,6 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\census"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\census");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\census\\gen");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy");

@ -115,8 +115,14 @@ Channel State API
----------------- -----------------
All gRPC libraries will expose a channel-level API method to poll the current All gRPC libraries will expose a channel-level API method to poll the current
state of a channel. In C++, this method is called GetCurrentState and returns state of a channel. In C++, this method is called GetState and returns an enum
an enum for one of the five legal states. for one of the five legal states. It also accepts a boolean `try_to_connect` to
transition to CONNECTING if the channel is currently IDLE. The boolean should
act as if an RPC occurred, so it should also reset IDLE_TIMEOUT.
```cpp
grpc_connectivity_state GetState(bool try_to_connect);
```
All libraries should also expose an API that enables the application (user of All libraries should also expose an API that enables the application (user of
the gRPC API) to be notified when the channel state changes. Since state the gRPC API) to be notified when the channel state changes. Since state
@ -127,11 +133,11 @@ the user to poll the channel for the current state.
The synchronous version of this API is: The synchronous version of this API is:
```cpp ```cpp
bool WaitForStateChange(gpr_timespec deadline, ChannelState source_state); bool WaitForStateChange(grpc_connectivity_state source_state, gpr_timespec deadline);
``` ```
which returns true when the state changes to something other than the which returns `true` when the state is something other than the
source_state and false if the deadline expires. Asynchronous and futures based `source_state` and `false` if the deadline expires. Asynchronous- and futures-based
APIs should have a corresponding method that allows the application to be APIs should have a corresponding method that allows the application to be
notified when the state of a channel changes. notified when the state of a channel changes.

@ -120,10 +120,10 @@ some configuration as environment variables that can be set.
perform name resolution perform name resolution
- ares - a DNS resolver based around the c-ares library - ares - a DNS resolver based around the c-ares library
* GRPC_DISABLE_CHANNEL_CONNECTIVITY_WATCHER * GRPC_CLIENT_CHANNEL_BACKUP_POLL_INTERVAL_MS
The channel connectivity watcher uses one extra thread to check the channel Default: 5000
state every 500 ms on the client side. It can help reconnect disconnected Declares the interval between two backup polls on client channels. These polls
client channels (mostly due to idleness), so that the next RPC on this channel are run in the timer thread so that gRPC can process connection failures while
won't fail. Set to 1 to turn off this watcher and save a thread. Please note there is no active polling thread. They help reconnect disconnected client
this is a temporary work-around, it will be removed in the future once we have channels (mostly due to idleness), so that the next RPC on this channel won't
support for automatically reestablishing failed connections. fail. Set to 0 to turn off the backup polls.

@ -41,10 +41,11 @@ TRY IT!
$ node greeter_server.js $ node greeter_server.js
``` ```
- Run the client - Generate proto files and run the client
``` ```
$ cd examples/php $ cd examples/php
$ ./greeter_proto_gen.sh
$ ./run_greeter_client.sh $ ./run_greeter_client.sh
``` ```

@ -17,12 +17,14 @@
* *
*/ */
// php:generate protoc --proto_path=./../protos --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=./../../bins/opt/grpc_php_plugin ./../protos/helloworld.proto
require dirname(__FILE__).'/vendor/autoload.php'; require dirname(__FILE__).'/vendor/autoload.php';
// The following includes are needed when using protobuf 3.1.0 @include_once dirname(__FILE__).'/Helloworld/GreeterClient.php';
// and will suppress warnings when using protobuf 3.2.0+ @include_once dirname(__FILE__).'/Helloworld/HelloReply.php';
@include_once dirname(__FILE__).'/helloworld.pb.php'; @include_once dirname(__FILE__).'/Helloworld/HelloRequest.php';
@include_once dirname(__FILE__).'/helloworld_grpc_pb.php'; @include_once dirname(__FILE__).'/GPBMetadata/Helloworld.php';
function greet($name) function greet($name)
{ {

@ -1,6 +1,5 @@
#!/bin/bash #!/bin/bash
# Copyright 2017 gRPC authors.
# Copyright 2016 gRPC authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -14,11 +13,5 @@
# 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.
ELECTRON_VERSION=$1 protoc --proto_path=./../protos --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=./../../bins/opt/grpc_php_plugin ./../protos/helloworld.proto
nvm install 8
set -ex
npm install xvfb-maybe
npm install electron@$ELECTRON_VERSION

@ -1,58 +0,0 @@
<?php
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: helloworld.proto
namespace Helloworld;
use Google\Protobuf\Internal\DescriptorPool;
use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\GPBUtil;
class HelloRequest extends \Google\Protobuf\Internal\Message
{
private $name = '';
public function getName()
{
return $this->name;
}
public function setName($var)
{
GPBUtil::checkString($var, True);
$this->name = $var;
}
}
class HelloReply extends \Google\Protobuf\Internal\Message
{
private $message = '';
public function getMessage()
{
return $this->message;
}
public function setMessage($var)
{
GPBUtil::checkString($var, True);
$this->message = $var;
}
}
$pool = DescriptorPool::getGeneratedPool();
$pool->internalAddGeneratedFile(hex2bin(
"0ae6010a1068656c6c6f776f726c642e70726f746f120a68656c6c6f776f" .
"726c64221c0a0c48656c6c6f52657175657374120c0a046e616d65180120" .
"012809221d0a0a48656c6c6f5265706c79120f0a076d6573736167651801" .
"2001280932490a0747726565746572123e0a0853617948656c6c6f12182e" .
"68656c6c6f776f726c642e48656c6c6f526571756573741a162e68656c6c" .
"6f776f726c642e48656c6c6f5265706c79220042360a1b696f2e67727063" .
"2e6578616d706c65732e68656c6c6f776f726c64420f48656c6c6f576f72" .
"6c6450726f746f5001a20203484c57620670726f746f33"
));

@ -1,49 +0,0 @@
<?php
// GENERATED CODE -- DO NOT EDIT!
// Original file comments:
// Copyright 2015 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.
//
namespace Helloworld {
// The greeting service definition.
class GreeterClient extends \Grpc\BaseStub {
/**
* @param string $hostname hostname
* @param array $opts channel options
* @param Grpc\Channel $channel (optional) re-use channel object
*/
public function __construct($hostname, $opts, $channel = null) {
parent::__construct($hostname, $opts, $channel);
}
/**
* Sends a greeting
* @param \Helloworld\HelloRequest $argument input argument
* @param array $metadata metadata
* @param array $options call options
*/
public function SayHello(\Helloworld\HelloRequest $argument,
$metadata = [], $options = []) {
return $this->_simpleRequest('/helloworld.Greeter/SayHello',
$argument,
['\Helloworld\HelloReply', 'decode'],
$metadata, $options);
}
}
}

@ -1,209 +0,0 @@
<?php
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: route_guide.proto
namespace Routeguide;
use Google\Protobuf\Internal\DescriptorPool;
use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\GPBUtil;
class Point extends \Google\Protobuf\Internal\Message
{
private $latitude = 0;
private $longitude = 0;
public function getLatitude()
{
return $this->latitude;
}
public function setLatitude($var)
{
GPBUtil::checkInt32($var);
$this->latitude = $var;
}
public function getLongitude()
{
return $this->longitude;
}
public function setLongitude($var)
{
GPBUtil::checkInt32($var);
$this->longitude = $var;
}
}
class Rectangle extends \Google\Protobuf\Internal\Message
{
private $lo = null;
private $hi = null;
public function getLo()
{
return $this->lo;
}
public function setLo(&$var)
{
GPBUtil::checkMessage($var, \Routeguide\Point::class);
$this->lo = $var;
}
public function getHi()
{
return $this->hi;
}
public function setHi(&$var)
{
GPBUtil::checkMessage($var, \Routeguide\Point::class);
$this->hi = $var;
}
}
class Feature extends \Google\Protobuf\Internal\Message
{
private $name = '';
private $location = null;
public function getName()
{
return $this->name;
}
public function setName($var)
{
GPBUtil::checkString($var, True);
$this->name = $var;
}
public function getLocation()
{
return $this->location;
}
public function setLocation(&$var)
{
GPBUtil::checkMessage($var, \Routeguide\Point::class);
$this->location = $var;
}
}
class RouteNote extends \Google\Protobuf\Internal\Message
{
private $location = null;
private $message = '';
public function getLocation()
{
return $this->location;
}
public function setLocation(&$var)
{
GPBUtil::checkMessage($var, \Routeguide\Point::class);
$this->location = $var;
}
public function getMessage()
{
return $this->message;
}
public function setMessage($var)
{
GPBUtil::checkString($var, True);
$this->message = $var;
}
}
class RouteSummary extends \Google\Protobuf\Internal\Message
{
private $point_count = 0;
private $feature_count = 0;
private $distance = 0;
private $elapsed_time = 0;
public function getPointCount()
{
return $this->point_count;
}
public function setPointCount($var)
{
GPBUtil::checkInt32($var);
$this->point_count = $var;
}
public function getFeatureCount()
{
return $this->feature_count;
}
public function setFeatureCount($var)
{
GPBUtil::checkInt32($var);
$this->feature_count = $var;
}
public function getDistance()
{
return $this->distance;
}
public function setDistance($var)
{
GPBUtil::checkInt32($var);
$this->distance = $var;
}
public function getElapsedTime()
{
return $this->elapsed_time;
}
public function setElapsedTime($var)
{
GPBUtil::checkInt32($var);
$this->elapsed_time = $var;
}
}
$pool = DescriptorPool::getGeneratedPool();
$pool->internalAddGeneratedFile(hex2bin(
"0ac5050a11726f7574655f67756964652e70726f746f120a726f75746567" .
"75696465222c0a05506f696e7412100a086c617469747564651801200128" .
"0512110a096c6f6e67697475646518022001280522490a0952656374616e" .
"676c65121d0a026c6f18012001280b32112e726f75746567756964652e50" .
"6f696e74121d0a02686918022001280b32112e726f75746567756964652e" .
"506f696e74223c0a0746656174757265120c0a046e616d65180120012809" .
"12230a086c6f636174696f6e18022001280b32112e726f75746567756964" .
"652e506f696e7422410a09526f7574654e6f746512230a086c6f63617469" .
"6f6e18012001280b32112e726f75746567756964652e506f696e74120f0a" .
"076d65737361676518022001280922620a0c526f75746553756d6d617279" .
"12130a0b706f696e745f636f756e7418012001280512150a0d6665617475" .
"72655f636f756e7418022001280512100a0864697374616e636518032001" .
"280512140a0c656c61707365645f74696d651804200128053285020a0a52" .
"6f757465477569646512360a0a4765744665617475726512112e726f7574" .
"6567756964652e506f696e741a132e726f75746567756964652e46656174" .
"7572652200123e0a0c4c697374466561747572657312152e726f75746567" .
"756964652e52656374616e676c651a132e726f75746567756964652e4665" .
"617475726522003001123e0a0b5265636f7264526f75746512112e726f75" .
"746567756964652e506f696e741a182e726f75746567756964652e526f75" .
"746553756d6d61727922002801123f0a09526f7574654368617412152e72" .
"6f75746567756964652e526f7574654e6f74651a152e726f757465677569" .
"64652e526f7574654e6f746522002801300142360a1b696f2e677270632e" .
"6578616d706c65732e726f7574656775696465420f526f75746547756964" .
"6550726f746f5001a20203525447620670726f746f33"
));

@ -17,12 +17,9 @@
* *
*/ */
require dirname(__FILE__).'/../vendor/autoload.php'; // php:generate protoc --proto_path=./../../protos --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=./../../../bins/opt/grpc_php_plugin ./../../protos/route_guide.proto
// The following includes are needed when using protobuf 3.1.0 require dirname(__FILE__).'/../vendor/autoload.php';
// and will suppress warnings when using protobuf 3.2.0+
@include_once dirname(__FILE__).'/route_guide.pb.php';
@include_once dirname(__FILE__).'/route_guide_grpc_pb.php';
define('COORD_FACTOR', 1e7); define('COORD_FACTOR', 1e7);
@ -38,9 +35,12 @@ function printFeature($feature)
} else { } else {
$name_str = "feature called $name"; $name_str = "feature called $name";
} }
echo sprintf("Found %s \n at %f, %f\n", $name_str, echo sprintf(
"Found %s \n at %f, %f\n",
$name_str,
$feature->getLocation()->getLatitude() / COORD_FACTOR, $feature->getLocation()->getLatitude() / COORD_FACTOR,
$feature->getLocation()->getLongitude() / COORD_FACTOR); $feature->getLocation()->getLongitude() / COORD_FACTOR
);
} }
/** /**
@ -122,19 +122,24 @@ function runRecordRoute()
$feature_name = $db[$index]['name']; $feature_name = $db[$index]['name'];
$point->setLatitude($lat); $point->setLatitude($lat);
$point->setLongitude($long); $point->setLongitude($long);
echo sprintf("Visiting point %f, %f,\n with feature name: %s\n", echo sprintf(
$lat / COORD_FACTOR, $long / COORD_FACTOR, "Visiting point %f, %f,\n with feature name: %s\n",
$feature_name ? $feature_name : '<empty>'); $lat / COORD_FACTOR,
$long / COORD_FACTOR,
$feature_name ? $feature_name : '<empty>'
);
usleep(rand(300000, 800000)); usleep(rand(300000, 800000));
$call->write($point); $call->write($point);
} }
list($route_summary, $status) = $call->wait(); list($route_summary, $status) = $call->wait();
echo sprintf("Finished trip with %d points\nPassed %d features\n". echo sprintf(
"Finished trip with %d points\nPassed %d features\n".
"Travelled %d meters\nIt took %d seconds\n", "Travelled %d meters\nIt took %d seconds\n",
$route_summary->getPointCount(), $route_summary->getPointCount(),
$route_summary->getFeatureCount(), $route_summary->getFeatureCount(),
$route_summary->getDistance(), $route_summary->getDistance(),
$route_summary->getElapsedTime()); $route_summary->getElapsedTime()
);
} }
/** /**
@ -166,8 +171,12 @@ function runRouteChat()
$route_note->setLocation($point); $route_note->setLocation($point);
$route_note->setMessage($message = $n[2]); $route_note->setMessage($message = $n[2]);
echo sprintf("Sending message: '%s' at (%d, %d)\n", echo sprintf(
$message, $lat, $long); "Sending message: '%s' at (%d, %d)\n",
$message,
$lat,
$long
);
// send a bunch of messages to the server // send a bunch of messages to the server
$call->write($route_note); $call->write($route_note);
} }
@ -175,10 +184,12 @@ function runRouteChat()
// read from the server until there's no more // read from the server until there's no more
while ($route_note_reply = $call->read()) { while ($route_note_reply = $call->read()) {
echo sprintf("Previous left message at (%d, %d): '%s'\n", echo sprintf(
"Previous left message at (%d, %d): '%s'\n",
$route_note_reply->getLocation()->getLatitude(), $route_note_reply->getLocation()->getLatitude(),
$route_note_reply->getLocation()->getLongitude(), $route_note_reply->getLocation()->getLongitude(),
$route_note_reply->getMessage()); $route_note_reply->getMessage()
);
} }
} }

@ -1,101 +0,0 @@
<?php
// GENERATED CODE -- DO NOT EDIT!
// Original file comments:
// Copyright 2015 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.
//
namespace Routeguide {
// Interface exported by the server.
class RouteGuideClient extends \Grpc\BaseStub {
/**
* @param string $hostname hostname
* @param array $opts channel options
* @param Grpc\Channel $channel (optional) re-use channel object
*/
public function __construct($hostname, $opts, $channel = null) {
parent::__construct($hostname, $opts, $channel);
}
/**
* A simple RPC.
*
* Obtains the feature at a given position.
*
* A feature with an empty name is returned if there's no feature at the given
* position.
* @param \Routeguide\Point $argument input argument
* @param array $metadata metadata
* @param array $options call options
*/
public function GetFeature(\Routeguide\Point $argument,
$metadata = [], $options = []) {
return $this->_simpleRequest('/routeguide.RouteGuide/GetFeature',
$argument,
['\Routeguide\Feature', 'decode'],
$metadata, $options);
}
/**
* A server-to-client streaming RPC.
*
* Obtains the Features available within the given Rectangle. Results are
* streamed rather than returned at once (e.g. in a response message with a
* repeated field), as the rectangle may cover a large area and contain a
* huge number of features.
* @param \Routeguide\Rectangle $argument input argument
* @param array $metadata metadata
* @param array $options call options
*/
public function ListFeatures(\Routeguide\Rectangle $argument,
$metadata = [], $options = []) {
return $this->_serverStreamRequest('/routeguide.RouteGuide/ListFeatures',
$argument,
['\Routeguide\Feature', 'decode'],
$metadata, $options);
}
/**
* A client-to-server streaming RPC.
*
* Accepts a stream of Points on a route being traversed, returning a
* RouteSummary when traversal is completed.
* @param array $metadata metadata
* @param array $options call options
*/
public function RecordRoute($metadata = [], $options = []) {
return $this->_clientStreamRequest('/routeguide.RouteGuide/RecordRoute',
['\Routeguide\RouteSummary','decode'],
$metadata, $options);
}
/**
* A Bidirectional streaming RPC.
*
* Accepts a stream of RouteNotes sent while a route is being traversed,
* while receiving other RouteNotes (e.g. from other users).
* @param array $metadata metadata
* @param array $options call options
*/
public function RouteChat($metadata = [], $options = []) {
return $this->_bidiRequest('/routeguide.RouteGuide/RouteChat',
['\Routeguide\RouteNote','decode'],
$metadata, $options);
}
}
}

@ -13,11 +13,4 @@
# 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.
source ~/.nvm/nvm.sh protoc --proto_path=./../../protos --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=./../../../bins/opt/grpc_php_plugin ./../../protos/route_guide.proto
nvm use 8
set -ex
cd $(dirname $0)/../../..
node src/node/performance/worker.js $@

@ -21,7 +21,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
syntax='proto3', syntax='proto3',
serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3')
) )
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
@ -89,6 +88,7 @@ _HELLOREPLY = _descriptor.Descriptor(
DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST
DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict(
DESCRIPTOR = _HELLOREQUEST, DESCRIPTOR = _HELLOREQUEST,
@ -107,123 +107,28 @@ _sym_db.RegisterMessage(HelloReply)
DESCRIPTOR.has_options = True DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW'))
try:
# THESE ELEMENTS WILL BE DEPRECATED. _GREETER = _descriptor.ServiceDescriptor(
# Please use the generated *_pb2_grpc.py files instead. name='Greeter',
import grpc full_name='helloworld.Greeter',
from grpc.framework.common import cardinality file=DESCRIPTOR,
from grpc.framework.interfaces.face import utilities as face_utilities index=0,
from grpc.beta import implementations as beta_implementations options=None,
from grpc.beta import interfaces as beta_interfaces serialized_start=93,
serialized_end=166,
methods=[
class GreeterStub(object): _descriptor.MethodDescriptor(
"""The greeting service definition. name='SayHello',
""" full_name='helloworld.Greeter.SayHello',
index=0,
def __init__(self, channel): containing_service=None,
"""Constructor. input_type=_HELLOREQUEST,
output_type=_HELLOREPLY,
Args: options=None,
channel: A grpc.Channel.
"""
self.SayHello = channel.unary_unary(
'/helloworld.Greeter/SayHello',
request_serializer=HelloRequest.SerializeToString,
response_deserializer=HelloReply.FromString,
)
class GreeterServicer(object):
"""The greeting service definition.
"""
def SayHello(self, request, context):
"""Sends a greeting
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_GreeterServicer_to_server(servicer, server):
rpc_method_handlers = {
'SayHello': grpc.unary_unary_rpc_method_handler(
servicer.SayHello,
request_deserializer=HelloRequest.FromString,
response_serializer=HelloReply.SerializeToString,
), ),
} ])
generic_handler = grpc.method_handlers_generic_handler( _sym_db.RegisterServiceDescriptor(_GREETER)
'helloworld.Greeter', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,)) DESCRIPTOR.services_by_name['Greeter'] = _GREETER
class BetaGreeterServicer(object):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This class was generated
only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
"""The greeting service definition.
"""
def SayHello(self, request, context):
"""Sends a greeting
"""
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
class BetaGreeterStub(object):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This class was generated
only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
"""The greeting service definition.
"""
def SayHello(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
"""Sends a greeting
"""
raise NotImplementedError()
SayHello.future = None
def beta_create_Greeter_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This function was
generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
request_deserializers = {
('helloworld.Greeter', 'SayHello'): HelloRequest.FromString,
}
response_serializers = {
('helloworld.Greeter', 'SayHello'): HelloReply.SerializeToString,
}
method_implementations = {
('helloworld.Greeter', 'SayHello'): face_utilities.unary_unary_inline(servicer.SayHello),
}
server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
return beta_implementations.server(method_implementations, options=server_options)
def beta_create_Greeter_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This function was
generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
request_serializers = {
('helloworld.Greeter', 'SayHello'): HelloRequest.SerializeToString,
}
response_deserializers = {
('helloworld.Greeter', 'SayHello'): HelloReply.FromString,
}
cardinalities = {
'SayHello': cardinality.Cardinality.UNARY_UNARY,
}
stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
return beta_implementations.dynamic_stub(channel, 'helloworld.Greeter', cardinalities, options=stub_options)
except ImportError:
pass
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

@ -1,6 +1,5 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
import grpc import grpc
from grpc.framework.common import cardinality
from grpc.framework.interfaces.face import utilities as face_utilities
import helloworld_pb2 as helloworld__pb2 import helloworld_pb2 as helloworld__pb2

@ -21,7 +21,6 @@ DESCRIPTOR = _descriptor.FileDescriptor(
syntax='proto3', syntax='proto3',
serialized_pb=_b('\n\x11route_guide.proto\x12\nrouteguide\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"I\n\tRectangle\x12\x1d\n\x02lo\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x1d\n\x02hi\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"<\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"A\n\tRouteNote\x12#\n\x08location\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\x85\x02\n\nRouteGuide\x12\x36\n\nGetFeature\x12\x11.routeguide.Point\x1a\x13.routeguide.Feature\"\x00\x12>\n\x0cListFeatures\x12\x15.routeguide.Rectangle\x1a\x13.routeguide.Feature\"\x00\x30\x01\x12>\n\x0bRecordRoute\x12\x11.routeguide.Point\x1a\x18.routeguide.RouteSummary\"\x00(\x01\x12?\n\tRouteChat\x12\x15.routeguide.RouteNote\x1a\x15.routeguide.RouteNote\"\x00(\x01\x30\x01\x42\x36\n\x1bio.grpc.examples.routeguideB\x0fRouteGuideProtoP\x01\xa2\x02\x03RTGb\x06proto3') serialized_pb=_b('\n\x11route_guide.proto\x12\nrouteguide\",\n\x05Point\x12\x10\n\x08latitude\x18\x01 \x01(\x05\x12\x11\n\tlongitude\x18\x02 \x01(\x05\"I\n\tRectangle\x12\x1d\n\x02lo\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x1d\n\x02hi\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"<\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.routeguide.Point\"A\n\tRouteNote\x12#\n\x08location\x18\x01 \x01(\x0b\x32\x11.routeguide.Point\x12\x0f\n\x07message\x18\x02 \x01(\t\"b\n\x0cRouteSummary\x12\x13\n\x0bpoint_count\x18\x01 \x01(\x05\x12\x15\n\rfeature_count\x18\x02 \x01(\x05\x12\x10\n\x08\x64istance\x18\x03 \x01(\x05\x12\x14\n\x0c\x65lapsed_time\x18\x04 \x01(\x05\x32\x85\x02\n\nRouteGuide\x12\x36\n\nGetFeature\x12\x11.routeguide.Point\x1a\x13.routeguide.Feature\"\x00\x12>\n\x0cListFeatures\x12\x15.routeguide.Rectangle\x1a\x13.routeguide.Feature\"\x00\x30\x01\x12>\n\x0bRecordRoute\x12\x11.routeguide.Point\x1a\x18.routeguide.RouteSummary\"\x00(\x01\x12?\n\tRouteChat\x12\x15.routeguide.RouteNote\x1a\x15.routeguide.RouteNote\"\x00(\x01\x30\x01\x42\x36\n\x1bio.grpc.examples.routeguideB\x0fRouteGuideProtoP\x01\xa2\x02\x03RTGb\x06proto3')
) )
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
@ -238,6 +237,7 @@ DESCRIPTOR.message_types_by_name['Rectangle'] = _RECTANGLE
DESCRIPTOR.message_types_by_name['Feature'] = _FEATURE DESCRIPTOR.message_types_by_name['Feature'] = _FEATURE
DESCRIPTOR.message_types_by_name['RouteNote'] = _ROUTENOTE DESCRIPTOR.message_types_by_name['RouteNote'] = _ROUTENOTE
DESCRIPTOR.message_types_by_name['RouteSummary'] = _ROUTESUMMARY DESCRIPTOR.message_types_by_name['RouteSummary'] = _ROUTESUMMARY
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), dict( Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), dict(
DESCRIPTOR = _POINT, DESCRIPTOR = _POINT,
@ -277,265 +277,55 @@ _sym_db.RegisterMessage(RouteSummary)
DESCRIPTOR.has_options = True DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.routeguideB\017RouteGuideProtoP\001\242\002\003RTG')) DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.routeguideB\017RouteGuideProtoP\001\242\002\003RTG'))
try:
# THESE ELEMENTS WILL BE DEPRECATED.
# Please use the generated *_pb2_grpc.py files instead.
import grpc
from grpc.framework.common import cardinality
from grpc.framework.interfaces.face import utilities as face_utilities
from grpc.beta import implementations as beta_implementations
from grpc.beta import interfaces as beta_interfaces
class RouteGuideStub(object):
"""Interface exported by the server.
"""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.GetFeature = channel.unary_unary(
'/routeguide.RouteGuide/GetFeature',
request_serializer=Point.SerializeToString,
response_deserializer=Feature.FromString,
)
self.ListFeatures = channel.unary_stream(
'/routeguide.RouteGuide/ListFeatures',
request_serializer=Rectangle.SerializeToString,
response_deserializer=Feature.FromString,
)
self.RecordRoute = channel.stream_unary(
'/routeguide.RouteGuide/RecordRoute',
request_serializer=Point.SerializeToString,
response_deserializer=RouteSummary.FromString,
)
self.RouteChat = channel.stream_stream(
'/routeguide.RouteGuide/RouteChat',
request_serializer=RouteNote.SerializeToString,
response_deserializer=RouteNote.FromString,
)
class RouteGuideServicer(object):
"""Interface exported by the server.
"""
def GetFeature(self, request, context):
"""A simple RPC.
Obtains the feature at a given position.
A feature with an empty name is returned if there's no feature at the given
position.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ListFeatures(self, request, context): _ROUTEGUIDE = _descriptor.ServiceDescriptor(
"""A server-to-client streaming RPC. name='RouteGuide',
full_name='routeguide.RouteGuide',
Obtains the Features available within the given Rectangle. Results are file=DESCRIPTOR,
streamed rather than returned at once (e.g. in a response message with a index=0,
repeated field), as the rectangle may cover a large area and contain a options=None,
huge number of features. serialized_start=384,
""" serialized_end=645,
context.set_code(grpc.StatusCode.UNIMPLEMENTED) methods=[
context.set_details('Method not implemented!') _descriptor.MethodDescriptor(
raise NotImplementedError('Method not implemented!') name='GetFeature',
full_name='routeguide.RouteGuide.GetFeature',
def RecordRoute(self, request_iterator, context): index=0,
"""A client-to-server streaming RPC. containing_service=None,
input_type=_POINT,
Accepts a stream of Points on a route being traversed, returning a output_type=_FEATURE,
RouteSummary when traversal is completed. options=None,
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RouteChat(self, request_iterator, context):
"""A Bidirectional streaming RPC.
Accepts a stream of RouteNotes sent while a route is being traversed,
while receiving other RouteNotes (e.g. from other users).
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_RouteGuideServicer_to_server(servicer, server):
rpc_method_handlers = {
'GetFeature': grpc.unary_unary_rpc_method_handler(
servicer.GetFeature,
request_deserializer=Point.FromString,
response_serializer=Feature.SerializeToString,
), ),
'ListFeatures': grpc.unary_stream_rpc_method_handler( _descriptor.MethodDescriptor(
servicer.ListFeatures, name='ListFeatures',
request_deserializer=Rectangle.FromString, full_name='routeguide.RouteGuide.ListFeatures',
response_serializer=Feature.SerializeToString, index=1,
containing_service=None,
input_type=_RECTANGLE,
output_type=_FEATURE,
options=None,
), ),
'RecordRoute': grpc.stream_unary_rpc_method_handler( _descriptor.MethodDescriptor(
servicer.RecordRoute, name='RecordRoute',
request_deserializer=Point.FromString, full_name='routeguide.RouteGuide.RecordRoute',
response_serializer=RouteSummary.SerializeToString, index=2,
containing_service=None,
input_type=_POINT,
output_type=_ROUTESUMMARY,
options=None,
), ),
'RouteChat': grpc.stream_stream_rpc_method_handler( _descriptor.MethodDescriptor(
servicer.RouteChat, name='RouteChat',
request_deserializer=RouteNote.FromString, full_name='routeguide.RouteGuide.RouteChat',
response_serializer=RouteNote.SerializeToString, index=3,
containing_service=None,
input_type=_ROUTENOTE,
output_type=_ROUTENOTE,
options=None,
), ),
} ])
generic_handler = grpc.method_handlers_generic_handler( _sym_db.RegisterServiceDescriptor(_ROUTEGUIDE)
'routeguide.RouteGuide', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
class BetaRouteGuideServicer(object):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This class was generated
only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
"""Interface exported by the server.
"""
def GetFeature(self, request, context):
"""A simple RPC.
Obtains the feature at a given position.
A feature with an empty name is returned if there's no feature at the given
position.
"""
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def ListFeatures(self, request, context):
"""A server-to-client streaming RPC.
Obtains the Features available within the given Rectangle. Results are
streamed rather than returned at once (e.g. in a response message with a
repeated field), as the rectangle may cover a large area and contain a
huge number of features.
"""
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def RecordRoute(self, request_iterator, context):
"""A client-to-server streaming RPC.
Accepts a stream of Points on a route being traversed, returning a
RouteSummary when traversal is completed.
"""
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def RouteChat(self, request_iterator, context):
"""A Bidirectional streaming RPC.
Accepts a stream of RouteNotes sent while a route is being traversed,
while receiving other RouteNotes (e.g. from other users).
"""
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
class BetaRouteGuideStub(object):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This class was generated
only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
"""Interface exported by the server.
"""
def GetFeature(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
"""A simple RPC.
Obtains the feature at a given position.
A feature with an empty name is returned if there's no feature at the given
position.
"""
raise NotImplementedError()
GetFeature.future = None
def ListFeatures(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
"""A server-to-client streaming RPC.
Obtains the Features available within the given Rectangle. Results are
streamed rather than returned at once (e.g. in a response message with a
repeated field), as the rectangle may cover a large area and contain a
huge number of features.
"""
raise NotImplementedError()
def RecordRoute(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
"""A client-to-server streaming RPC.
Accepts a stream of Points on a route being traversed, returning a
RouteSummary when traversal is completed.
"""
raise NotImplementedError()
RecordRoute.future = None
def RouteChat(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
"""A Bidirectional streaming RPC.
Accepts a stream of RouteNotes sent while a route is being traversed,
while receiving other RouteNotes (e.g. from other users).
"""
raise NotImplementedError()
def beta_create_RouteGuide_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This function was
generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
request_deserializers = {
('routeguide.RouteGuide', 'GetFeature'): Point.FromString,
('routeguide.RouteGuide', 'ListFeatures'): Rectangle.FromString,
('routeguide.RouteGuide', 'RecordRoute'): Point.FromString,
('routeguide.RouteGuide', 'RouteChat'): RouteNote.FromString,
}
response_serializers = {
('routeguide.RouteGuide', 'GetFeature'): Feature.SerializeToString,
('routeguide.RouteGuide', 'ListFeatures'): Feature.SerializeToString,
('routeguide.RouteGuide', 'RecordRoute'): RouteSummary.SerializeToString,
('routeguide.RouteGuide', 'RouteChat'): RouteNote.SerializeToString,
}
method_implementations = {
('routeguide.RouteGuide', 'GetFeature'): face_utilities.unary_unary_inline(servicer.GetFeature),
('routeguide.RouteGuide', 'ListFeatures'): face_utilities.unary_stream_inline(servicer.ListFeatures),
('routeguide.RouteGuide', 'RecordRoute'): face_utilities.stream_unary_inline(servicer.RecordRoute),
('routeguide.RouteGuide', 'RouteChat'): face_utilities.stream_stream_inline(servicer.RouteChat),
}
server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
return beta_implementations.server(method_implementations, options=server_options)
def beta_create_RouteGuide_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): DESCRIPTOR.services_by_name['RouteGuide'] = _ROUTEGUIDE
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This function was
generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
request_serializers = {
('routeguide.RouteGuide', 'GetFeature'): Point.SerializeToString,
('routeguide.RouteGuide', 'ListFeatures'): Rectangle.SerializeToString,
('routeguide.RouteGuide', 'RecordRoute'): Point.SerializeToString,
('routeguide.RouteGuide', 'RouteChat'): RouteNote.SerializeToString,
}
response_deserializers = {
('routeguide.RouteGuide', 'GetFeature'): Feature.FromString,
('routeguide.RouteGuide', 'ListFeatures'): Feature.FromString,
('routeguide.RouteGuide', 'RecordRoute'): RouteSummary.FromString,
('routeguide.RouteGuide', 'RouteChat'): RouteNote.FromString,
}
cardinalities = {
'GetFeature': cardinality.Cardinality.UNARY_UNARY,
'ListFeatures': cardinality.Cardinality.UNARY_STREAM,
'RecordRoute': cardinality.Cardinality.STREAM_UNARY,
'RouteChat': cardinality.Cardinality.STREAM_STREAM,
}
stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
return beta_implementations.dynamic_stub(channel, 'routeguide.RouteGuide', cardinalities, options=stub_options)
except ImportError:
pass
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

@ -1,6 +1,5 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
import grpc import grpc
from grpc.framework.common import cardinality
from grpc.framework.interfaces.face import utilities as face_utilities
import route_guide_pb2 as route__guide__pb2 import route_guide_pb2 as route__guide__pb2

@ -89,6 +89,7 @@ Pod::Spec.new do |s|
s.default_subspecs = 'Interface', 'Implementation' s.default_subspecs = 'Interface', 'Implementation'
s.compiler_flags = '-DGRPC_ARES=0' s.compiler_flags = '-DGRPC_ARES=0'
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
# sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't
@ -298,6 +299,7 @@ Pod::Spec.new do |s|
'src/core/tsi/transport_security_adapter.h', 'src/core/tsi/transport_security_adapter.h',
'src/core/tsi/transport_security_interface.h', 'src/core/tsi/transport_security_interface.h',
'src/core/ext/transport/chttp2/server/chttp2_server.h', 'src/core/ext/transport/chttp2/server/chttp2_server.h',
'src/core/ext/filters/client_channel/backup_poller.h',
'src/core/ext/filters/client_channel/client_channel.h', 'src/core/ext/filters/client_channel/client_channel.h',
'src/core/ext/filters/client_channel/client_channel_factory.h', 'src/core/ext/filters/client_channel/client_channel_factory.h',
'src/core/ext/filters/client_channel/connector.h', 'src/core/ext/filters/client_channel/connector.h',
@ -447,28 +449,11 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h',
'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h', 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h',
'src/core/ext/filters/load_reporting/server_load_reporting_filter.h', 'src/core/ext/filters/load_reporting/server_load_reporting_filter.h',
'src/core/ext/filters/load_reporting/server_load_reporting_plugin.h', 'src/core/ext/filters/load_reporting/server_load_reporting_plugin.h',
'src/core/ext/census/aggregation.h',
'src/core/ext/census/base_resources.h',
'src/core/ext/census/census_interface.h',
'src/core/ext/census/census_rpc_stats.h',
'src/core/ext/census/gen/census.pb.h',
'src/core/ext/census/gen/trace_context.pb.h',
'src/core/ext/census/grpc_filter.h',
'src/core/ext/census/intrusive_hash_map.h',
'src/core/ext/census/intrusive_hash_map_internal.h',
'src/core/ext/census/mlog.h',
'src/core/ext/census/resource.h',
'src/core/ext/census/rpc_metric_id.h',
'src/core/ext/census/trace_context.h',
'src/core/ext/census/trace_label.h',
'src/core/ext/census/trace_propagation.h',
'src/core/ext/census/trace_status.h',
'src/core/ext/census/trace_string.h',
'src/core/ext/census/tracing.h',
'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h',
'src/core/ext/filters/message_size/message_size_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h',
'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h', 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h',
@ -667,6 +652,7 @@ Pod::Spec.new do |s|
'src/core/tsi/transport_security_adapter.cc', 'src/core/tsi/transport_security_adapter.cc',
'src/core/ext/transport/chttp2/server/chttp2_server.cc', 'src/core/ext/transport/chttp2/server/chttp2_server.cc',
'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc', 'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc', 'src/core/ext/filters/client_channel/channel_connectivity.cc',
'src/core/ext/filters/client_channel/client_channel.cc', 'src/core/ext/filters/client_channel/client_channel.cc',
'src/core/ext/filters/client_channel/client_channel_factory.cc', 'src/core/ext/filters/client_channel/client_channel_factory.cc',
@ -703,6 +689,7 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c', 'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
'src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc',
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc',
@ -712,21 +699,7 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc', 'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc',
'src/core/ext/filters/load_reporting/server_load_reporting_filter.cc', 'src/core/ext/filters/load_reporting/server_load_reporting_filter.cc',
'src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc', 'src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc',
'src/core/ext/census/base_resources.cc',
'src/core/ext/census/context.cc',
'src/core/ext/census/gen/census.pb.c',
'src/core/ext/census/gen/trace_context.pb.c',
'src/core/ext/census/grpc_context.cc', 'src/core/ext/census/grpc_context.cc',
'src/core/ext/census/grpc_filter.cc',
'src/core/ext/census/grpc_plugin.cc',
'src/core/ext/census/initialize.cc',
'src/core/ext/census/intrusive_hash_map.cc',
'src/core/ext/census/mlog.cc',
'src/core/ext/census/operation.cc',
'src/core/ext/census/placeholders.cc',
'src/core/ext/census/resource.cc',
'src/core/ext/census/trace_context.cc',
'src/core/ext/census/tracing.cc',
'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc', 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc',
@ -801,6 +774,7 @@ Pod::Spec.new do |s|
'src/core/tsi/transport_security_adapter.h', 'src/core/tsi/transport_security_adapter.h',
'src/core/tsi/transport_security_interface.h', 'src/core/tsi/transport_security_interface.h',
'src/core/ext/transport/chttp2/server/chttp2_server.h', 'src/core/ext/transport/chttp2/server/chttp2_server.h',
'src/core/ext/filters/client_channel/backup_poller.h',
'src/core/ext/filters/client_channel/client_channel.h', 'src/core/ext/filters/client_channel/client_channel.h',
'src/core/ext/filters/client_channel/client_channel_factory.h', 'src/core/ext/filters/client_channel/client_channel_factory.h',
'src/core/ext/filters/client_channel/connector.h', 'src/core/ext/filters/client_channel/connector.h',
@ -950,28 +924,11 @@ Pod::Spec.new do |s|
'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h',
'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h', 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h',
'src/core/ext/filters/load_reporting/server_load_reporting_filter.h', 'src/core/ext/filters/load_reporting/server_load_reporting_filter.h',
'src/core/ext/filters/load_reporting/server_load_reporting_plugin.h', 'src/core/ext/filters/load_reporting/server_load_reporting_plugin.h',
'src/core/ext/census/aggregation.h',
'src/core/ext/census/base_resources.h',
'src/core/ext/census/census_interface.h',
'src/core/ext/census/census_rpc_stats.h',
'src/core/ext/census/gen/census.pb.h',
'src/core/ext/census/gen/trace_context.pb.h',
'src/core/ext/census/grpc_filter.h',
'src/core/ext/census/intrusive_hash_map.h',
'src/core/ext/census/intrusive_hash_map_internal.h',
'src/core/ext/census/mlog.h',
'src/core/ext/census/resource.h',
'src/core/ext/census/rpc_metric_id.h',
'src/core/ext/census/trace_context.h',
'src/core/ext/census/trace_label.h',
'src/core/ext/census/trace_propagation.h',
'src/core/ext/census/trace_status.h',
'src/core/ext/census/trace_string.h',
'src/core/ext/census/tracing.h',
'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h',
'src/core/ext/filters/message_size/message_size_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h',
'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h', 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h',
@ -1001,17 +958,17 @@ Pod::Spec.new do |s|
ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Interface", version
ss.dependency "#{s.name}/Implementation", version ss.dependency "#{s.name}/Implementation", version
ss.source_files = 'test/core/end2end/cq_verifier.{c,h}', ss.source_files = 'test/core/end2end/cq_verifier.{cc,h}',
'test/core/end2end/end2end_tests.{c,h}', 'test/core/end2end/end2end_tests.{cc,h}',
'test/core/end2end/end2end_test_utils.c', 'test/core/end2end/end2end_test_utils.cc',
'test/core/end2end/tests/*.{c,h}', 'test/core/end2end/tests/*.{cc,h}',
'test/core/end2end/fixtures/*.h', 'test/core/end2end/fixtures/*.h',
'test/core/end2end/data/*.{c,h}', 'test/core/end2end/data/*.{cc,h}',
'test/core/util/debugger_macros.{c,h}', 'test/core/util/debugger_macros.{cc,h}',
'test/core/util/test_config.{c,h}', 'test/core/util/test_config.{cc,h}',
'test/core/util/port.h', 'test/core/util/port.h',
'test/core/util/port.c', 'test/core/util/port.cc',
'test/core/util/port_server_client.{c,h}' 'test/core/util/port_server_client.{cc,h}'
end end
# TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path? # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?

@ -1,32 +1,4 @@
EXPORTS EXPORTS
census_initialize
census_shutdown
census_supported
census_enabled
census_context_create
census_context_destroy
census_context_get_status
census_context_initialize_iterator
census_context_next_tag
census_context_get_tag
census_context_encode
census_context_decode
census_trace_mask
census_set_trace_mask
census_start_rpc_op_timestamp
census_start_client_rpc_op
census_set_rpc_client_peer
census_start_server_rpc_op
census_start_op
census_end_op
census_trace_print
census_trace_scan_start
census_get_trace_record
census_trace_scan_end
census_define_resource
census_delete_resource
census_resource_id
census_record_values
grpc_compression_algorithm_parse grpc_compression_algorithm_parse
grpc_compression_algorithm_name grpc_compression_algorithm_name
grpc_stream_compression_algorithm_name grpc_stream_compression_algorithm_name
@ -54,6 +26,8 @@ EXPORTS
grpc_completion_queue_pluck grpc_completion_queue_pluck
grpc_completion_queue_shutdown grpc_completion_queue_shutdown
grpc_completion_queue_destroy grpc_completion_queue_destroy
grpc_completion_queue_thread_local_cache_init
grpc_completion_queue_thread_local_cache_flush
grpc_alarm_create grpc_alarm_create
grpc_alarm_set grpc_alarm_set
grpc_alarm_cancel grpc_alarm_cancel
@ -130,8 +104,14 @@ EXPORTS
grpc_metadata_credentials_create_from_plugin grpc_metadata_credentials_create_from_plugin
grpc_secure_channel_create grpc_secure_channel_create
grpc_server_credentials_release grpc_server_credentials_release
grpc_ssl_server_certificate_config_create
grpc_ssl_server_certificate_config_destroy
grpc_ssl_server_credentials_create grpc_ssl_server_credentials_create
grpc_ssl_server_credentials_create_ex grpc_ssl_server_credentials_create_ex
grpc_ssl_server_credentials_create_options_using_config
grpc_ssl_server_credentials_create_options_using_config_fetcher
grpc_ssl_server_credentials_options_destroy
grpc_ssl_server_credentials_create_with_options
grpc_server_add_secure_http2_port grpc_server_add_secure_http2_port
grpc_call_set_credentials grpc_call_set_credentials
grpc_server_credentials_set_auth_metadata_processor grpc_server_credentials_set_auth_metadata_processor
@ -169,7 +149,6 @@ EXPORTS
grpc_slice_eq grpc_slice_eq
grpc_slice_cmp grpc_slice_cmp
grpc_slice_str_cmp grpc_slice_str_cmp
grpc_slice_buf_cmp
grpc_slice_buf_start_eq grpc_slice_buf_start_eq
grpc_slice_rchr grpc_slice_rchr
grpc_slice_chr grpc_slice_chr

@ -28,7 +28,7 @@ Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.add_dependency 'google-protobuf', '~> 3.1' s.add_dependency 'google-protobuf', '~> 3.1'
s.add_dependency 'googleauth', '~> 0.5.1' s.add_dependency 'googleauth', '>= 0.5.1', '< 0.7'
s.add_dependency 'googleapis-common-protos-types', '~> 1.0.0' s.add_dependency 'googleapis-common-protos-types', '~> 1.0.0'
s.add_development_dependency 'bundler', '~> 1.9' s.add_development_dependency 'bundler', '~> 1.9'
@ -230,6 +230,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/tsi/transport_security_adapter.h ) s.files += %w( src/core/tsi/transport_security_adapter.h )
s.files += %w( src/core/tsi/transport_security_interface.h ) s.files += %w( src/core/tsi/transport_security_interface.h )
s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.h ) s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.h )
s.files += %w( src/core/ext/filters/client_channel/backup_poller.h )
s.files += %w( src/core/ext/filters/client_channel/client_channel.h ) s.files += %w( src/core/ext/filters/client_channel/client_channel.h )
s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.h ) s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.h )
s.files += %w( src/core/ext/filters/client_channel/connector.h ) s.files += %w( src/core/ext/filters/client_channel/connector.h )
@ -383,28 +384,11 @@ Gem::Specification.new do |s|
s.files += %w( third_party/nanopb/pb_decode.h ) s.files += %w( third_party/nanopb/pb_decode.h )
s.files += %w( third_party/nanopb/pb_encode.h ) s.files += %w( third_party/nanopb/pb_encode.h )
s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h ) s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h )
s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h ) s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h )
s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h ) s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h )
s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_filter.h ) s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_filter.h )
s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_plugin.h ) s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_plugin.h )
s.files += %w( src/core/ext/census/aggregation.h )
s.files += %w( src/core/ext/census/base_resources.h )
s.files += %w( src/core/ext/census/census_interface.h )
s.files += %w( src/core/ext/census/census_rpc_stats.h )
s.files += %w( src/core/ext/census/gen/census.pb.h )
s.files += %w( src/core/ext/census/gen/trace_context.pb.h )
s.files += %w( src/core/ext/census/grpc_filter.h )
s.files += %w( src/core/ext/census/intrusive_hash_map.h )
s.files += %w( src/core/ext/census/intrusive_hash_map_internal.h )
s.files += %w( src/core/ext/census/mlog.h )
s.files += %w( src/core/ext/census/resource.h )
s.files += %w( src/core/ext/census/rpc_metric_id.h )
s.files += %w( src/core/ext/census/trace_context.h )
s.files += %w( src/core/ext/census/trace_label.h )
s.files += %w( src/core/ext/census/trace_propagation.h )
s.files += %w( src/core/ext/census/trace_status.h )
s.files += %w( src/core/ext/census/trace_string.h )
s.files += %w( src/core/ext/census/tracing.h )
s.files += %w( src/core/ext/filters/max_age/max_age_filter.h ) s.files += %w( src/core/ext/filters/max_age/max_age_filter.h )
s.files += %w( src/core/ext/filters/message_size/message_size_filter.h ) s.files += %w( src/core/ext/filters/message_size/message_size_filter.h )
s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h ) s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h )
@ -603,6 +587,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/tsi/transport_security_adapter.cc ) s.files += %w( src/core/tsi/transport_security_adapter.cc )
s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.cc ) s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.cc )
s.files += %w( src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc ) s.files += %w( src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc )
s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc )
s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc ) s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc )
s.files += %w( src/core/ext/filters/client_channel/client_channel.cc ) s.files += %w( src/core/ext/filters/client_channel/client_channel.cc )
s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.cc ) s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.cc )
@ -642,6 +627,7 @@ Gem::Specification.new do |s|
s.files += %w( third_party/nanopb/pb_encode.c ) s.files += %w( third_party/nanopb/pb_encode.c )
s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc ) s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc )
s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc ) s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc ) s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc )
@ -651,21 +637,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc ) s.files += %w( src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc )
s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_filter.cc ) s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_filter.cc )
s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc ) s.files += %w( src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc )
s.files += %w( src/core/ext/census/base_resources.cc )
s.files += %w( src/core/ext/census/context.cc )
s.files += %w( src/core/ext/census/gen/census.pb.c )
s.files += %w( src/core/ext/census/gen/trace_context.pb.c )
s.files += %w( src/core/ext/census/grpc_context.cc ) s.files += %w( src/core/ext/census/grpc_context.cc )
s.files += %w( src/core/ext/census/grpc_filter.cc )
s.files += %w( src/core/ext/census/grpc_plugin.cc )
s.files += %w( src/core/ext/census/initialize.cc )
s.files += %w( src/core/ext/census/intrusive_hash_map.cc )
s.files += %w( src/core/ext/census/mlog.cc )
s.files += %w( src/core/ext/census/operation.cc )
s.files += %w( src/core/ext/census/placeholders.cc )
s.files += %w( src/core/ext/census/resource.cc )
s.files += %w( src/core/ext/census/trace_context.cc )
s.files += %w( src/core/ext/census/tracing.cc )
s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc ) s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc )
s.files += %w( src/core/ext/filters/message_size/message_size_filter.cc ) s.files += %w( src/core/ext/filters/message_size/message_size_filter.cc )
s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc ) s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc )

@ -215,7 +215,7 @@
'gpr', 'gpr',
], ],
'sources': [ 'sources': [
'test/core/util/test_config.c', 'test/core/util/test_config.cc',
], ],
}, },
{ {
@ -419,6 +419,7 @@
'src/core/tsi/transport_security_adapter.cc', 'src/core/tsi/transport_security_adapter.cc',
'src/core/ext/transport/chttp2/server/chttp2_server.cc', 'src/core/ext/transport/chttp2/server/chttp2_server.cc',
'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc', 'src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc', 'src/core/ext/filters/client_channel/channel_connectivity.cc',
'src/core/ext/filters/client_channel/client_channel.cc', 'src/core/ext/filters/client_channel/client_channel.cc',
'src/core/ext/filters/client_channel/client_channel_factory.cc', 'src/core/ext/filters/client_channel/client_channel_factory.cc',
@ -458,6 +459,7 @@
'third_party/nanopb/pb_encode.c', 'third_party/nanopb/pb_encode.c',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
'src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc',
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc',
'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc', 'src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc',
@ -467,21 +469,7 @@
'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc', 'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc',
'src/core/ext/filters/load_reporting/server_load_reporting_filter.cc', 'src/core/ext/filters/load_reporting/server_load_reporting_filter.cc',
'src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc', 'src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc',
'src/core/ext/census/base_resources.cc',
'src/core/ext/census/context.cc',
'src/core/ext/census/gen/census.pb.c',
'src/core/ext/census/gen/trace_context.pb.c',
'src/core/ext/census/grpc_context.cc', 'src/core/ext/census/grpc_context.cc',
'src/core/ext/census/grpc_filter.cc',
'src/core/ext/census/grpc_plugin.cc',
'src/core/ext/census/initialize.cc',
'src/core/ext/census/intrusive_hash_map.cc',
'src/core/ext/census/mlog.cc',
'src/core/ext/census/operation.cc',
'src/core/ext/census/placeholders.cc',
'src/core/ext/census/resource.cc',
'src/core/ext/census/trace_context.cc',
'src/core/ext/census/tracing.cc',
'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc', 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc',
@ -508,26 +496,26 @@
'grpc', 'grpc',
], ],
'sources': [ 'sources': [
'test/core/end2end/data/client_certs.c', 'test/core/end2end/data/client_certs.cc',
'test/core/end2end/data/server1_cert.c', 'test/core/end2end/data/server1_cert.cc',
'test/core/end2end/data/server1_key.c', 'test/core/end2end/data/server1_key.cc',
'test/core/end2end/data/test_root_cert.c', 'test/core/end2end/data/test_root_cert.cc',
'test/core/security/oauth2_utils.c', 'test/core/security/oauth2_utils.cc',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
'test/core/end2end/cq_verifier.c', 'test/core/end2end/cq_verifier.cc',
'test/core/end2end/fixtures/http_proxy_fixture.c', 'test/core/end2end/fixtures/http_proxy_fixture.cc',
'test/core/end2end/fixtures/proxy.c', 'test/core/end2end/fixtures/proxy.cc',
'test/core/iomgr/endpoint_tests.c', 'test/core/iomgr/endpoint_tests.cc',
'test/core/util/debugger_macros.cc', 'test/core/util/debugger_macros.cc',
'test/core/util/grpc_profiler.c', 'test/core/util/grpc_profiler.cc',
'test/core/util/memory_counters.c', 'test/core/util/memory_counters.cc',
'test/core/util/mock_endpoint.c', 'test/core/util/mock_endpoint.cc',
'test/core/util/parse_hexstring.c', 'test/core/util/parse_hexstring.cc',
'test/core/util/passthru_endpoint.c', 'test/core/util/passthru_endpoint.cc',
'test/core/util/port.c', 'test/core/util/port.cc',
'test/core/util/port_server_client.c', 'test/core/util/port_server_client.cc',
'test/core/util/slice_splitter.c', 'test/core/util/slice_splitter.cc',
'test/core/util/trickle_endpoint.c', 'test/core/util/trickle_endpoint.cc',
'src/core/lib/backoff/backoff.cc', 'src/core/lib/backoff/backoff.cc',
'src/core/lib/channel/channel_args.cc', 'src/core/lib/channel/channel_args.cc',
'src/core/lib/channel/channel_stack.cc', 'src/core/lib/channel/channel_stack.cc',
@ -661,6 +649,7 @@
'src/core/lib/transport/transport.cc', 'src/core/lib/transport/transport.cc',
'src/core/lib/transport/transport_op_string.cc', 'src/core/lib/transport/transport_op_string.cc',
'src/core/lib/debug/trace.cc', 'src/core/lib/debug/trace.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc', 'src/core/ext/filters/client_channel/channel_connectivity.cc',
'src/core/ext/filters/client_channel/client_channel.cc', 'src/core/ext/filters/client_channel/client_channel.cc',
'src/core/ext/filters/client_channel/client_channel_factory.cc', 'src/core/ext/filters/client_channel/client_channel_factory.cc',
@ -721,20 +710,20 @@
], ],
'sources': [ 'sources': [
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc', 'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
'test/core/end2end/cq_verifier.c', 'test/core/end2end/cq_verifier.cc',
'test/core/end2end/fixtures/http_proxy_fixture.c', 'test/core/end2end/fixtures/http_proxy_fixture.cc',
'test/core/end2end/fixtures/proxy.c', 'test/core/end2end/fixtures/proxy.cc',
'test/core/iomgr/endpoint_tests.c', 'test/core/iomgr/endpoint_tests.cc',
'test/core/util/debugger_macros.cc', 'test/core/util/debugger_macros.cc',
'test/core/util/grpc_profiler.c', 'test/core/util/grpc_profiler.cc',
'test/core/util/memory_counters.c', 'test/core/util/memory_counters.cc',
'test/core/util/mock_endpoint.c', 'test/core/util/mock_endpoint.cc',
'test/core/util/parse_hexstring.c', 'test/core/util/parse_hexstring.cc',
'test/core/util/passthru_endpoint.c', 'test/core/util/passthru_endpoint.cc',
'test/core/util/port.c', 'test/core/util/port.cc',
'test/core/util/port_server_client.c', 'test/core/util/port_server_client.cc',
'test/core/util/slice_splitter.c', 'test/core/util/slice_splitter.cc',
'test/core/util/trickle_endpoint.c', 'test/core/util/trickle_endpoint.cc',
'src/core/lib/backoff/backoff.cc', 'src/core/lib/backoff/backoff.cc',
'src/core/lib/channel/channel_args.cc', 'src/core/lib/channel/channel_args.cc',
'src/core/lib/channel/channel_stack.cc', 'src/core/lib/channel/channel_stack.cc',
@ -868,6 +857,7 @@
'src/core/lib/transport/transport.cc', 'src/core/lib/transport/transport.cc',
'src/core/lib/transport/transport_op_string.cc', 'src/core/lib/transport/transport_op_string.cc',
'src/core/lib/debug/trace.cc', 'src/core/lib/debug/trace.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc', 'src/core/ext/filters/client_channel/channel_connectivity.cc',
'src/core/ext/filters/client_channel/client_channel.cc', 'src/core/ext/filters/client_channel/client_channel.cc',
'src/core/ext/filters/client_channel/client_channel_factory.cc', 'src/core/ext/filters/client_channel/client_channel_factory.cc',
@ -1093,6 +1083,7 @@
'src/core/ext/transport/chttp2/client/insecure/channel_create.cc', 'src/core/ext/transport/chttp2/client/insecure/channel_create.cc',
'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc', 'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
'src/core/ext/transport/chttp2/client/chttp2_connector.cc', 'src/core/ext/transport/chttp2/client/chttp2_connector.cc',
'src/core/ext/filters/client_channel/backup_poller.cc',
'src/core/ext/filters/client_channel/channel_connectivity.cc', 'src/core/ext/filters/client_channel/channel_connectivity.cc',
'src/core/ext/filters/client_channel/client_channel.cc', 'src/core/ext/filters/client_channel/client_channel.cc',
'src/core/ext/filters/client_channel/client_channel_factory.cc', 'src/core/ext/filters/client_channel/client_channel_factory.cc',
@ -1135,22 +1126,9 @@
'third_party/nanopb/pb_decode.c', 'third_party/nanopb/pb_decode.c',
'third_party/nanopb/pb_encode.c', 'third_party/nanopb/pb_encode.c',
'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc',
'src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc',
'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc',
'src/core/ext/census/base_resources.cc',
'src/core/ext/census/context.cc',
'src/core/ext/census/gen/census.pb.c',
'src/core/ext/census/gen/trace_context.pb.c',
'src/core/ext/census/grpc_context.cc', 'src/core/ext/census/grpc_context.cc',
'src/core/ext/census/grpc_filter.cc',
'src/core/ext/census/grpc_plugin.cc',
'src/core/ext/census/initialize.cc',
'src/core/ext/census/intrusive_hash_map.cc',
'src/core/ext/census/mlog.cc',
'src/core/ext/census/operation.cc',
'src/core/ext/census/placeholders.cc',
'src/core/ext/census/resource.cc',
'src/core/ext/census/trace_context.cc',
'src/core/ext/census/tracing.cc',
'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc',
'src/core/ext/filters/message_size/message_size_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc',
'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc', 'src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc',
@ -1169,7 +1147,7 @@
'gpr', 'gpr',
], ],
'sources': [ 'sources': [
'test/core/util/reconnect_server.c', 'test/core/util/reconnect_server.cc',
], ],
}, },
{ {
@ -1182,7 +1160,7 @@
'gpr', 'gpr',
], ],
'sources': [ 'sources': [
'test/core/util/test_tcp_server.c', 'test/core/util/test_tcp_server.cc',
], ],
}, },
{ {
@ -2316,6 +2294,7 @@
'third_party/benchmark/src/commandlineflags.cc', 'third_party/benchmark/src/commandlineflags.cc',
'third_party/benchmark/src/complexity.cc', 'third_party/benchmark/src/complexity.cc',
'third_party/benchmark/src/console_reporter.cc', 'third_party/benchmark/src/console_reporter.cc',
'third_party/benchmark/src/counter.cc',
'third_party/benchmark/src/csv_reporter.cc', 'third_party/benchmark/src/csv_reporter.cc',
'third_party/benchmark/src/json_reporter.cc', 'third_party/benchmark/src/json_reporter.cc',
'third_party/benchmark/src/reporter.cc', 'third_party/benchmark/src/reporter.cc',
@ -2358,7 +2337,7 @@
'gpr', 'gpr',
], ],
'sources': [ 'sources': [
'test/core/bad_client/bad_client.c', 'test/core/bad_client/bad_client.cc',
], ],
}, },
{ {
@ -2371,67 +2350,67 @@
'gpr', 'gpr',
], ],
'sources': [ 'sources': [
'test/core/end2end/end2end_tests.c', 'test/core/end2end/end2end_tests.cc',
'test/core/end2end/end2end_test_utils.c', 'test/core/end2end/end2end_test_utils.cc',
'test/core/end2end/tests/authority_not_supported.c', 'test/core/end2end/tests/authority_not_supported.cc',
'test/core/end2end/tests/bad_hostname.c', 'test/core/end2end/tests/bad_hostname.cc',
'test/core/end2end/tests/bad_ping.c', 'test/core/end2end/tests/bad_ping.cc',
'test/core/end2end/tests/binary_metadata.c', 'test/core/end2end/tests/binary_metadata.cc',
'test/core/end2end/tests/call_creds.c', 'test/core/end2end/tests/call_creds.cc',
'test/core/end2end/tests/cancel_after_accept.c', 'test/core/end2end/tests/cancel_after_accept.cc',
'test/core/end2end/tests/cancel_after_client_done.c', 'test/core/end2end/tests/cancel_after_client_done.cc',
'test/core/end2end/tests/cancel_after_invoke.c', 'test/core/end2end/tests/cancel_after_invoke.cc',
'test/core/end2end/tests/cancel_after_round_trip.c', 'test/core/end2end/tests/cancel_after_round_trip.cc',
'test/core/end2end/tests/cancel_before_invoke.c', 'test/core/end2end/tests/cancel_before_invoke.cc',
'test/core/end2end/tests/cancel_in_a_vacuum.c', 'test/core/end2end/tests/cancel_in_a_vacuum.cc',
'test/core/end2end/tests/cancel_with_status.c', 'test/core/end2end/tests/cancel_with_status.cc',
'test/core/end2end/tests/compressed_payload.c', 'test/core/end2end/tests/compressed_payload.cc',
'test/core/end2end/tests/connectivity.c', 'test/core/end2end/tests/connectivity.cc',
'test/core/end2end/tests/default_host.c', 'test/core/end2end/tests/default_host.cc',
'test/core/end2end/tests/disappearing_server.c', 'test/core/end2end/tests/disappearing_server.cc',
'test/core/end2end/tests/empty_batch.c', 'test/core/end2end/tests/empty_batch.cc',
'test/core/end2end/tests/filter_call_init_fails.c', 'test/core/end2end/tests/filter_call_init_fails.cc',
'test/core/end2end/tests/filter_causes_close.c', 'test/core/end2end/tests/filter_causes_close.cc',
'test/core/end2end/tests/filter_latency.c', 'test/core/end2end/tests/filter_latency.cc',
'test/core/end2end/tests/graceful_server_shutdown.c', 'test/core/end2end/tests/graceful_server_shutdown.cc',
'test/core/end2end/tests/high_initial_seqno.c', 'test/core/end2end/tests/high_initial_seqno.cc',
'test/core/end2end/tests/hpack_size.c', 'test/core/end2end/tests/hpack_size.cc',
'test/core/end2end/tests/idempotent_request.c', 'test/core/end2end/tests/idempotent_request.cc',
'test/core/end2end/tests/invoke_large_request.c', 'test/core/end2end/tests/invoke_large_request.cc',
'test/core/end2end/tests/keepalive_timeout.c', 'test/core/end2end/tests/keepalive_timeout.cc',
'test/core/end2end/tests/large_metadata.c', 'test/core/end2end/tests/large_metadata.cc',
'test/core/end2end/tests/load_reporting_hook.c', 'test/core/end2end/tests/load_reporting_hook.cc',
'test/core/end2end/tests/max_concurrent_streams.c', 'test/core/end2end/tests/max_concurrent_streams.cc',
'test/core/end2end/tests/max_connection_age.c', 'test/core/end2end/tests/max_connection_age.cc',
'test/core/end2end/tests/max_connection_idle.c', 'test/core/end2end/tests/max_connection_idle.cc',
'test/core/end2end/tests/max_message_length.c', 'test/core/end2end/tests/max_message_length.cc',
'test/core/end2end/tests/negative_deadline.c', 'test/core/end2end/tests/negative_deadline.cc',
'test/core/end2end/tests/network_status_change.c', 'test/core/end2end/tests/network_status_change.cc',
'test/core/end2end/tests/no_logging.c', 'test/core/end2end/tests/no_logging.cc',
'test/core/end2end/tests/no_op.c', 'test/core/end2end/tests/no_op.cc',
'test/core/end2end/tests/payload.c', 'test/core/end2end/tests/payload.cc',
'test/core/end2end/tests/ping.c', 'test/core/end2end/tests/ping.cc',
'test/core/end2end/tests/ping_pong_streaming.c', 'test/core/end2end/tests/ping_pong_streaming.cc',
'test/core/end2end/tests/proxy_auth.c', 'test/core/end2end/tests/proxy_auth.cc',
'test/core/end2end/tests/registered_call.c', 'test/core/end2end/tests/registered_call.cc',
'test/core/end2end/tests/request_with_flags.c', 'test/core/end2end/tests/request_with_flags.cc',
'test/core/end2end/tests/request_with_payload.c', 'test/core/end2end/tests/request_with_payload.cc',
'test/core/end2end/tests/resource_quota_server.c', 'test/core/end2end/tests/resource_quota_server.cc',
'test/core/end2end/tests/server_finishes_request.c', 'test/core/end2end/tests/server_finishes_request.cc',
'test/core/end2end/tests/shutdown_finishes_calls.c', 'test/core/end2end/tests/shutdown_finishes_calls.cc',
'test/core/end2end/tests/shutdown_finishes_tags.c', 'test/core/end2end/tests/shutdown_finishes_tags.cc',
'test/core/end2end/tests/simple_cacheable_request.c', 'test/core/end2end/tests/simple_cacheable_request.cc',
'test/core/end2end/tests/simple_delayed_request.c', 'test/core/end2end/tests/simple_delayed_request.cc',
'test/core/end2end/tests/simple_metadata.c', 'test/core/end2end/tests/simple_metadata.cc',
'test/core/end2end/tests/simple_request.c', 'test/core/end2end/tests/simple_request.cc',
'test/core/end2end/tests/stream_compression_compressed_payload.c', 'test/core/end2end/tests/stream_compression_compressed_payload.cc',
'test/core/end2end/tests/stream_compression_payload.c', 'test/core/end2end/tests/stream_compression_payload.cc',
'test/core/end2end/tests/stream_compression_ping_pong_streaming.c', 'test/core/end2end/tests/stream_compression_ping_pong_streaming.cc',
'test/core/end2end/tests/streaming_error_response.c', 'test/core/end2end/tests/streaming_error_response.cc',
'test/core/end2end/tests/trailing_metadata.c', 'test/core/end2end/tests/trailing_metadata.cc',
'test/core/end2end/tests/workaround_cronet_compression.c', 'test/core/end2end/tests/workaround_cronet_compression.cc',
'test/core/end2end/tests/write_buffering.c', 'test/core/end2end/tests/write_buffering.cc',
'test/core/end2end/tests/write_buffering_at_end.c', 'test/core/end2end/tests/write_buffering_at_end.cc',
], ],
}, },
{ {
@ -2444,66 +2423,66 @@
'gpr', 'gpr',
], ],
'sources': [ 'sources': [
'test/core/end2end/end2end_nosec_tests.c', 'test/core/end2end/end2end_nosec_tests.cc',
'test/core/end2end/end2end_test_utils.c', 'test/core/end2end/end2end_test_utils.cc',
'test/core/end2end/tests/authority_not_supported.c', 'test/core/end2end/tests/authority_not_supported.cc',
'test/core/end2end/tests/bad_hostname.c', 'test/core/end2end/tests/bad_hostname.cc',
'test/core/end2end/tests/bad_ping.c', 'test/core/end2end/tests/bad_ping.cc',
'test/core/end2end/tests/binary_metadata.c', 'test/core/end2end/tests/binary_metadata.cc',
'test/core/end2end/tests/cancel_after_accept.c', 'test/core/end2end/tests/cancel_after_accept.cc',
'test/core/end2end/tests/cancel_after_client_done.c', 'test/core/end2end/tests/cancel_after_client_done.cc',
'test/core/end2end/tests/cancel_after_invoke.c', 'test/core/end2end/tests/cancel_after_invoke.cc',
'test/core/end2end/tests/cancel_after_round_trip.c', 'test/core/end2end/tests/cancel_after_round_trip.cc',
'test/core/end2end/tests/cancel_before_invoke.c', 'test/core/end2end/tests/cancel_before_invoke.cc',
'test/core/end2end/tests/cancel_in_a_vacuum.c', 'test/core/end2end/tests/cancel_in_a_vacuum.cc',
'test/core/end2end/tests/cancel_with_status.c', 'test/core/end2end/tests/cancel_with_status.cc',
'test/core/end2end/tests/compressed_payload.c', 'test/core/end2end/tests/compressed_payload.cc',
'test/core/end2end/tests/connectivity.c', 'test/core/end2end/tests/connectivity.cc',
'test/core/end2end/tests/default_host.c', 'test/core/end2end/tests/default_host.cc',
'test/core/end2end/tests/disappearing_server.c', 'test/core/end2end/tests/disappearing_server.cc',
'test/core/end2end/tests/empty_batch.c', 'test/core/end2end/tests/empty_batch.cc',
'test/core/end2end/tests/filter_call_init_fails.c', 'test/core/end2end/tests/filter_call_init_fails.cc',
'test/core/end2end/tests/filter_causes_close.c', 'test/core/end2end/tests/filter_causes_close.cc',
'test/core/end2end/tests/filter_latency.c', 'test/core/end2end/tests/filter_latency.cc',
'test/core/end2end/tests/graceful_server_shutdown.c', 'test/core/end2end/tests/graceful_server_shutdown.cc',
'test/core/end2end/tests/high_initial_seqno.c', 'test/core/end2end/tests/high_initial_seqno.cc',
'test/core/end2end/tests/hpack_size.c', 'test/core/end2end/tests/hpack_size.cc',
'test/core/end2end/tests/idempotent_request.c', 'test/core/end2end/tests/idempotent_request.cc',
'test/core/end2end/tests/invoke_large_request.c', 'test/core/end2end/tests/invoke_large_request.cc',
'test/core/end2end/tests/keepalive_timeout.c', 'test/core/end2end/tests/keepalive_timeout.cc',
'test/core/end2end/tests/large_metadata.c', 'test/core/end2end/tests/large_metadata.cc',
'test/core/end2end/tests/load_reporting_hook.c', 'test/core/end2end/tests/load_reporting_hook.cc',
'test/core/end2end/tests/max_concurrent_streams.c', 'test/core/end2end/tests/max_concurrent_streams.cc',
'test/core/end2end/tests/max_connection_age.c', 'test/core/end2end/tests/max_connection_age.cc',
'test/core/end2end/tests/max_connection_idle.c', 'test/core/end2end/tests/max_connection_idle.cc',
'test/core/end2end/tests/max_message_length.c', 'test/core/end2end/tests/max_message_length.cc',
'test/core/end2end/tests/negative_deadline.c', 'test/core/end2end/tests/negative_deadline.cc',
'test/core/end2end/tests/network_status_change.c', 'test/core/end2end/tests/network_status_change.cc',
'test/core/end2end/tests/no_logging.c', 'test/core/end2end/tests/no_logging.cc',
'test/core/end2end/tests/no_op.c', 'test/core/end2end/tests/no_op.cc',
'test/core/end2end/tests/payload.c', 'test/core/end2end/tests/payload.cc',
'test/core/end2end/tests/ping.c', 'test/core/end2end/tests/ping.cc',
'test/core/end2end/tests/ping_pong_streaming.c', 'test/core/end2end/tests/ping_pong_streaming.cc',
'test/core/end2end/tests/proxy_auth.c', 'test/core/end2end/tests/proxy_auth.cc',
'test/core/end2end/tests/registered_call.c', 'test/core/end2end/tests/registered_call.cc',
'test/core/end2end/tests/request_with_flags.c', 'test/core/end2end/tests/request_with_flags.cc',
'test/core/end2end/tests/request_with_payload.c', 'test/core/end2end/tests/request_with_payload.cc',
'test/core/end2end/tests/resource_quota_server.c', 'test/core/end2end/tests/resource_quota_server.cc',
'test/core/end2end/tests/server_finishes_request.c', 'test/core/end2end/tests/server_finishes_request.cc',
'test/core/end2end/tests/shutdown_finishes_calls.c', 'test/core/end2end/tests/shutdown_finishes_calls.cc',
'test/core/end2end/tests/shutdown_finishes_tags.c', 'test/core/end2end/tests/shutdown_finishes_tags.cc',
'test/core/end2end/tests/simple_cacheable_request.c', 'test/core/end2end/tests/simple_cacheable_request.cc',
'test/core/end2end/tests/simple_delayed_request.c', 'test/core/end2end/tests/simple_delayed_request.cc',
'test/core/end2end/tests/simple_metadata.c', 'test/core/end2end/tests/simple_metadata.cc',
'test/core/end2end/tests/simple_request.c', 'test/core/end2end/tests/simple_request.cc',
'test/core/end2end/tests/stream_compression_compressed_payload.c', 'test/core/end2end/tests/stream_compression_compressed_payload.cc',
'test/core/end2end/tests/stream_compression_payload.c', 'test/core/end2end/tests/stream_compression_payload.cc',
'test/core/end2end/tests/stream_compression_ping_pong_streaming.c', 'test/core/end2end/tests/stream_compression_ping_pong_streaming.cc',
'test/core/end2end/tests/streaming_error_response.c', 'test/core/end2end/tests/streaming_error_response.cc',
'test/core/end2end/tests/trailing_metadata.c', 'test/core/end2end/tests/trailing_metadata.cc',
'test/core/end2end/tests/workaround_cronet_compression.c', 'test/core/end2end/tests/workaround_cronet_compression.cc',
'test/core/end2end/tests/write_buffering.c', 'test/core/end2end/tests/write_buffering.cc',
'test/core/end2end/tests/write_buffering_at_end.c', 'test/core/end2end/tests/write_buffering_at_end.cc',
], ],
}, },
] ]

@ -92,7 +92,7 @@ class Alarm : private GrpcLibraryCodegen {
} }
private: private:
class AlarmEntry : public CompletionQueueTag { class AlarmEntry : public internal::CompletionQueueTag {
public: public:
AlarmEntry(void* tag) : tag_(tag) {} AlarmEntry(void* tag) : tag_(tag) {}
void Set(void* tag) { tag_ = tag; } void Set(void* tag) { tag_ = tag; }

@ -32,7 +32,7 @@ struct grpc_channel;
namespace grpc { namespace grpc {
/// Channels represent a connection to an endpoint. Created by \a CreateChannel. /// Channels represent a connection to an endpoint. Created by \a CreateChannel.
class Channel final : public ChannelInterface, class Channel final : public ChannelInterface,
public CallHook, public internal::CallHook,
public std::enable_shared_from_this<Channel>, public std::enable_shared_from_this<Channel>,
private GrpcLibraryCodegen { private GrpcLibraryCodegen {
public: public:
@ -51,18 +51,16 @@ class Channel final : public ChannelInterface,
private: private:
template <class InputMessage, class OutputMessage> template <class InputMessage, class OutputMessage>
friend Status BlockingUnaryCall(ChannelInterface* channel, friend class internal::BlockingUnaryCallImpl;
const RpcMethod& method,
ClientContext* context,
const InputMessage& request,
OutputMessage* result);
friend std::shared_ptr<Channel> CreateChannelInternal( friend std::shared_ptr<Channel> CreateChannelInternal(
const grpc::string& host, grpc_channel* c_channel); const grpc::string& host, grpc_channel* c_channel);
Channel(const grpc::string& host, grpc_channel* c_channel); Channel(const grpc::string& host, grpc_channel* c_channel);
Call CreateCall(const RpcMethod& method, ClientContext* context, internal::Call CreateCall(const internal::RpcMethod& method,
ClientContext* context,
CompletionQueue* cq) override; CompletionQueue* cq) override;
void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override; void PerformOpsOnCall(internal::CallOpSetInterface* ops,
internal::Call* call) override;
void* RegisterMethod(const char* method) override; void* RegisterMethod(const char* method) override;
void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed,

@ -28,9 +28,9 @@
namespace grpc { namespace grpc {
std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption( std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption(
const grpc::string &name, const grpc::string &value); const grpc::string& name, const grpc::string& value);
std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption( std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption(
const grpc::string &name, int value); const grpc::string& name, int value);
} // namespace grpc } // namespace grpc

@ -30,6 +30,7 @@ namespace grpc {
class CompletionQueue; class CompletionQueue;
namespace internal {
/// Common interface for all client side asynchronous streaming. /// Common interface for all client side asynchronous streaming.
class ClientAsyncStreamingInterface { class ClientAsyncStreamingInterface {
public: public:
@ -151,15 +152,16 @@ class AsyncWriterInterface {
} }
}; };
} // namespace internal
template <class R> template <class R>
class ClientAsyncReaderInterface : public ClientAsyncStreamingInterface, class ClientAsyncReaderInterface
public AsyncReaderInterface<R> {}; : public internal::ClientAsyncStreamingInterface,
public internal::AsyncReaderInterface<R> {};
/// Async client-side API for doing server-streaming RPCs, namespace internal {
/// where the incoming message stream coming from the server has
/// messages of type \a R.
template <class R> template <class R>
class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { class ClientAsyncReaderFactory {
public: public:
/// Create a stream object. /// Create a stream object.
/// Write the first request out if \a start is set. /// Write the first request out if \a start is set.
@ -169,16 +171,25 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
/// Note that \a context will be used to fill in custom initial metadata /// Note that \a context will be used to fill in custom initial metadata
/// used to send to the server when starting the call. /// used to send to the server when starting the call.
template <class W> template <class W>
static ClientAsyncReader* Create(ChannelInterface* channel, static ClientAsyncReader<R>* Create(ChannelInterface* channel,
CompletionQueue* cq, const RpcMethod& method, CompletionQueue* cq,
const ::grpc::internal::RpcMethod& method,
ClientContext* context, const W& request, ClientContext* context, const W& request,
bool start, void* tag) { bool start, void* tag) {
Call call = channel->CreateCall(method, context, cq); ::grpc::internal::Call call = channel->CreateCall(method, context, cq);
return new (g_core_codegen_interface->grpc_call_arena_alloc( return new (g_core_codegen_interface->grpc_call_arena_alloc(
call.call(), sizeof(ClientAsyncReader))) call.call(), sizeof(ClientAsyncReader<R>)))
ClientAsyncReader(call, context, request, start, tag); ClientAsyncReader<R>(call, context, request, start, tag);
} }
};
} // namespace internal
/// Async client-side API for doing server-streaming RPCs,
/// where the incoming message stream coming from the server has
/// messages of type \a R.
template <class R>
class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
public:
// always allocated against a call arena, no memory free required // always allocated against a call arena, no memory free required
static void operator delete(void* ptr, std::size_t size) { static void operator delete(void* ptr, std::size_t size) {
assert(size == sizeof(ClientAsyncReader)); assert(size == sizeof(ClientAsyncReader));
@ -233,9 +244,10 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
} }
private: private:
friend class internal::ClientAsyncReaderFactory<R>;
template <class W> template <class W>
ClientAsyncReader(Call call, ClientContext* context, const W& request, ClientAsyncReader(::grpc::internal::Call call, ClientContext* context,
bool start, void* tag) const W& request, bool start, void* tag)
: context_(context), call_(call), started_(start) { : context_(context), call_(call), started_(start) {
// TODO(ctiller): don't assert // TODO(ctiller): don't assert
GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok()); GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok());
@ -255,19 +267,27 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
} }
ClientContext* context_; ClientContext* context_;
Call call_; ::grpc::internal::Call call_;
bool started_; bool started_;
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose> ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
init_ops_; init_ops_;
CallOpSet<CallOpRecvInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_; meta_ops_;
CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpRecvMessage<R>>
read_ops_;
::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpClientRecvStatus>
finish_ops_;
}; };
/// Common interface for client side asynchronous writing. /// Common interface for client side asynchronous writing.
template <class W> template <class W>
class ClientAsyncWriterInterface : public ClientAsyncStreamingInterface, class ClientAsyncWriterInterface
public AsyncWriterInterface<W> { : public internal::ClientAsyncStreamingInterface,
public internal::AsyncWriterInterface<W> {
public: public:
/// Signal the client is done with the writes (half-close the client stream). /// Signal the client is done with the writes (half-close the client stream).
/// Thread-safe with respect to \a AsyncReaderInterface::Read /// Thread-safe with respect to \a AsyncReaderInterface::Read
@ -276,11 +296,9 @@ class ClientAsyncWriterInterface : public ClientAsyncStreamingInterface,
virtual void WritesDone(void* tag) = 0; virtual void WritesDone(void* tag) = 0;
}; };
/// Async API on the client side for doing client-streaming RPCs, namespace internal {
/// where the outgoing message stream going to the server contains
/// messages of type \a W.
template <class W> template <class W>
class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { class ClientAsyncWriterFactory {
public: public:
/// Create a stream object. /// Create a stream object.
/// Start the RPC if \a start is set /// Start the RPC if \a start is set
@ -294,16 +312,25 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
/// message from the server upon a successful call to the \a Finish /// message from the server upon a successful call to the \a Finish
/// method of this instance. /// method of this instance.
template <class R> template <class R>
static ClientAsyncWriter* Create(ChannelInterface* channel, static ClientAsyncWriter<W>* Create(ChannelInterface* channel,
CompletionQueue* cq, const RpcMethod& method, CompletionQueue* cq,
const ::grpc::internal::RpcMethod& method,
ClientContext* context, R* response, ClientContext* context, R* response,
bool start, void* tag) { bool start, void* tag) {
Call call = channel->CreateCall(method, context, cq); ::grpc::internal::Call call = channel->CreateCall(method, context, cq);
return new (g_core_codegen_interface->grpc_call_arena_alloc( return new (g_core_codegen_interface->grpc_call_arena_alloc(
call.call(), sizeof(ClientAsyncWriter))) call.call(), sizeof(ClientAsyncWriter<W>)))
ClientAsyncWriter(call, context, response, start, tag); ClientAsyncWriter<W>(call, context, response, start, tag);
} }
};
} // namespace internal
/// Async API on the client side for doing client-streaming RPCs,
/// where the outgoing message stream going to the server contains
/// messages of type \a W.
template <class W>
class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
public:
// always allocated against a call arena, no memory free required // always allocated against a call arena, no memory free required
static void operator delete(void* ptr, std::size_t size) { static void operator delete(void* ptr, std::size_t size) {
assert(size == sizeof(ClientAsyncWriter)); assert(size == sizeof(ClientAsyncWriter));
@ -376,9 +403,10 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
} }
private: private:
friend class internal::ClientAsyncWriterFactory<W>;
template <class R> template <class R>
ClientAsyncWriter(Call call, ClientContext* context, R* response, bool start, ClientAsyncWriter(::grpc::internal::Call call, ClientContext* context,
void* tag) R* response, bool start, void* tag)
: context_(context), call_(call), started_(start) { : context_(context), call_(call), started_(start) {
finish_ops_.RecvMessage(response); finish_ops_.RecvMessage(response);
finish_ops_.AllowNoMessage(); finish_ops_.AllowNoMessage();
@ -401,13 +429,17 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
} }
ClientContext* context_; ClientContext* context_;
Call call_; ::grpc::internal::Call call_;
bool started_; bool started_;
CallOpSet<CallOpRecvInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose> meta_ops_;
::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
write_ops_; write_ops_;
CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage, ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
CallOpClientRecvStatus> ::grpc::internal::CallOpGenericRecvMessage,
::grpc::internal::CallOpClientRecvStatus>
finish_ops_; finish_ops_;
}; };
@ -415,9 +447,10 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
/// where the client-to-server message stream has messages of type \a W, /// where the client-to-server message stream has messages of type \a W,
/// and the server-to-client message stream has messages of type \a R. /// and the server-to-client message stream has messages of type \a R.
template <class W, class R> template <class W, class R>
class ClientAsyncReaderWriterInterface : public ClientAsyncStreamingInterface, class ClientAsyncReaderWriterInterface
public AsyncWriterInterface<W>, : public internal::ClientAsyncStreamingInterface,
public AsyncReaderInterface<R> { public internal::AsyncWriterInterface<W>,
public internal::AsyncReaderInterface<R> {
public: public:
/// Signal the client is done with the writes (half-close the client stream). /// Signal the client is done with the writes (half-close the client stream).
/// Thread-safe with respect to \a AsyncReaderInterface::Read /// Thread-safe with respect to \a AsyncReaderInterface::Read
@ -426,13 +459,9 @@ class ClientAsyncReaderWriterInterface : public ClientAsyncStreamingInterface,
virtual void WritesDone(void* tag) = 0; virtual void WritesDone(void* tag) = 0;
}; };
/// Async client-side interface for bi-directional streaming, namespace internal {
/// where the outgoing message stream going to the server
/// has messages of type \a W, and the incoming message stream coming
/// from the server has messages of type \a R.
template <class W, class R> template <class W, class R>
class ClientAsyncReaderWriter final class ClientAsyncReaderWriterFactory {
: public ClientAsyncReaderWriterInterface<W, R> {
public: public:
/// Create a stream object. /// Create a stream object.
/// Start the RPC request if \a start is set. /// Start the RPC request if \a start is set.
@ -441,18 +470,27 @@ class ClientAsyncReaderWriter final
/// nullptr and the actual call must be initiated by StartCall /// nullptr and the actual call must be initiated by StartCall
/// Note that \a context will be used to fill in custom initial metadata /// Note that \a context will be used to fill in custom initial metadata
/// used to send to the server when starting the call. /// used to send to the server when starting the call.
static ClientAsyncReaderWriter* Create(ChannelInterface* channel, static ClientAsyncReaderWriter<W, R>* Create(
CompletionQueue* cq, ChannelInterface* channel, CompletionQueue* cq,
const RpcMethod& method, const ::grpc::internal::RpcMethod& method, ClientContext* context,
ClientContext* context, bool start, bool start, void* tag) {
void* tag) { ::grpc::internal::Call call = channel->CreateCall(method, context, cq);
Call call = channel->CreateCall(method, context, cq);
return new (g_core_codegen_interface->grpc_call_arena_alloc( return new (g_core_codegen_interface->grpc_call_arena_alloc(
call.call(), sizeof(ClientAsyncReaderWriter))) call.call(), sizeof(ClientAsyncReaderWriter<W, R>)))
ClientAsyncReaderWriter(call, context, start, tag); ClientAsyncReaderWriter<W, R>(call, context, start, tag);
} }
};
} // namespace internal
/// Async client-side interface for bi-directional streaming,
/// where the outgoing message stream going to the server
/// has messages of type \a W, and the incoming message stream coming
/// from the server has messages of type \a R.
template <class W, class R>
class ClientAsyncReaderWriter final
: public ClientAsyncReaderWriterInterface<W, R> {
public:
// always allocated against a call arena, no memory free required // always allocated against a call arena, no memory free required
static void operator delete(void* ptr, std::size_t size) { static void operator delete(void* ptr, std::size_t size) {
assert(size == sizeof(ClientAsyncReaderWriter)); assert(size == sizeof(ClientAsyncReaderWriter));
@ -532,8 +570,9 @@ class ClientAsyncReaderWriter final
} }
private: private:
ClientAsyncReaderWriter(Call call, ClientContext* context, bool start, friend class internal::ClientAsyncReaderWriterFactory<W, R>;
void* tag) ClientAsyncReaderWriter(::grpc::internal::Call call, ClientContext* context,
bool start, void* tag)
: context_(context), call_(call), started_(start) { : context_(context), call_(call), started_(start) {
if (start) { if (start) {
StartCallInternal(tag); StartCallInternal(tag);
@ -554,18 +593,26 @@ class ClientAsyncReaderWriter final
} }
ClientContext* context_; ClientContext* context_;
Call call_; ::grpc::internal::Call call_;
bool started_; bool started_;
CallOpSet<CallOpRecvInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_; meta_ops_;
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose> ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpRecvMessage<R>>
read_ops_;
::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
write_ops_; write_ops_;
CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpClientRecvStatus>
finish_ops_;
}; };
template <class W, class R> template <class W, class R>
class ServerAsyncReaderInterface : public ServerAsyncStreamingInterface, class ServerAsyncReaderInterface
public AsyncReaderInterface<R> { : public internal::ServerAsyncStreamingInterface,
public internal::AsyncReaderInterface<R> {
public: public:
/// Indicate that the stream is to be finished with a certain status code /// Indicate that the stream is to be finished with a certain status code
/// and also send out \a msg response to the client. /// and also send out \a msg response to the client.
@ -692,20 +739,23 @@ class ServerAsyncReader final : public ServerAsyncReaderInterface<W, R> {
} }
private: private:
void BindCall(Call* call) override { call_ = *call; } void BindCall(::grpc::internal::Call* call) override { call_ = *call; }
Call call_; ::grpc::internal::Call call_;
ServerContext* ctx_; ServerContext* ctx_;
CallOpSet<CallOpSendInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata>
CallOpSet<CallOpRecvMessage<R>> read_ops_; meta_ops_;
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage<R>> read_ops_;
CallOpServerSendStatus> ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpServerSendStatus>
finish_ops_; finish_ops_;
}; };
template <class W> template <class W>
class ServerAsyncWriterInterface : public ServerAsyncStreamingInterface, class ServerAsyncWriterInterface
public AsyncWriterInterface<W> { : public internal::ServerAsyncStreamingInterface,
public internal::AsyncWriterInterface<W> {
public: public:
/// Indicate that the stream is to be finished with a certain status code. /// Indicate that the stream is to be finished with a certain status code.
/// Request notification for when the server has sent the appropriate /// Request notification for when the server has sent the appropriate
@ -823,7 +873,7 @@ class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> {
} }
private: private:
void BindCall(Call* call) override { call_ = *call; } void BindCall(::grpc::internal::Call* call) override { call_ = *call; }
template <class T> template <class T>
void EnsureInitialMetadataSent(T* ops) { void EnsureInitialMetadataSent(T* ops) {
@ -837,20 +887,25 @@ class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> {
} }
} }
Call call_; ::grpc::internal::Call call_;
ServerContext* ctx_; ServerContext* ctx_;
CallOpSet<CallOpSendInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata>
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, meta_ops_;
CallOpServerSendStatus> ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpServerSendStatus>
write_ops_; write_ops_;
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpServerSendStatus>
finish_ops_;
}; };
/// Server-side interface for asynchronous bi-directional streaming. /// Server-side interface for asynchronous bi-directional streaming.
template <class W, class R> template <class W, class R>
class ServerAsyncReaderWriterInterface : public ServerAsyncStreamingInterface, class ServerAsyncReaderWriterInterface
public AsyncWriterInterface<W>, : public internal::ServerAsyncStreamingInterface,
public AsyncReaderInterface<R> { public internal::AsyncWriterInterface<W>,
public internal::AsyncReaderInterface<R> {
public: public:
/// Indicate that the stream is to be finished with a certain status code. /// Indicate that the stream is to be finished with a certain status code.
/// Request notification for when the server has sent the appropriate /// Request notification for when the server has sent the appropriate
@ -980,7 +1035,7 @@ class ServerAsyncReaderWriter final
private: private:
friend class ::grpc::Server; friend class ::grpc::Server;
void BindCall(Call* call) override { call_ = *call; } void BindCall(::grpc::internal::Call* call) override { call_ = *call; }
template <class T> template <class T>
void EnsureInitialMetadataSent(T* ops) { void EnsureInitialMetadataSent(T* ops) {
@ -994,14 +1049,18 @@ class ServerAsyncReaderWriter final
} }
} }
Call call_; ::grpc::internal::Call call_;
ServerContext* ctx_; ServerContext* ctx_;
CallOpSet<CallOpSendInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata>
CallOpSet<CallOpRecvMessage<R>> read_ops_; meta_ops_;
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage<R>> read_ops_;
CallOpServerSendStatus> ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpServerSendStatus>
write_ops_; write_ops_;
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpServerSendStatus>
finish_ops_;
}; };
} // namespace grpc } // namespace grpc

@ -69,11 +69,9 @@ class ClientAsyncResponseReaderInterface {
virtual void Finish(R* msg, Status* status, void* tag) = 0; virtual void Finish(R* msg, Status* status, void* tag) = 0;
}; };
/// Async API for client-side unary RPCs, where the message response namespace internal {
/// received from the server is of type \a R.
template <class R> template <class R>
class ClientAsyncResponseReader final class ClientAsyncResponseReaderFactory {
: public ClientAsyncResponseReaderInterface<R> {
public: public:
/// Start a call and write the request out if \a start is set. /// Start a call and write the request out if \a start is set.
/// \a tag will be notified on \a cq when the call has been started (i.e. /// \a tag will be notified on \a cq when the call has been started (i.e.
@ -82,17 +80,24 @@ class ClientAsyncResponseReader final
/// Note that \a context will be used to fill in custom initial metadata /// Note that \a context will be used to fill in custom initial metadata
/// used to send to the server when starting the call. /// used to send to the server when starting the call.
template <class W> template <class W>
static ClientAsyncResponseReader* Create(ChannelInterface* channel, static ClientAsyncResponseReader<R>* Create(
CompletionQueue* cq, ChannelInterface* channel, CompletionQueue* cq,
const RpcMethod& method, const ::grpc::internal::RpcMethod& method, ClientContext* context,
ClientContext* context,
const W& request, bool start) { const W& request, bool start) {
Call call = channel->CreateCall(method, context, cq); ::grpc::internal::Call call = channel->CreateCall(method, context, cq);
return new (g_core_codegen_interface->grpc_call_arena_alloc( return new (g_core_codegen_interface->grpc_call_arena_alloc(
call.call(), sizeof(ClientAsyncResponseReader))) call.call(), sizeof(ClientAsyncResponseReader<R>)))
ClientAsyncResponseReader(call, context, request, start); ClientAsyncResponseReader<R>(call, context, request, start);
} }
};
} // namespace internal
/// Async API for client-side unary RPCs, where the message response
/// received from the server is of type \a R.
template <class R>
class ClientAsyncResponseReader final
: public ClientAsyncResponseReaderInterface<R> {
public:
// always allocated against a call arena, no memory free required // always allocated against a call arena, no memory free required
static void operator delete(void* ptr, std::size_t size) { static void operator delete(void* ptr, std::size_t size) {
assert(size == sizeof(ClientAsyncResponseReader)); assert(size == sizeof(ClientAsyncResponseReader));
@ -137,13 +142,14 @@ class ClientAsyncResponseReader final
} }
private: private:
friend class internal::ClientAsyncResponseReaderFactory<R>;
ClientContext* const context_; ClientContext* const context_;
Call call_; ::grpc::internal::Call call_;
bool started_; bool started_;
template <class W> template <class W>
ClientAsyncResponseReader(Call call, ClientContext* context, const W& request, ClientAsyncResponseReader(::grpc::internal::Call call, ClientContext* context,
bool start) const W& request, bool start)
: context_(context), call_(call), started_(start) { : context_(context), call_(call), started_(start) {
// Bind the metadata at time of StartCallInternal but set up the rest here // Bind the metadata at time of StartCallInternal but set up the rest here
// TODO(ctiller): don't assert // TODO(ctiller): don't assert
@ -162,19 +168,23 @@ class ClientAsyncResponseReader final
static void* operator new(std::size_t size); static void* operator new(std::size_t size);
static void* operator new(std::size_t size, void* p) { return p; } static void* operator new(std::size_t size, void* p) { return p; }
SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, ::grpc::internal::SneakyCallOpSet<::grpc::internal::CallOpSendInitialMetadata,
CallOpClientSendClose> ::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
init_buf; init_buf;
CallOpSet<CallOpRecvInitialMetadata> meta_buf; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>, meta_buf;
CallOpClientRecvStatus> ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpRecvMessage<R>,
::grpc::internal::CallOpClientRecvStatus>
finish_buf; finish_buf;
}; };
/// Async server-side API for handling unary calls, where the single /// Async server-side API for handling unary calls, where the single
/// response message sent to the client is of type \a W. /// response message sent to the client is of type \a W.
template <class W> template <class W>
class ServerAsyncResponseWriter final : public ServerAsyncStreamingInterface { class ServerAsyncResponseWriter final
: public internal::ServerAsyncStreamingInterface {
public: public:
explicit ServerAsyncResponseWriter(ServerContext* ctx) explicit ServerAsyncResponseWriter(ServerContext* ctx)
: call_(nullptr, nullptr, nullptr), ctx_(ctx) {} : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
@ -262,13 +272,15 @@ class ServerAsyncResponseWriter final : public ServerAsyncStreamingInterface {
} }
private: private:
void BindCall(Call* call) override { call_ = *call; } void BindCall(::grpc::internal::Call* call) override { call_ = *call; }
Call call_; ::grpc::internal::Call call_;
ServerContext* ctx_; ServerContext* ctx_;
CallOpSet<CallOpSendInitialMetadata> meta_buf_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata>
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, meta_buf_;
CallOpServerSendStatus> ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpServerSendStatus>
finish_buf_; finish_buf_;
}; };
@ -285,6 +297,6 @@ class default_delete<grpc::ClientAsyncResponseReaderInterface<R>> {
public: public:
void operator()(void* p) {} void operator()(void* p) {}
}; };
} } // namespace std
#endif // GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H #endif // GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H

@ -31,18 +31,19 @@
namespace grpc { namespace grpc {
namespace internal {
class CallOpSendMessage;
template <class R> template <class R>
class CallOpRecvMessage; class CallOpRecvMessage;
class CallOpGenericRecvMessage;
class MethodHandler; class MethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class RpcMethodHandler; class RpcMethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class ServerStreamingHandler; class ServerStreamingHandler;
namespace CallOpGenericRecvMessageHelper {
template <class R> template <class R>
class DeserializeFuncType; class DeserializeFuncType;
} // namespace CallOpGenericRecvMessageHelper } // namespace internal
/// A sequence of bytes. /// A sequence of bytes.
class ByteBuffer final { class ByteBuffer final {
public: public:
@ -97,17 +98,17 @@ class ByteBuffer final {
private: private:
friend class SerializationTraits<ByteBuffer, void>; friend class SerializationTraits<ByteBuffer, void>;
friend class CallOpSendMessage; friend class internal::CallOpSendMessage;
template <class R> template <class R>
friend class CallOpRecvMessage; friend class internal::CallOpRecvMessage;
friend class CallOpGenericRecvMessage; friend class internal::CallOpGenericRecvMessage;
friend class MethodHandler; friend class internal::MethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class RpcMethodHandler; friend class internal::RpcMethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class ServerStreamingHandler; friend class internal::ServerStreamingHandler;
template <class R> template <class R>
friend class CallOpGenericRecvMessageHelper::DeserializeFuncType; friend class internal::DeserializeFuncType;
grpc_byte_buffer* buffer_; grpc_byte_buffer* buffer_;

@ -43,11 +43,13 @@
namespace grpc { namespace grpc {
class ByteBuffer; class ByteBuffer;
class Call;
class CallHook;
class CompletionQueue; class CompletionQueue;
extern CoreCodegenInterface* g_core_codegen_interface; extern CoreCodegenInterface* g_core_codegen_interface;
namespace internal {
class Call;
class CallHook;
const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin"; const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin";
// TODO(yangg) if the map is changed before we send, the pointers will be a // TODO(yangg) if the map is changed before we send, the pointers will be a
@ -75,6 +77,7 @@ inline grpc_metadata* FillMetadataArray(
} }
return metadata_array; return metadata_array;
} }
} // namespace internal
/// Per-message write options. /// Per-message write options.
class WriteOptions { class WriteOptions {
@ -199,6 +202,7 @@ class WriteOptions {
bool last_message_; bool last_message_;
}; };
namespace internal {
/// Default argument for CallOpSet. I is unused by the class, but can be /// Default argument for CallOpSet. I is unused by the class, but can be
/// used for generating multiple names for the same thing. /// used for generating multiple names for the same thing.
template <int I> template <int I>
@ -387,7 +391,6 @@ class CallOpRecvMessage {
bool allow_not_getting_message_; bool allow_not_getting_message_;
}; };
namespace CallOpGenericRecvMessageHelper {
class DeserializeFunc { class DeserializeFunc {
public: public:
virtual Status Deserialize(ByteBuffer* buf) = 0; virtual Status Deserialize(ByteBuffer* buf) = 0;
@ -407,7 +410,6 @@ class DeserializeFuncType final : public DeserializeFunc {
private: private:
R* message_; // Not a managed pointer because management is external to this R* message_; // Not a managed pointer because management is external to this
}; };
} // namespace CallOpGenericRecvMessageHelper
class CallOpGenericRecvMessage { class CallOpGenericRecvMessage {
public: public:
@ -418,8 +420,7 @@ class CallOpGenericRecvMessage {
void RecvMessage(R* message) { void RecvMessage(R* message) {
// Use an explicit base class pointer to avoid resolution error in the // Use an explicit base class pointer to avoid resolution error in the
// following unique_ptr::reset for some old implementations. // following unique_ptr::reset for some old implementations.
CallOpGenericRecvMessageHelper::DeserializeFunc* func = DeserializeFunc* func = new DeserializeFuncType<R>(message);
new CallOpGenericRecvMessageHelper::DeserializeFuncType<R>(message);
deserialize_.reset(func); deserialize_.reset(func);
} }
@ -459,7 +460,7 @@ class CallOpGenericRecvMessage {
} }
private: private:
std::unique_ptr<CallOpGenericRecvMessageHelper::DeserializeFunc> deserialize_; std::unique_ptr<DeserializeFunc> deserialize_;
ByteBuffer recv_buf_; ByteBuffer recv_buf_;
bool allow_not_getting_message_; bool allow_not_getting_message_;
}; };
@ -714,7 +715,7 @@ class Call final {
grpc_call* call_; grpc_call* call_;
int max_receive_message_size_; int max_receive_message_size_;
}; };
} // namespace internal
} // namespace grpc } // namespace grpc
#endif // GRPCXX_IMPL_CODEGEN_CALL_H #endif // GRPCXX_IMPL_CODEGEN_CALL_H

@ -21,6 +21,7 @@
namespace grpc { namespace grpc {
namespace internal {
class CallOpSetInterface; class CallOpSetInterface;
class Call; class Call;
@ -31,6 +32,7 @@ class CallHook {
virtual ~CallHook() {} virtual ~CallHook() {}
virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0; virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0;
}; };
} // namespace internal
} // namespace grpc } // namespace grpc

@ -24,10 +24,8 @@
#include <grpc/impl/codegen/connectivity_state.h> #include <grpc/impl/codegen/connectivity_state.h>
namespace grpc { namespace grpc {
class Call; class ChannelInterface;
class ClientContext; class ClientContext;
class RpcMethod;
class CallOpSetInterface;
class CompletionQueue; class CompletionQueue;
template <class R> template <class R>
@ -36,14 +34,22 @@ template <class W>
class ClientWriter; class ClientWriter;
template <class W, class R> template <class W, class R>
class ClientReaderWriter; class ClientReaderWriter;
namespace internal {
class Call;
class CallOpSetInterface;
class RpcMethod;
template <class InputMessage, class OutputMessage>
class BlockingUnaryCallImpl;
template <class R> template <class R>
class ClientAsyncReader; class ClientAsyncReaderFactory;
template <class W> template <class W>
class ClientAsyncWriter; class ClientAsyncWriterFactory;
template <class W, class R> template <class W, class R>
class ClientAsyncReaderWriter; class ClientAsyncReaderWriterFactory;
template <class R> template <class R>
class ClientAsyncResponseReader; class ClientAsyncResponseReaderFactory;
} // namespace internal
/// Codegen interface for \a grpc::Channel. /// Codegen interface for \a grpc::Channel.
class ChannelInterface { class ChannelInterface {
@ -88,23 +94,21 @@ class ChannelInterface {
template <class W, class R> template <class W, class R>
friend class ::grpc::ClientReaderWriter; friend class ::grpc::ClientReaderWriter;
template <class R> template <class R>
friend class ::grpc::ClientAsyncReader; friend class ::grpc::internal::ClientAsyncReaderFactory;
template <class W> template <class W>
friend class ::grpc::ClientAsyncWriter; friend class ::grpc::internal::ClientAsyncWriterFactory;
template <class W, class R> template <class W, class R>
friend class ::grpc::ClientAsyncReaderWriter; friend class ::grpc::internal::ClientAsyncReaderWriterFactory;
template <class R> template <class R>
friend class ::grpc::ClientAsyncResponseReader; friend class ::grpc::internal::ClientAsyncResponseReaderFactory;
template <class InputMessage, class OutputMessage> template <class InputMessage, class OutputMessage>
friend Status BlockingUnaryCall(ChannelInterface* channel, friend class ::grpc::internal::BlockingUnaryCallImpl;
const RpcMethod& method, friend class ::grpc::internal::RpcMethod;
virtual internal::Call CreateCall(const internal::RpcMethod& method,
ClientContext* context, ClientContext* context,
const InputMessage& request,
OutputMessage* result);
friend class ::grpc::RpcMethod;
virtual Call CreateCall(const RpcMethod& method, ClientContext* context,
CompletionQueue* cq) = 0; CompletionQueue* cq) = 0;
virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0; virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops,
internal::Call* call) = 0;
virtual void* RegisterMethod(const char* method) = 0; virtual void* RegisterMethod(const char* method) = 0;
virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed,
gpr_timespec deadline, gpr_timespec deadline,
@ -112,7 +116,6 @@ class ChannelInterface {
virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed,
gpr_timespec deadline) = 0; gpr_timespec deadline) = 0;
}; };
} // namespace grpc } // namespace grpc
#endif // GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H #endif // GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H

@ -60,7 +60,16 @@ class Channel;
class ChannelInterface; class ChannelInterface;
class CompletionQueue; class CompletionQueue;
class CallCredentials; class CallCredentials;
class ClientContext;
namespace internal {
class RpcMethod; class RpcMethod;
class CallOpClientRecvStatus;
class CallOpRecvInitialMetadata;
template <class InputMessage, class OutputMessage>
class BlockingUnaryCallImpl;
} // namespace internal
template <class R> template <class R>
class ClientReader; class ClientReader;
template <class W> template <class W>
@ -345,8 +354,8 @@ class ClientContext {
ClientContext& operator=(const ClientContext&); ClientContext& operator=(const ClientContext&);
friend class ::grpc::testing::InteropClientContextInspector; friend class ::grpc::testing::InteropClientContextInspector;
friend class CallOpClientRecvStatus; friend class ::grpc::internal::CallOpClientRecvStatus;
friend class CallOpRecvInitialMetadata; friend class ::grpc::internal::CallOpRecvInitialMetadata;
friend class Channel; friend class Channel;
template <class R> template <class R>
friend class ::grpc::ClientReader; friend class ::grpc::ClientReader;
@ -363,11 +372,7 @@ class ClientContext {
template <class R> template <class R>
friend class ::grpc::ClientAsyncResponseReader; friend class ::grpc::ClientAsyncResponseReader;
template <class InputMessage, class OutputMessage> template <class InputMessage, class OutputMessage>
friend Status BlockingUnaryCall(ChannelInterface* channel, friend class ::grpc::internal::BlockingUnaryCallImpl;
const RpcMethod& method,
ClientContext* context,
const InputMessage& request,
OutputMessage* result);
grpc_call* call() const { return call_; } grpc_call* call() const { return call_; }
void set_call(grpc_call* call, const std::shared_ptr<Channel>& channel); void set_call(grpc_call* call, const std::shared_ptr<Channel>& channel);
@ -399,8 +404,8 @@ class ClientContext {
mutable std::shared_ptr<const AuthContext> auth_context_; mutable std::shared_ptr<const AuthContext> auth_context_;
struct census_context* census_context_; struct census_context* census_context_;
std::multimap<grpc::string, grpc::string> send_initial_metadata_; std::multimap<grpc::string, grpc::string> send_initial_metadata_;
MetadataMap recv_initial_metadata_; internal::MetadataMap recv_initial_metadata_;
MetadataMap trailing_metadata_; internal::MetadataMap trailing_metadata_;
grpc_call* propagate_from_call_; grpc_call* propagate_from_call_;
PropagationOptions propagation_options_; PropagationOptions propagation_options_;

@ -30,13 +30,25 @@ namespace grpc {
class Channel; class Channel;
class ClientContext; class ClientContext;
class CompletionQueue; class CompletionQueue;
class RpcMethod;
namespace internal {
class RpcMethod;
/// Wrapper that performs a blocking unary call /// Wrapper that performs a blocking unary call
template <class InputMessage, class OutputMessage> template <class InputMessage, class OutputMessage>
Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method, Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method,
ClientContext* context, const InputMessage& request, ClientContext* context, const InputMessage& request,
OutputMessage* result) { OutputMessage* result) {
return BlockingUnaryCallImpl<InputMessage, OutputMessage>(
channel, method, context, request, result)
.status();
}
template <class InputMessage, class OutputMessage>
class BlockingUnaryCallImpl {
public:
BlockingUnaryCallImpl(ChannelInterface* channel, const RpcMethod& method,
ClientContext* context, const InputMessage& request,
OutputMessage* result) {
CompletionQueue cq(grpc_completion_queue_attributes{ CompletionQueue cq(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}); // Pluckable completion queue GRPC_CQ_DEFAULT_POLLING}); // Pluckable completion queue
@ -45,28 +57,33 @@ Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method,
CallOpRecvInitialMetadata, CallOpRecvMessage<OutputMessage>, CallOpRecvInitialMetadata, CallOpRecvMessage<OutputMessage>,
CallOpClientSendClose, CallOpClientRecvStatus> CallOpClientSendClose, CallOpClientRecvStatus>
ops; ops;
Status status = ops.SendMessage(request); status_ = ops.SendMessage(request);
if (!status.ok()) { if (!status_.ok()) {
return status; return;
} }
ops.SendInitialMetadata(context->send_initial_metadata_, ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags()); context->initial_metadata_flags());
ops.RecvInitialMetadata(context); ops.RecvInitialMetadata(context);
ops.RecvMessage(result); ops.RecvMessage(result);
ops.ClientSendClose(); ops.ClientSendClose();
ops.ClientRecvStatus(context, &status); ops.ClientRecvStatus(context, &status_);
call.PerformOps(&ops); call.PerformOps(&ops);
if (cq.Pluck(&ops)) { if (cq.Pluck(&ops)) {
if (!ops.got_message && status.ok()) { if (!ops.got_message && status_.ok()) {
return Status(StatusCode::UNIMPLEMENTED, status_ = Status(StatusCode::UNIMPLEMENTED,
"No message returned for unary request"); "No message returned for unary request");
} }
} else { } else {
GPR_CODEGEN_ASSERT(!status.ok()); GPR_CODEGEN_ASSERT(!status_.ok());
} }
return status; }
} Status status() { return status_; }
private:
Status status_;
};
} // namespace internal
} // namespace grpc } // namespace grpc
#endif // GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H #endif // GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H

@ -56,7 +56,19 @@ class ServerWriter;
namespace internal { namespace internal {
template <class W, class R> template <class W, class R>
class ServerReaderWriterBody; class ServerReaderWriterBody;
} } // namespace internal
class Channel;
class ChannelInterface;
class ClientContext;
class CompletionQueue;
class Server;
class ServerBuilder;
class ServerContext;
namespace internal {
class CompletionQueueTag;
class RpcMethod;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class RpcMethodHandler; class RpcMethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
@ -66,16 +78,11 @@ class ServerStreamingHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class BidiStreamingHandler; class BidiStreamingHandler;
class UnknownMethodHandler; class UnknownMethodHandler;
template <class Streamer, bool WriteNeeded>
class Channel; class TemplatedBidiStreamingHandler;
class ChannelInterface; template <class InputMessage, class OutputMessage>
class ClientContext; class BlockingUnaryCallImpl;
class CompletionQueueTag; } // namespace internal
class CompletionQueue;
class RpcMethod;
class Server;
class ServerBuilder;
class ServerContext;
extern CoreCodegenInterface* g_core_codegen_interface; extern CoreCodegenInterface* g_core_codegen_interface;
@ -109,6 +116,30 @@ class CompletionQueue : private GrpcLibraryCodegen {
TIMEOUT ///< deadline was reached. TIMEOUT ///< deadline was reached.
}; };
/// EXPERIMENTAL
/// First executes \a F, then reads from the queue, blocking up to
/// \a deadline (or the queue's shutdown).
/// Both \a tag and \a ok are updated upon success (if an event is available
/// within the \a deadline). A \a tag points to an arbitrary location usually
/// employed to uniquely identify an event.
///
/// \param F[in] Function to execute before calling AsyncNext on this queue.
/// \param tag[out] Upon sucess, updated to point to the event's tag.
/// \param ok[out] Upon sucess, true if read a regular event, false otherwise.
/// \param deadline[in] How long to block in wait for an event.
///
/// \return The type of event read.
template <typename T, typename F>
NextStatus DoThenAsyncNext(F&& f, void** tag, bool* ok, const T& deadline) {
CompletionQueueTLSCache cache = CompletionQueueTLSCache(this);
f();
if (cache.Flush(tag, ok)) {
return GOT_EVENT;
} else {
return AsyncNext(tag, ok, deadline);
}
}
/// Read from the queue, blocking up to \a deadline (or the queue's shutdown). /// Read from the queue, blocking up to \a deadline (or the queue's shutdown).
/// Both \a tag and \a ok are updated upon success (if an event is available /// Both \a tag and \a ok are updated upon success (if an event is available
/// within the \a deadline). A \a tag points to an arbitrary location usually /// within the \a deadline). A \a tag points to an arbitrary location usually
@ -133,7 +164,8 @@ class CompletionQueue : private GrpcLibraryCodegen {
/// ///
/// \return true if read a regular event, false if the queue is shutting down. /// \return true if read a regular event, false if the queue is shutting down.
bool Next(void** tag, bool* ok) { bool Next(void** tag, bool* ok) {
return (AsyncNextInternal(tag, ok, g_core_codegen_interface->gpr_inf_future( return (AsyncNextInternal(tag, ok,
g_core_codegen_interface->gpr_inf_future(
GPR_CLOCK_REALTIME)) != SHUTDOWN); GPR_CLOCK_REALTIME)) != SHUTDOWN);
} }
@ -196,28 +228,39 @@ class CompletionQueue : private GrpcLibraryCodegen {
template <class W, class R> template <class W, class R>
friend class ::grpc::internal::ServerReaderWriterBody; friend class ::grpc::internal::ServerReaderWriterBody;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class RpcMethodHandler; friend class ::grpc::internal::RpcMethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class ClientStreamingHandler; friend class ::grpc::internal::ClientStreamingHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class ServerStreamingHandler; friend class ::grpc::internal::ServerStreamingHandler;
template <class Streamer, bool WriteNeeded> template <class Streamer, bool WriteNeeded>
friend class TemplatedBidiStreamingHandler; friend class ::grpc::internal::TemplatedBidiStreamingHandler;
friend class UnknownMethodHandler; friend class ::grpc::internal::UnknownMethodHandler;
friend class ::grpc::Server; friend class ::grpc::Server;
friend class ::grpc::ServerContext; friend class ::grpc::ServerContext;
template <class InputMessage, class OutputMessage> template <class InputMessage, class OutputMessage>
friend Status BlockingUnaryCall(ChannelInterface* channel, friend class ::grpc::internal::BlockingUnaryCallImpl;
const RpcMethod& method,
ClientContext* context, /// EXPERIMENTAL
const InputMessage& request, /// Creates a Thread Local cache to store the first event
OutputMessage* result); /// On this completion queue queued from this thread. Once
/// initialized, it must be flushed on the same thread.
class CompletionQueueTLSCache {
public:
CompletionQueueTLSCache(CompletionQueue* cq);
~CompletionQueueTLSCache();
bool Flush(void** tag, bool* ok);
private:
CompletionQueue* cq_;
bool flushed_;
};
NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline); NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline);
/// Wraps \a grpc_completion_queue_pluck. /// Wraps \a grpc_completion_queue_pluck.
/// \warning Must not be mixed with calls to \a Next. /// \warning Must not be mixed with calls to \a Next.
bool Pluck(CompletionQueueTag* tag) { bool Pluck(internal::CompletionQueueTag* tag) {
auto deadline = auto deadline =
g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME); g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME);
auto ev = g_core_codegen_interface->grpc_completion_queue_pluck( auto ev = g_core_codegen_interface->grpc_completion_queue_pluck(
@ -238,7 +281,7 @@ class CompletionQueue : private GrpcLibraryCodegen {
/// implementation to simple call the other TryPluck function with a zero /// implementation to simple call the other TryPluck function with a zero
/// timeout. i.e: /// timeout. i.e:
/// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME)) /// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME))
void TryPluck(CompletionQueueTag* tag) { void TryPluck(internal::CompletionQueueTag* tag) {
auto deadline = g_core_codegen_interface->gpr_time_0(GPR_CLOCK_REALTIME); auto deadline = g_core_codegen_interface->gpr_time_0(GPR_CLOCK_REALTIME);
auto ev = g_core_codegen_interface->grpc_completion_queue_pluck( auto ev = g_core_codegen_interface->grpc_completion_queue_pluck(
cq_, tag, deadline, nullptr); cq_, tag, deadline, nullptr);
@ -254,7 +297,7 @@ class CompletionQueue : private GrpcLibraryCodegen {
/// ///
/// This exects tag->FinalizeResult (if called) to return 'false' i.e expects /// This exects tag->FinalizeResult (if called) to return 'false' i.e expects
/// that the tag is internal not something that is returned to the user. /// that the tag is internal not something that is returned to the user.
void TryPluck(CompletionQueueTag* tag, gpr_timespec deadline) { void TryPluck(internal::CompletionQueueTag* tag, gpr_timespec deadline) {
auto ev = g_core_codegen_interface->grpc_completion_queue_pluck( auto ev = g_core_codegen_interface->grpc_completion_queue_pluck(
cq_, tag, deadline, nullptr); cq_, tag, deadline, nullptr);
if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) { if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) {

@ -21,6 +21,7 @@
namespace grpc { namespace grpc {
namespace internal {
/// An interface allowing implementors to process and filter event tags. /// An interface allowing implementors to process and filter event tags.
class CompletionQueueTag { class CompletionQueueTag {
public: public:
@ -31,6 +32,7 @@ class CompletionQueueTag {
/// queue /// queue
virtual bool FinalizeResult(void** tag, bool* status) = 0; virtual bool FinalizeResult(void** tag, bool* status) = 0;
}; };
} // namespace internal
} // namespace grpc } // namespace grpc

@ -19,6 +19,8 @@
#ifndef GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H #ifndef GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H
#define GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H #define GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H
#define GRPC_OPEN_SOURCE_PROTO
#ifndef GRPC_CUSTOM_PROTOBUF_INT64 #ifndef GRPC_CUSTOM_PROTOBUF_INT64
#include <google/protobuf/stubs/common.h> #include <google/protobuf/stubs/common.h>
#define GRPC_CUSTOM_PROTOBUF_INT64 ::google::protobuf::int64 #define GRPC_CUSTOM_PROTOBUF_INT64 ::google::protobuf::int64

@ -50,6 +50,9 @@ class CoreCodegen final : public CoreCodegenInterface {
void* gpr_malloc(size_t size) override; void* gpr_malloc(size_t size) override;
void gpr_free(void* p) override; void gpr_free(void* p) override;
void grpc_init() override;
void grpc_shutdown() override;
void gpr_mu_init(gpr_mu* mu) override; void gpr_mu_init(gpr_mu* mu) override;
void gpr_mu_destroy(gpr_mu* mu) override; void gpr_mu_destroy(gpr_mu* mu) override;
void gpr_mu_lock(gpr_mu* mu) override; void gpr_mu_lock(gpr_mu* mu) override;
@ -89,6 +92,7 @@ class CoreCodegen final : public CoreCodegenInterface {
grpc_slice grpc_slice_ref(grpc_slice slice) override; grpc_slice grpc_slice_ref(grpc_slice slice) override;
grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) override; grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) override;
grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) override; grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) override;
grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) override;
void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) override; void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) override;
void grpc_slice_buffer_pop(grpc_slice_buffer* sb) override; void grpc_slice_buffer_pop(grpc_slice_buffer* sb) override;
grpc_slice grpc_slice_from_static_buffer(const void* buffer, grpc_slice grpc_slice_from_static_buffer(const void* buffer,

@ -63,6 +63,13 @@ class CoreCodegenInterface {
virtual void* gpr_malloc(size_t size) = 0; virtual void* gpr_malloc(size_t size) = 0;
virtual void gpr_free(void* p) = 0; virtual void gpr_free(void* p) = 0;
// These are only to be used to fix edge cases involving grpc_init and
// grpc_shutdown. Calling grpc_init from the codegen interface before
// the real grpc_init is called will cause a crash, so if you use this
// function, ensure that it is not the first call to grpc_init.
virtual void grpc_init() = 0;
virtual void grpc_shutdown() = 0;
virtual void gpr_mu_init(gpr_mu* mu) = 0; virtual void gpr_mu_init(gpr_mu* mu) = 0;
virtual void gpr_mu_destroy(gpr_mu* mu) = 0; virtual void gpr_mu_destroy(gpr_mu* mu) = 0;
virtual void gpr_mu_lock(gpr_mu* mu) = 0; virtual void gpr_mu_lock(gpr_mu* mu) = 0;
@ -103,6 +110,7 @@ class CoreCodegenInterface {
virtual grpc_slice grpc_slice_ref(grpc_slice slice) = 0; virtual grpc_slice grpc_slice_ref(grpc_slice slice) = 0;
virtual grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) = 0; virtual grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) = 0;
virtual grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) = 0; virtual grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) = 0;
virtual grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) = 0;
virtual void grpc_slice_buffer_add(grpc_slice_buffer* sb, virtual void grpc_slice_buffer_add(grpc_slice_buffer* sb,
grpc_slice slice) = 0; grpc_slice slice) = 0;
virtual void grpc_slice_buffer_pop(grpc_slice_buffer* sb) = 0; virtual void grpc_slice_buffer_pop(grpc_slice_buffer* sb) = 0;

@ -1,20 +1,20 @@
/* /*
* *
* Copyright 2015 gRPC authors. * Copyright 2015 gRPC authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* 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.
* *
*/ */
#ifndef GRPCXX_IMPL_CODEGEN_METADATA_MAP_H #ifndef GRPCXX_IMPL_CODEGEN_METADATA_MAP_H
#define GRPCXX_IMPL_CODEGEN_METADATA_MAP_H #define GRPCXX_IMPL_CODEGEN_METADATA_MAP_H
@ -23,6 +23,7 @@
namespace grpc { namespace grpc {
namespace internal {
class MetadataMap { class MetadataMap {
public: public:
MetadataMap() { memset(&arr_, 0, sizeof(arr_)); } MetadataMap() { memset(&arr_, 0, sizeof(arr_)); }
@ -40,16 +41,17 @@ class MetadataMap {
} }
} }
std::multimap<grpc::string_ref, grpc::string_ref> *map() { return &map_; } std::multimap<grpc::string_ref, grpc::string_ref>* map() { return &map_; }
const std::multimap<grpc::string_ref, grpc::string_ref> *map() const { const std::multimap<grpc::string_ref, grpc::string_ref>* map() const {
return &map_; return &map_;
} }
grpc_metadata_array *arr() { return &arr_; } grpc_metadata_array* arr() { return &arr_; }
private: private:
grpc_metadata_array arr_; grpc_metadata_array arr_;
std::multimap<grpc::string_ref, grpc::string_ref> map_; std::multimap<grpc::string_ref, grpc::string_ref> map_;
}; };
} // namespace internal
} // namespace grpc } // namespace grpc

@ -26,6 +26,7 @@
namespace grpc { namespace grpc {
namespace internal {
/// A wrapper class of an application provided rpc method handler. /// A wrapper class of an application provided rpc method handler.
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class RpcMethodHandler : public MethodHandler { class RpcMethodHandler : public MethodHandler {
@ -266,6 +267,7 @@ class UnknownMethodHandler : public MethodHandler {
} }
}; };
} // namespace internal
} // namespace grpc } // namespace grpc
#endif // GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H #endif // GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H

@ -39,8 +39,7 @@ class GrpcBufferWriterPeer;
const int kGrpcBufferWriterMaxBufferLength = 1024 * 1024; const int kGrpcBufferWriterMaxBufferLength = 1024 * 1024;
class GrpcBufferWriter final class GrpcBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream {
: public ::grpc::protobuf::io::ZeroCopyOutputStream {
public: public:
explicit GrpcBufferWriter(grpc_byte_buffer** bp, int block_size) explicit GrpcBufferWriter(grpc_byte_buffer** bp, int block_size)
: block_size_(block_size), byte_count_(0), have_backup_(false) { : block_size_(block_size), byte_count_(0), have_backup_(false) {
@ -88,7 +87,7 @@ class GrpcBufferWriter final
grpc::protobuf::int64 ByteCount() const override { return byte_count_; } grpc::protobuf::int64 ByteCount() const override { return byte_count_; }
private: protected:
friend class GrpcBufferWriterPeer; friend class GrpcBufferWriterPeer;
const int block_size_; const int block_size_;
int64_t byte_count_; int64_t byte_count_;
@ -98,8 +97,7 @@ class GrpcBufferWriter final
grpc_slice slice_; grpc_slice slice_;
}; };
class GrpcBufferReader final class GrpcBufferReader : public ::grpc::protobuf::io::ZeroCopyInputStream {
: public ::grpc::protobuf::io::ZeroCopyInputStream {
public: public:
explicit GrpcBufferReader(grpc_byte_buffer* buffer) explicit GrpcBufferReader(grpc_byte_buffer* buffer)
: byte_count_(0), backup_count_(0), status_() { : byte_count_(0), backup_count_(0), status_() {
@ -160,7 +158,7 @@ class GrpcBufferReader final
return byte_count_ - backup_count_; return byte_count_ - backup_count_;
} }
private: protected:
int64_t byte_count_; int64_t byte_count_;
int64_t backup_count_; int64_t backup_count_;
grpc_byte_buffer_reader reader_; grpc_byte_buffer_reader reader_;
@ -168,17 +166,16 @@ class GrpcBufferReader final
Status status_; Status status_;
}; };
} // namespace internal // BufferWriter must be a subclass of io::ZeroCopyOutputStream.
template <class BufferWriter, class T>
template <class T> Status GenericSerialize(const grpc::protobuf::Message& msg,
class SerializationTraits<T, typename std::enable_if<std::is_base_of<
grpc::protobuf::Message, T>::value>::type> {
public:
static Status Serialize(const grpc::protobuf::Message& msg,
grpc_byte_buffer** bp, bool* own_buffer) { grpc_byte_buffer** bp, bool* own_buffer) {
static_assert(
std::is_base_of<protobuf::io::ZeroCopyOutputStream, BufferWriter>::value,
"BufferWriter must be a subclass of io::ZeroCopyOutputStream");
*own_buffer = true; *own_buffer = true;
int byte_size = msg.ByteSize(); int byte_size = msg.ByteSize();
if (byte_size <= internal::kGrpcBufferWriterMaxBufferLength) { if (byte_size <= kGrpcBufferWriterMaxBufferLength) {
grpc_slice slice = g_core_codegen_interface->grpc_slice_malloc(byte_size); grpc_slice slice = g_core_codegen_interface->grpc_slice_malloc(byte_size);
GPR_CODEGEN_ASSERT( GPR_CODEGEN_ASSERT(
GRPC_SLICE_END_PTR(slice) == GRPC_SLICE_END_PTR(slice) ==
@ -187,22 +184,26 @@ class SerializationTraits<T, typename std::enable_if<std::is_base_of<
g_core_codegen_interface->grpc_slice_unref(slice); g_core_codegen_interface->grpc_slice_unref(slice);
return g_core_codegen_interface->ok(); return g_core_codegen_interface->ok();
} else { } else {
internal::GrpcBufferWriter writer( BufferWriter writer(bp, kGrpcBufferWriterMaxBufferLength);
bp, internal::kGrpcBufferWriterMaxBufferLength);
return msg.SerializeToZeroCopyStream(&writer) return msg.SerializeToZeroCopyStream(&writer)
? g_core_codegen_interface->ok() ? g_core_codegen_interface->ok()
: Status(StatusCode::INTERNAL, "Failed to serialize message"); : Status(StatusCode::INTERNAL, "Failed to serialize message");
} }
} }
static Status Deserialize(grpc_byte_buffer* buffer, // BufferReader must be a subclass of io::ZeroCopyInputStream.
template <class BufferReader, class T>
Status GenericDeserialize(grpc_byte_buffer* buffer,
grpc::protobuf::Message* msg) { grpc::protobuf::Message* msg) {
static_assert(
std::is_base_of<protobuf::io::ZeroCopyInputStream, BufferReader>::value,
"BufferReader must be a subclass of io::ZeroCopyInputStream");
if (buffer == nullptr) { if (buffer == nullptr) {
return Status(StatusCode::INTERNAL, "No payload"); return Status(StatusCode::INTERNAL, "No payload");
} }
Status result = g_core_codegen_interface->ok(); Status result = g_core_codegen_interface->ok();
{ {
internal::GrpcBufferReader reader(buffer); BufferReader reader(buffer);
if (!reader.status().ok()) { if (!reader.status().ok()) {
return reader.status(); return reader.status();
} }
@ -217,8 +218,33 @@ class SerializationTraits<T, typename std::enable_if<std::is_base_of<
} }
g_core_codegen_interface->grpc_byte_buffer_destroy(buffer); g_core_codegen_interface->grpc_byte_buffer_destroy(buffer);
return result; return result;
}
} // namespace internal
// this is needed so the following class does not conflict with protobuf
// serializers that utilize internal-only tools.
#ifdef GRPC_OPEN_SOURCE_PROTO
// This class provides a protobuf serializer. It translates between protobuf
// objects and grpc_byte_buffers. More information about SerializationTraits can
// be found in include/grpc++/impl/codegen/serialization_traits.h.
template <class T>
class SerializationTraits<T, typename std::enable_if<std::is_base_of<
grpc::protobuf::Message, T>::value>::type> {
public:
static Status Serialize(const grpc::protobuf::Message& msg,
grpc_byte_buffer** bp, bool* own_buffer) {
return internal::GenericSerialize<internal::GrpcBufferWriter, T>(
msg, bp, own_buffer);
}
static Status Deserialize(grpc_byte_buffer* buffer,
grpc::protobuf::Message* msg) {
return internal::GenericDeserialize<internal::GrpcBufferReader, T>(buffer,
msg);
} }
}; };
#endif
} // namespace grpc } // namespace grpc

@ -24,7 +24,7 @@
#include <grpc++/impl/codegen/channel_interface.h> #include <grpc++/impl/codegen/channel_interface.h>
namespace grpc { namespace grpc {
namespace internal {
/// Descriptor of an RPC method /// Descriptor of an RPC method
class RpcMethod { class RpcMethod {
public: public:
@ -55,6 +55,7 @@ class RpcMethod {
void* const channel_tag_; void* const channel_tag_;
}; };
} // namespace internal
} // namespace grpc } // namespace grpc
#endif // GRPCXX_IMPL_CODEGEN_RPC_METHOD_H #endif // GRPCXX_IMPL_CODEGEN_RPC_METHOD_H

@ -32,8 +32,8 @@
namespace grpc { namespace grpc {
class ServerContext; class ServerContext;
class StreamContextInterface;
namespace internal {
/// Base class for running an RPC handler. /// Base class for running an RPC handler.
class MethodHandler { class MethodHandler {
public: public:
@ -71,6 +71,7 @@ class RpcServiceMethod : public RpcMethod {
void* server_tag_; void* server_tag_;
std::unique_ptr<MethodHandler> handler_; std::unique_ptr<MethodHandler> handler_;
}; };
} // namespace internal
} // namespace grpc } // namespace grpc

@ -55,7 +55,6 @@ class ServerWriter;
namespace internal { namespace internal {
template <class W, class R> template <class W, class R>
class ServerReaderWriterBody; class ServerReaderWriterBody;
}
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class RpcMethodHandler; class RpcMethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
@ -65,9 +64,11 @@ class ServerStreamingHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
class BidiStreamingHandler; class BidiStreamingHandler;
class UnknownMethodHandler; class UnknownMethodHandler;
template <class Streamer, bool WriteNeeded>
class TemplatedBidiStreamingHandler;
class Call; class Call;
class CallOpBuffer; } // namespace internal
class CompletionQueue; class CompletionQueue;
class Server; class Server;
class ServerInterface; class ServerInterface;
@ -247,14 +248,14 @@ class ServerContext {
template <class W, class R> template <class W, class R>
friend class ::grpc::internal::ServerReaderWriterBody; friend class ::grpc::internal::ServerReaderWriterBody;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class RpcMethodHandler; friend class ::grpc::internal::RpcMethodHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class ClientStreamingHandler; friend class ::grpc::internal::ClientStreamingHandler;
template <class ServiceType, class RequestType, class ResponseType> template <class ServiceType, class RequestType, class ResponseType>
friend class ServerStreamingHandler; friend class ::grpc::internal::ServerStreamingHandler;
template <class Streamer, bool WriteNeeded> template <class Streamer, bool WriteNeeded>
friend class TemplatedBidiStreamingHandler; friend class ::grpc::internal::TemplatedBidiStreamingHandler;
friend class UnknownMethodHandler; friend class ::grpc::internal::UnknownMethodHandler;
friend class ::grpc::ClientContext; friend class ::grpc::ClientContext;
/// Prevent copying. /// Prevent copying.
@ -263,9 +264,9 @@ class ServerContext {
class CompletionOp; class CompletionOp;
void BeginCompletionOp(Call* call); void BeginCompletionOp(internal::Call* call);
/// Return the tag queued by BeginCompletionOp() /// Return the tag queued by BeginCompletionOp()
CompletionQueueTag* GetCompletionOpTag(); internal::CompletionQueueTag* GetCompletionOpTag();
ServerContext(gpr_timespec deadline, grpc_metadata_array* arr); ServerContext(gpr_timespec deadline, grpc_metadata_array* arr);
@ -282,7 +283,7 @@ class ServerContext {
CompletionQueue* cq_; CompletionQueue* cq_;
bool sent_initial_metadata_; bool sent_initial_metadata_;
mutable std::shared_ptr<const AuthContext> auth_context_; mutable std::shared_ptr<const AuthContext> auth_context_;
MetadataMap client_metadata_; internal::MetadataMap client_metadata_;
std::multimap<grpc::string, grpc::string> initial_metadata_; std::multimap<grpc::string, grpc::string> initial_metadata_;
std::multimap<grpc::string, grpc::string> trailing_metadata_; std::multimap<grpc::string, grpc::string> trailing_metadata_;
@ -290,7 +291,9 @@ class ServerContext {
grpc_compression_level compression_level_; grpc_compression_level compression_level_;
grpc_compression_algorithm compression_algorithm_; grpc_compression_algorithm compression_algorithm_;
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage> pending_ops_; internal::CallOpSet<internal::CallOpSendInitialMetadata,
internal::CallOpSendMessage>
pending_ops_;
bool has_pending_ops_; bool has_pending_ops_;
}; };

@ -30,20 +30,21 @@ namespace grpc {
class AsyncGenericService; class AsyncGenericService;
class Channel; class Channel;
class GenericServerContext; class GenericServerContext;
class RpcService;
class ServerAsyncStreamingInterface;
class ServerCompletionQueue; class ServerCompletionQueue;
class ServerContext; class ServerContext;
class ServerCredentials; class ServerCredentials;
class Service; class Service;
class ThreadPoolInterface;
extern CoreCodegenInterface* g_core_codegen_interface; extern CoreCodegenInterface* g_core_codegen_interface;
/// Models a gRPC server. /// Models a gRPC server.
/// ///
/// Servers are configured and started via \a grpc::ServerBuilder. /// Servers are configured and started via \a grpc::ServerBuilder.
class ServerInterface : public CallHook { namespace internal {
class ServerAsyncStreamingInterface;
} // namespace internal
class ServerInterface : public internal::CallHook {
public: public:
virtual ~ServerInterface() {} virtual ~ServerInterface() {}
@ -78,7 +79,7 @@ class ServerInterface : public CallHook {
virtual void Wait() = 0; virtual void Wait() = 0;
protected: protected:
friend class Service; friend class ::grpc::Service;
/// Register a service. This call does not take ownership of the service. /// Register a service. This call does not take ownership of the service.
/// The service must exist for the lifetime of the Server instance. /// The service must exist for the lifetime of the Server instance.
@ -116,12 +117,13 @@ class ServerInterface : public CallHook {
virtual grpc_server* server() = 0; virtual grpc_server* server() = 0;
virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0; virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops,
internal::Call* call) = 0;
class BaseAsyncRequest : public CompletionQueueTag { class BaseAsyncRequest : public internal::CompletionQueueTag {
public: public:
BaseAsyncRequest(ServerInterface* server, ServerContext* context, BaseAsyncRequest(ServerInterface* server, ServerContext* context,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, void* tag, CompletionQueue* call_cq, void* tag,
bool delete_on_finalize); bool delete_on_finalize);
virtual ~BaseAsyncRequest(); virtual ~BaseAsyncRequest();
@ -131,7 +133,7 @@ class ServerInterface : public CallHook {
protected: protected:
ServerInterface* const server_; ServerInterface* const server_;
ServerContext* const context_; ServerContext* const context_;
ServerAsyncStreamingInterface* const stream_; internal::ServerAsyncStreamingInterface* const stream_;
CompletionQueue* const call_cq_; CompletionQueue* const call_cq_;
void* const tag_; void* const tag_;
const bool delete_on_finalize_; const bool delete_on_finalize_;
@ -141,7 +143,7 @@ class ServerInterface : public CallHook {
class RegisteredAsyncRequest : public BaseAsyncRequest { class RegisteredAsyncRequest : public BaseAsyncRequest {
public: public:
RegisteredAsyncRequest(ServerInterface* server, ServerContext* context, RegisteredAsyncRequest(ServerInterface* server, ServerContext* context,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, void* tag); CompletionQueue* call_cq, void* tag);
// uses BaseAsyncRequest::FinalizeResult // uses BaseAsyncRequest::FinalizeResult
@ -155,7 +157,7 @@ class ServerInterface : public CallHook {
public: public:
NoPayloadAsyncRequest(void* registered_method, ServerInterface* server, NoPayloadAsyncRequest(void* registered_method, ServerInterface* server,
ServerContext* context, ServerContext* context,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, void* tag) ServerCompletionQueue* notification_cq, void* tag)
: RegisteredAsyncRequest(server, context, stream, call_cq, tag) { : RegisteredAsyncRequest(server, context, stream, call_cq, tag) {
@ -170,7 +172,7 @@ class ServerInterface : public CallHook {
public: public:
PayloadAsyncRequest(void* registered_method, ServerInterface* server, PayloadAsyncRequest(void* registered_method, ServerInterface* server,
ServerContext* context, ServerContext* context,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, void* tag, ServerCompletionQueue* notification_cq, void* tag,
Message* request) Message* request)
@ -212,7 +214,7 @@ class ServerInterface : public CallHook {
void* const registered_method_; void* const registered_method_;
ServerInterface* const server_; ServerInterface* const server_;
ServerContext* const context_; ServerContext* const context_;
ServerAsyncStreamingInterface* const stream_; internal::ServerAsyncStreamingInterface* const stream_;
CompletionQueue* const call_cq_; CompletionQueue* const call_cq_;
ServerCompletionQueue* const notification_cq_; ServerCompletionQueue* const notification_cq_;
void* const tag_; void* const tag_;
@ -223,7 +225,7 @@ class ServerInterface : public CallHook {
class GenericAsyncRequest : public BaseAsyncRequest { class GenericAsyncRequest : public BaseAsyncRequest {
public: public:
GenericAsyncRequest(ServerInterface* server, GenericServerContext* context, GenericAsyncRequest(ServerInterface* server, GenericServerContext* context,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, void* tag, ServerCompletionQueue* notification_cq, void* tag,
bool delete_on_finalize); bool delete_on_finalize);
@ -235,8 +237,9 @@ class ServerInterface : public CallHook {
}; };
template <class Message> template <class Message>
void RequestAsyncCall(RpcServiceMethod* method, ServerContext* context, void RequestAsyncCall(internal::RpcServiceMethod* method,
ServerAsyncStreamingInterface* stream, ServerContext* context,
internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, void* tag, ServerCompletionQueue* notification_cq, void* tag,
Message* message) { Message* message) {
@ -246,8 +249,9 @@ class ServerInterface : public CallHook {
message); message);
} }
void RequestAsyncCall(RpcServiceMethod* method, ServerContext* context, void RequestAsyncCall(internal::RpcServiceMethod* method,
ServerAsyncStreamingInterface* stream, ServerContext* context,
internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, void* tag) { ServerCompletionQueue* notification_cq, void* tag) {
GPR_CODEGEN_ASSERT(method); GPR_CODEGEN_ASSERT(method);
@ -256,7 +260,7 @@ class ServerInterface : public CallHook {
} }
void RequestAsyncGenericCall(GenericServerContext* context, void RequestAsyncGenericCall(GenericServerContext* context,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, ServerCompletionQueue* notification_cq,
void* tag) { void* tag) {

@ -28,13 +28,14 @@
namespace grpc { namespace grpc {
class Call;
class CompletionQueue; class CompletionQueue;
class Server; class Server;
class ServerInterface; class ServerInterface;
class ServerCompletionQueue; class ServerCompletionQueue;
class ServerContext; class ServerContext;
namespace internal {
class Call;
class ServerAsyncStreamingInterface { class ServerAsyncStreamingInterface {
public: public:
virtual ~ServerAsyncStreamingInterface() {} virtual ~ServerAsyncStreamingInterface() {}
@ -48,9 +49,10 @@ class ServerAsyncStreamingInterface {
virtual void SendInitialMetadata(void* tag) = 0; virtual void SendInitialMetadata(void* tag) = 0;
private: private:
friend class ServerInterface; friend class ::grpc::ServerInterface;
virtual void BindCall(Call* call) = 0; virtual void BindCall(Call* call) = 0;
}; };
} // namespace internal
/// Desriptor of an RPC service and its various RPC methods /// Desriptor of an RPC service and its various RPC methods
class Service { class Service {
@ -88,40 +90,38 @@ class Service {
protected: protected:
template <class Message> template <class Message>
void RequestAsyncUnary(int index, ServerContext* context, Message* request, void RequestAsyncUnary(int index, ServerContext* context, Message* request,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream,
CompletionQueue* call_cq, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, void* tag) { ServerCompletionQueue* notification_cq, void* tag) {
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
notification_cq, tag, request); notification_cq, tag, request);
} }
void RequestAsyncClientStreaming(int index, ServerContext* context, void RequestAsyncClientStreaming(
ServerAsyncStreamingInterface* stream, int index, ServerContext* context,
CompletionQueue* call_cq, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, ServerCompletionQueue* notification_cq, void* tag) {
void* tag) {
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
notification_cq, tag); notification_cq, tag);
} }
template <class Message> template <class Message>
void RequestAsyncServerStreaming(int index, ServerContext* context, void RequestAsyncServerStreaming(
Message* request, int index, ServerContext* context, Message* request,
ServerAsyncStreamingInterface* stream, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq,
CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) {
ServerCompletionQueue* notification_cq,
void* tag) {
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
notification_cq, tag, request); notification_cq, tag, request);
} }
void RequestAsyncBidiStreaming(int index, ServerContext* context, void RequestAsyncBidiStreaming(
ServerAsyncStreamingInterface* stream, int index, ServerContext* context,
CompletionQueue* call_cq, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq,
ServerCompletionQueue* notification_cq, ServerCompletionQueue* notification_cq, void* tag) {
void* tag) {
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
notification_cq, tag); notification_cq, tag);
} }
void AddMethod(RpcServiceMethod* method) { methods_.emplace_back(method); } void AddMethod(internal::RpcServiceMethod* method) {
methods_.emplace_back(method);
}
void MarkMethodAsync(int index) { void MarkMethodAsync(int index) {
GPR_CODEGEN_ASSERT( GPR_CODEGEN_ASSERT(
@ -139,7 +139,7 @@ class Service {
methods_[index].reset(); methods_[index].reset();
} }
void MarkMethodStreamed(int index, MethodHandler* streamed_method) { void MarkMethodStreamed(int index, internal::MethodHandler* streamed_method) {
GPR_CODEGEN_ASSERT(methods_[index] && methods_[index]->handler() && GPR_CODEGEN_ASSERT(methods_[index] && methods_[index]->handler() &&
"Cannot mark an async or generic method Streamed"); "Cannot mark an async or generic method Streamed");
methods_[index]->SetHandler(streamed_method); methods_[index]->SetHandler(streamed_method);
@ -148,14 +148,14 @@ class Service {
// case of BIDI_STREAMING that has 1 read and 1 write, in that order, // case of BIDI_STREAMING that has 1 read and 1 write, in that order,
// and split server-side streaming is BIDI_STREAMING with 1 read and // and split server-side streaming is BIDI_STREAMING with 1 read and
// any number of writes, in that order. // any number of writes, in that order.
methods_[index]->SetMethodType(::grpc::RpcMethod::BIDI_STREAMING); methods_[index]->SetMethodType(internal::RpcMethod::BIDI_STREAMING);
} }
private: private:
friend class Server; friend class Server;
friend class ServerInterface; friend class ServerInterface;
ServerInterface* server_; ServerInterface* server_;
std::vector<std::unique_ptr<RpcServiceMethod>> methods_; std::vector<std::unique_ptr<internal::RpcServiceMethod>> methods_;
}; };
} // namespace grpc } // namespace grpc

@ -30,6 +30,7 @@
namespace grpc { namespace grpc {
namespace internal {
/// Common interface for all synchronous client side streaming. /// Common interface for all synchronous client side streaming.
class ClientStreamingInterface { class ClientStreamingInterface {
public: public:
@ -141,10 +142,12 @@ class WriterInterface {
} }
}; };
} // namespace internal
/// Client-side interface for streaming reads of message of type \a R. /// Client-side interface for streaming reads of message of type \a R.
template <class R> template <class R>
class ClientReaderInterface : public ClientStreamingInterface, class ClientReaderInterface : public internal::ClientStreamingInterface,
public ReaderInterface<R> { public internal::ReaderInterface<R> {
public: public:
/// Block to wait for initial metadata from server. The received metadata /// Block to wait for initial metadata from server. The received metadata
/// can only be accessed after this call returns. Should only be called before /// can only be accessed after this call returns. Should only be called before
@ -153,35 +156,25 @@ class ClientReaderInterface : public ClientStreamingInterface,
virtual void WaitForInitialMetadata() = 0; virtual void WaitForInitialMetadata() = 0;
}; };
namespace internal {
template <class R>
class ClientReaderFactory {
public:
template <class W>
static ClientReader<R>* Create(ChannelInterface* channel,
const ::grpc::internal::RpcMethod& method,
ClientContext* context, const W& request) {
return new ClientReader<R>(channel, method, context, request);
}
};
} // namespace internal
/// Synchronous (blocking) client-side API for doing server-streaming RPCs, /// Synchronous (blocking) client-side API for doing server-streaming RPCs,
/// where the stream of messages coming from the server has messages /// where the stream of messages coming from the server has messages
/// of type \a R. /// of type \a R.
template <class R> template <class R>
class ClientReader final : public ClientReaderInterface<R> { class ClientReader final : public ClientReaderInterface<R> {
public: public:
/// Block to create a stream and write the initial metadata and \a request
/// out. Note that \a context will be used to fill in custom initial
/// metadata used to send to the server when starting the call.
template <class W>
ClientReader(ChannelInterface* channel, const RpcMethod& method,
ClientContext* context, const W& request)
: context_(context),
cq_(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
call_(channel->CreateCall(method, context, &cq_)) {
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
CallOpClientSendClose>
ops;
ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags());
// TODO(ctiller): don't assert
GPR_CODEGEN_ASSERT(ops.SendMessage(request).ok());
ops.ClientSendClose();
call_.PerformOps(&ops);
cq_.Pluck(&ops);
}
/// See the \a ClientStreamingInterface.WaitForInitialMetadata method for /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for
/// semantics. /// semantics.
/// ///
@ -192,7 +185,8 @@ class ClientReader final : public ClientReaderInterface<R> {
void WaitForInitialMetadata() override { void WaitForInitialMetadata() override {
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
CallOpSet<CallOpRecvInitialMetadata> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
ops;
ops.RecvInitialMetadata(context_); ops.RecvInitialMetadata(context_);
call_.PerformOps(&ops); call_.PerformOps(&ops);
cq_.Pluck(&ops); /// status ignored cq_.Pluck(&ops); /// status ignored
@ -209,7 +203,9 @@ class ClientReader final : public ClientReaderInterface<R> {
/// already received (if initial metadata is received, it can be then /// already received (if initial metadata is received, it can be then
/// accessed through the \a ClientContext associated with this call). /// accessed through the \a ClientContext associated with this call).
bool Read(R* msg) override { bool Read(R* msg) override {
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpRecvMessage<R>>
ops;
if (!context_->initial_metadata_received_) { if (!context_->initial_metadata_received_) {
ops.RecvInitialMetadata(context_); ops.RecvInitialMetadata(context_);
} }
@ -224,7 +220,7 @@ class ClientReader final : public ClientReaderInterface<R> {
/// The \a ClientContext associated with this call is updated with /// The \a ClientContext associated with this call is updated with
/// possible metadata received from the server. /// possible metadata received from the server.
Status Finish() override { Status Finish() override {
CallOpSet<CallOpClientRecvStatus> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientRecvStatus> ops;
Status status; Status status;
ops.ClientRecvStatus(context_, &status); ops.ClientRecvStatus(context_, &status);
call_.PerformOps(&ops); call_.PerformOps(&ops);
@ -233,15 +229,41 @@ class ClientReader final : public ClientReaderInterface<R> {
} }
private: private:
friend class internal::ClientReaderFactory<R>;
ClientContext* context_; ClientContext* context_;
CompletionQueue cq_; CompletionQueue cq_;
Call call_; ::grpc::internal::Call call_;
/// Block to create a stream and write the initial metadata and \a request
/// out. Note that \a context will be used to fill in custom initial
/// metadata used to send to the server when starting the call.
template <class W>
ClientReader(::grpc::ChannelInterface* channel,
const ::grpc::internal::RpcMethod& method,
ClientContext* context, const W& request)
: context_(context),
cq_(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
call_(channel->CreateCall(method, context, &cq_)) {
::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
ops;
ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags());
// TODO(ctiller): don't assert
GPR_CODEGEN_ASSERT(ops.SendMessage(request).ok());
ops.ClientSendClose();
call_.PerformOps(&ops);
cq_.Pluck(&ops);
}
}; };
/// Client-side interface for streaming writes of message type \a W. /// Client-side interface for streaming writes of message type \a W.
template <class W> template <class W>
class ClientWriterInterface : public ClientStreamingInterface, class ClientWriterInterface : public internal::ClientStreamingInterface,
public WriterInterface<W> { public internal::WriterInterface<W> {
public: public:
/// Half close writing from the client. (signal that the stream of messages /// Half close writing from the client. (signal that the stream of messages
/// coming from the client is complete). /// coming from the client is complete).
@ -252,37 +274,25 @@ class ClientWriterInterface : public ClientStreamingInterface,
virtual bool WritesDone() = 0; virtual bool WritesDone() = 0;
}; };
namespace internal {
template <class W>
class ClientWriterFactory {
public:
template <class R>
static ClientWriter<W>* Create(::grpc::ChannelInterface* channel,
const ::grpc::internal::RpcMethod& method,
ClientContext* context, R* response) {
return new ClientWriter<W>(channel, method, context, response);
}
};
} // namespace internal
/// Synchronous (blocking) client-side API for doing client-streaming RPCs, /// Synchronous (blocking) client-side API for doing client-streaming RPCs,
/// where the outgoing message stream coming from the client has messages of /// where the outgoing message stream coming from the client has messages of
/// type \a W. /// type \a W.
template <class W> template <class W>
class ClientWriter : public ClientWriterInterface<W> { class ClientWriter : public ClientWriterInterface<W> {
public: public:
/// Block to create a stream (i.e. send request headers and other initial
/// metadata to the server). Note that \a context will be used to fill
/// in custom initial metadata. \a response will be filled in with the
/// single expected response message from the server upon a successful
/// call to the \a Finish method of this instance.
template <class R>
ClientWriter(ChannelInterface* channel, const RpcMethod& method,
ClientContext* context, R* response)
: context_(context),
cq_(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
call_(channel->CreateCall(method, context, &cq_)) {
finish_ops_.RecvMessage(response);
finish_ops_.AllowNoMessage();
if (!context_->initial_metadata_corked_) {
CallOpSet<CallOpSendInitialMetadata> ops;
ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags());
call_.PerformOps(&ops);
cq_.Pluck(&ops);
}
}
/// See the \a ClientStreamingInterface.WaitForInitialMetadata method for /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for
/// semantics. /// semantics.
/// ///
@ -292,7 +302,8 @@ class ClientWriter : public ClientWriterInterface<W> {
void WaitForInitialMetadata() { void WaitForInitialMetadata() {
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
CallOpSet<CallOpRecvInitialMetadata> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
ops;
ops.RecvInitialMetadata(context_); ops.RecvInitialMetadata(context_);
call_.PerformOps(&ops); call_.PerformOps(&ops);
cq_.Pluck(&ops); // status ignored cq_.Pluck(&ops); // status ignored
@ -304,10 +315,11 @@ class ClientWriter : public ClientWriterInterface<W> {
/// Side effect: /// Side effect:
/// Also sends initial metadata if not already sent (using the /// Also sends initial metadata if not already sent (using the
/// \a ClientContext associated with this call). /// \a ClientContext associated with this call).
using WriterInterface<W>::Write; using ::grpc::internal::WriterInterface<W>::Write;
bool Write(const W& msg, WriteOptions options) override { bool Write(const W& msg, WriteOptions options) override {
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
CallOpClientSendClose> ::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
ops; ops;
if (options.is_last_message()) { if (options.is_last_message()) {
@ -328,7 +340,7 @@ class ClientWriter : public ClientWriterInterface<W> {
} }
bool WritesDone() override { bool WritesDone() override {
CallOpSet<CallOpClientSendClose> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientSendClose> ops;
ops.ClientSendClose(); ops.ClientSendClose();
call_.PerformOps(&ops); call_.PerformOps(&ops);
return cq_.Pluck(&ops); return cq_.Pluck(&ops);
@ -352,21 +364,51 @@ class ClientWriter : public ClientWriterInterface<W> {
} }
private: private:
friend class internal::ClientWriterFactory<W>;
/// Block to create a stream (i.e. send request headers and other initial
/// metadata to the server). Note that \a context will be used to fill
/// in custom initial metadata. \a response will be filled in with the
/// single expected response message from the server upon a successful
/// call to the \a Finish method of this instance.
template <class R>
ClientWriter(ChannelInterface* channel,
const ::grpc::internal::RpcMethod& method,
ClientContext* context, R* response)
: context_(context),
cq_(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
call_(channel->CreateCall(method, context, &cq_)) {
finish_ops_.RecvMessage(response);
finish_ops_.AllowNoMessage();
if (!context_->initial_metadata_corked_) {
::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata>
ops;
ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags());
call_.PerformOps(&ops);
cq_.Pluck(&ops);
}
}
ClientContext* context_; ClientContext* context_;
CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage, ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
CallOpClientRecvStatus> ::grpc::internal::CallOpGenericRecvMessage,
::grpc::internal::CallOpClientRecvStatus>
finish_ops_; finish_ops_;
CompletionQueue cq_; CompletionQueue cq_;
Call call_; ::grpc::internal::Call call_;
}; };
/// Client-side interface for bi-directional streaming with /// Client-side interface for bi-directional streaming with
/// client-to-server stream messages of type \a W and /// client-to-server stream messages of type \a W and
/// server-to-client stream messages of type \a R. /// server-to-client stream messages of type \a R.
template <class W, class R> template <class W, class R>
class ClientReaderWriterInterface : public ClientStreamingInterface, class ClientReaderWriterInterface : public internal::ClientStreamingInterface,
public WriterInterface<W>, public internal::WriterInterface<W>,
public ReaderInterface<R> { public internal::ReaderInterface<R> {
public: public:
/// Block to wait for initial metadata from server. The received metadata /// Block to wait for initial metadata from server. The received metadata
/// can only be accessed after this call returns. Should only be called before /// can only be accessed after this call returns. Should only be called before
@ -375,7 +417,7 @@ class ClientReaderWriterInterface : public ClientStreamingInterface,
virtual void WaitForInitialMetadata() = 0; virtual void WaitForInitialMetadata() = 0;
/// Half close writing from the client. (signal that the stream of messages /// Half close writing from the client. (signal that the stream of messages
/// coming from the client is complete). /// coming from the clinet is complete).
/// Blocks until currently-pending writes are completed. /// Blocks until currently-pending writes are completed.
/// Thread-safe with respect to \a ReaderInterface::Read /// Thread-safe with respect to \a ReaderInterface::Read
/// ///
@ -383,6 +425,18 @@ class ClientReaderWriterInterface : public ClientStreamingInterface,
virtual bool WritesDone() = 0; virtual bool WritesDone() = 0;
}; };
namespace internal {
template <class W, class R>
class ClientReaderWriterFactory {
public:
static ClientReaderWriter<W, R>* Create(
::grpc::ChannelInterface* channel,
const ::grpc::internal::RpcMethod& method, ClientContext* context) {
return new ClientReaderWriter<W, R>(channel, method, context);
}
};
} // namespace internal
/// Synchronous (blocking) client-side API for bi-directional streaming RPCs, /// Synchronous (blocking) client-side API for bi-directional streaming RPCs,
/// where the outgoing message stream coming from the client has messages of /// where the outgoing message stream coming from the client has messages of
/// type \a W, and the incoming messages stream coming from the server has /// type \a W, and the incoming messages stream coming from the server has
@ -390,25 +444,6 @@ class ClientReaderWriterInterface : public ClientStreamingInterface,
template <class W, class R> template <class W, class R>
class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> { class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
public: public:
/// Block to create a stream and write the initial metadata and \a request
/// out. Note that \a context will be used to fill in custom initial metadata
/// used to send to the server when starting the call.
ClientReaderWriter(ChannelInterface* channel, const RpcMethod& method,
ClientContext* context)
: context_(context),
cq_(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
call_(channel->CreateCall(method, context, &cq_)) {
if (!context_->initial_metadata_corked_) {
CallOpSet<CallOpSendInitialMetadata> ops;
ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags());
call_.PerformOps(&ops);
cq_.Pluck(&ops);
}
}
/// Block waiting to read initial metadata from the server. /// Block waiting to read initial metadata from the server.
/// This call is optional, but if it is used, it cannot be used concurrently /// This call is optional, but if it is used, it cannot be used concurrently
/// with or after the \a Finish method. /// with or after the \a Finish method.
@ -418,7 +453,8 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
void WaitForInitialMetadata() override { void WaitForInitialMetadata() override {
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
CallOpSet<CallOpRecvInitialMetadata> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata>
ops;
ops.RecvInitialMetadata(context_); ops.RecvInitialMetadata(context_);
call_.PerformOps(&ops); call_.PerformOps(&ops);
cq_.Pluck(&ops); // status ignored cq_.Pluck(&ops); // status ignored
@ -434,7 +470,9 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
/// Also receives initial metadata if not already received (updates the \a /// Also receives initial metadata if not already received (updates the \a
/// ClientContext associated with this call in that case). /// ClientContext associated with this call in that case).
bool Read(R* msg) override { bool Read(R* msg) override {
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpRecvMessage<R>>
ops;
if (!context_->initial_metadata_received_) { if (!context_->initial_metadata_received_) {
ops.RecvInitialMetadata(context_); ops.RecvInitialMetadata(context_);
} }
@ -448,10 +486,11 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
/// Side effect: /// Side effect:
/// Also sends initial metadata if not already sent (using the /// Also sends initial metadata if not already sent (using the
/// \a ClientContext associated with this call to fill in values). /// \a ClientContext associated with this call to fill in values).
using WriterInterface<W>::Write; using ::grpc::internal::WriterInterface<W>::Write;
bool Write(const W& msg, WriteOptions options) override { bool Write(const W& msg, WriteOptions options) override {
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata,
CallOpClientSendClose> ::grpc::internal::CallOpSendMessage,
::grpc::internal::CallOpClientSendClose>
ops; ops;
if (options.is_last_message()) { if (options.is_last_message()) {
@ -472,7 +511,7 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
} }
bool WritesDone() override { bool WritesDone() override {
CallOpSet<CallOpClientSendClose> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientSendClose> ops;
ops.ClientSendClose(); ops.ClientSendClose();
call_.PerformOps(&ops); call_.PerformOps(&ops);
return cq_.Pluck(&ops); return cq_.Pluck(&ops);
@ -484,7 +523,9 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
/// - the \a ClientContext associated with this call is updated with /// - the \a ClientContext associated with this call is updated with
/// possible trailing metadata sent from the server. /// possible trailing metadata sent from the server.
Status Finish() override { Status Finish() override {
CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> ops; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata,
::grpc::internal::CallOpClientRecvStatus>
ops;
if (!context_->initial_metadata_received_) { if (!context_->initial_metadata_received_) {
ops.RecvInitialMetadata(context_); ops.RecvInitialMetadata(context_);
} }
@ -496,15 +537,38 @@ class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
} }
private: private:
friend class internal::ClientReaderWriterFactory<W, R>;
ClientContext* context_; ClientContext* context_;
CompletionQueue cq_; CompletionQueue cq_;
Call call_; ::grpc::internal::Call call_;
/// Block to create a stream and write the initial metadata and \a request
/// out. Note that \a context will be used to fill in custom initial metadata
/// used to send to the server when starting the call.
ClientReaderWriter(::grpc::ChannelInterface* channel,
const ::grpc::internal::RpcMethod& method,
ClientContext* context)
: context_(context),
cq_(grpc_completion_queue_attributes{
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
call_(channel->CreateCall(method, context, &cq_)) {
if (!context_->initial_metadata_corked_) {
::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata>
ops;
ops.SendInitialMetadata(context->send_initial_metadata_,
context->initial_metadata_flags());
call_.PerformOps(&ops);
cq_.Pluck(&ops);
}
}
}; };
/// Server-side interface for streaming reads of message of type \a R. /// Server-side interface for streaming reads of message of type \a R.
template <class R> template <class R>
class ServerReaderInterface : public ServerStreamingInterface, class ServerReaderInterface : public internal::ServerStreamingInterface,
public ReaderInterface<R> {}; public internal::ReaderInterface<R> {};
/// Synchronous (blocking) server-side API for doing client-streaming RPCs, /// Synchronous (blocking) server-side API for doing client-streaming RPCs,
/// where the incoming message stream coming from the client has messages of /// where the incoming message stream coming from the client has messages of
@ -512,15 +576,13 @@ class ServerReaderInterface : public ServerStreamingInterface,
template <class R> template <class R>
class ServerReader final : public ServerReaderInterface<R> { class ServerReader final : public ServerReaderInterface<R> {
public: public:
ServerReader(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {}
/// See the \a ServerStreamingInterface.SendInitialMetadata method /// See the \a ServerStreamingInterface.SendInitialMetadata method
/// for semantics. Note that initial metadata will be affected by the /// for semantics. Note that initial metadata will be affected by the
/// \a ServerContext associated with this call. /// \a ServerContext associated with this call.
void SendInitialMetadata() override { void SendInitialMetadata() override {
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
CallOpSet<CallOpSendInitialMetadata> ops; internal::CallOpSet<internal::CallOpSendInitialMetadata> ops;
ops.SendInitialMetadata(ctx_->initial_metadata_, ops.SendInitialMetadata(ctx_->initial_metadata_,
ctx_->initial_metadata_flags()); ctx_->initial_metadata_flags());
if (ctx_->compression_level_set()) { if (ctx_->compression_level_set()) {
@ -537,21 +599,27 @@ class ServerReader final : public ServerReaderInterface<R> {
} }
bool Read(R* msg) override { bool Read(R* msg) override {
CallOpSet<CallOpRecvMessage<R>> ops; internal::CallOpSet<internal::CallOpRecvMessage<R>> ops;
ops.RecvMessage(msg); ops.RecvMessage(msg);
call_->PerformOps(&ops); call_->PerformOps(&ops);
return call_->cq()->Pluck(&ops) && ops.got_message; return call_->cq()->Pluck(&ops) && ops.got_message;
} }
private: private:
Call* const call_; internal::Call* const call_;
ServerContext* const ctx_; ServerContext* const ctx_;
template <class ServiceType, class RequestType, class ResponseType>
friend class internal::ClientStreamingHandler;
ServerReader(internal::Call* call, ServerContext* ctx)
: call_(call), ctx_(ctx) {}
}; };
/// Server-side interface for streaming writes of message of type \a W. /// Server-side interface for streaming writes of message of type \a W.
template <class W> template <class W>
class ServerWriterInterface : public ServerStreamingInterface, class ServerWriterInterface : public internal::ServerStreamingInterface,
public WriterInterface<W> {}; public internal::WriterInterface<W> {};
/// Synchronous (blocking) server-side API for doing for doing a /// Synchronous (blocking) server-side API for doing for doing a
/// server-streaming RPCs, where the outgoing message stream coming from the /// server-streaming RPCs, where the outgoing message stream coming from the
@ -559,8 +627,6 @@ class ServerWriterInterface : public ServerStreamingInterface,
template <class W> template <class W>
class ServerWriter final : public ServerWriterInterface<W> { class ServerWriter final : public ServerWriterInterface<W> {
public: public:
ServerWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {}
/// See the \a ServerStreamingInterface.SendInitialMetadata method /// See the \a ServerStreamingInterface.SendInitialMetadata method
/// for semantics. /// for semantics.
/// Note that initial metadata will be affected by the /// Note that initial metadata will be affected by the
@ -568,7 +634,7 @@ class ServerWriter final : public ServerWriterInterface<W> {
void SendInitialMetadata() override { void SendInitialMetadata() override {
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
CallOpSet<CallOpSendInitialMetadata> ops; internal::CallOpSet<internal::CallOpSendInitialMetadata> ops;
ops.SendInitialMetadata(ctx_->initial_metadata_, ops.SendInitialMetadata(ctx_->initial_metadata_,
ctx_->initial_metadata_flags()); ctx_->initial_metadata_flags());
if (ctx_->compression_level_set()) { if (ctx_->compression_level_set()) {
@ -584,11 +650,12 @@ class ServerWriter final : public ServerWriterInterface<W> {
/// Side effect: /// Side effect:
/// Also sends initial metadata if not already sent (using the /// Also sends initial metadata if not already sent (using the
/// \a ClientContext associated with this call to fill in values). /// \a ClientContext associated with this call to fill in values).
using WriterInterface<W>::Write; using internal::WriterInterface<W>::Write;
bool Write(const W& msg, WriteOptions options) override { bool Write(const W& msg, WriteOptions options) override {
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_.SendMessage(msg, options).ok()) {
return false; return false;
} }
@ -613,15 +680,21 @@ class ServerWriter final : public ServerWriterInterface<W> {
} }
private: private:
Call* const call_; internal::Call* const call_;
ServerContext* const ctx_; ServerContext* const ctx_;
template <class ServiceType, class RequestType, class ResponseType>
friend class internal::ServerStreamingHandler;
ServerWriter(internal::Call* call, ServerContext* ctx)
: call_(call), ctx_(ctx) {}
}; };
/// Server-side interface for bi-directional streaming. /// Server-side interface for bi-directional streaming.
template <class W, class R> template <class W, class R>
class ServerReaderWriterInterface : public ServerStreamingInterface, class ServerReaderWriterInterface : public internal::ServerStreamingInterface,
public WriterInterface<W>, public internal::WriterInterface<W>,
public ReaderInterface<R> {}; public internal::ReaderInterface<R> {};
/// Actual implementation of bi-directional streaming /// Actual implementation of bi-directional streaming
namespace internal { namespace internal {
@ -688,6 +761,7 @@ class ServerReaderWriterBody final {
Call* const call_; Call* const call_;
ServerContext* const ctx_; ServerContext* const ctx_;
}; };
} // namespace internal } // namespace internal
/// Synchronous (blocking) server-side API for a bidirectional /// Synchronous (blocking) server-side API for a bidirectional
@ -697,8 +771,6 @@ class ServerReaderWriterBody final {
template <class W, class R> template <class W, class R>
class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> { class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> {
public: public:
ServerReaderWriter(Call* call, ServerContext* ctx) : body_(call, ctx) {}
/// See the \a ServerStreamingInterface.SendInitialMetadata method /// See the \a ServerStreamingInterface.SendInitialMetadata method
/// for semantics. Note that initial metadata will be affected by the /// for semantics. Note that initial metadata will be affected by the
/// \a ServerContext associated with this call. /// \a ServerContext associated with this call.
@ -715,13 +787,18 @@ class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> {
/// Side effect: /// Side effect:
/// Also sends initial metadata if not already sent (using the \a /// Also sends initial metadata if not already sent (using the \a
/// ServerContext associated with this call). /// ServerContext associated with this call).
using WriterInterface<W>::Write; using internal::WriterInterface<W>::Write;
bool Write(const W& msg, WriteOptions options) override { bool Write(const W& msg, WriteOptions options) override {
return body_.Write(msg, options); return body_.Write(msg, options);
} }
private: private:
internal::ServerReaderWriterBody<W, R> body_; internal::ServerReaderWriterBody<W, R> body_;
friend class internal::TemplatedBidiStreamingHandler<ServerReaderWriter<W, R>,
false>;
ServerReaderWriter(internal::Call* call, ServerContext* ctx)
: body_(call, ctx) {}
}; };
/// A class to represent a flow-controlled unary call. This is something /// A class to represent a flow-controlled unary call. This is something
@ -736,9 +813,6 @@ template <class RequestType, class ResponseType>
class ServerUnaryStreamer final class ServerUnaryStreamer final
: public ServerReaderWriterInterface<ResponseType, RequestType> { : public ServerReaderWriterInterface<ResponseType, RequestType> {
public: public:
ServerUnaryStreamer(Call* call, ServerContext* ctx)
: body_(call, ctx), read_done_(false), write_done_(false) {}
/// Block to send initial metadata to client. /// Block to send initial metadata to client.
/// Implicit input parameter: /// Implicit input parameter:
/// - the \a ServerContext associated with this call will be used for /// - the \a ServerContext associated with this call will be used for
@ -775,7 +849,7 @@ class ServerUnaryStreamer final
/// \param options The WriteOptions affecting the write operation. /// \param options The WriteOptions affecting the write operation.
/// ///
/// \return \a true on success, \a false when the stream has been closed. /// \return \a true on success, \a false when the stream has been closed.
using WriterInterface<ResponseType>::Write; using internal::WriterInterface<ResponseType>::Write;
bool Write(const ResponseType& response, WriteOptions options) override { bool Write(const ResponseType& response, WriteOptions options) override {
if (write_done_ || !read_done_) { if (write_done_ || !read_done_) {
return false; return false;
@ -788,6 +862,11 @@ class ServerUnaryStreamer final
internal::ServerReaderWriterBody<ResponseType, RequestType> body_; internal::ServerReaderWriterBody<ResponseType, RequestType> body_;
bool read_done_; bool read_done_;
bool write_done_; bool write_done_;
friend class internal::TemplatedBidiStreamingHandler<
ServerUnaryStreamer<RequestType, ResponseType>, true>;
ServerUnaryStreamer(internal::Call* call, ServerContext* ctx)
: body_(call, ctx), read_done_(false), write_done_(false) {}
}; };
/// A class to represent a flow-controlled server-side streaming call. /// A class to represent a flow-controlled server-side streaming call.
@ -799,9 +878,6 @@ template <class RequestType, class ResponseType>
class ServerSplitStreamer final class ServerSplitStreamer final
: public ServerReaderWriterInterface<ResponseType, RequestType> { : public ServerReaderWriterInterface<ResponseType, RequestType> {
public: public:
ServerSplitStreamer(Call* call, ServerContext* ctx)
: body_(call, ctx), read_done_(false) {}
/// Block to send initial metadata to client. /// Block to send initial metadata to client.
/// Implicit input parameter: /// Implicit input parameter:
/// - the \a ServerContext associated with this call will be used for /// - the \a ServerContext associated with this call will be used for
@ -838,7 +914,7 @@ class ServerSplitStreamer final
/// \param options The WriteOptions affecting the write operation. /// \param options The WriteOptions affecting the write operation.
/// ///
/// \return \a true on success, \a false when the stream has been closed. /// \return \a true on success, \a false when the stream has been closed.
using WriterInterface<ResponseType>::Write; using internal::WriterInterface<ResponseType>::Write;
bool Write(const ResponseType& response, WriteOptions options) override { bool Write(const ResponseType& response, WriteOptions options) override {
return read_done_ && body_.Write(response, options); return read_done_ && body_.Write(response, options);
} }
@ -846,6 +922,11 @@ class ServerSplitStreamer final
private: private:
internal::ServerReaderWriterBody<ResponseType, RequestType> body_; internal::ServerReaderWriterBody<ResponseType, RequestType> body_;
bool read_done_; bool read_done_;
friend class internal::TemplatedBidiStreamingHandler<
ServerSplitStreamer<RequestType, ResponseType>, false>;
ServerSplitStreamer(internal::Call* call, ServerContext* ctx)
: body_(call, ctx), read_done_(false) {}
}; };
} // namespace grpc } // namespace grpc

@ -19,6 +19,8 @@
#ifndef GRPCXX_IMPL_CODEGEN_TIME_H #ifndef GRPCXX_IMPL_CODEGEN_TIME_H
#define GRPCXX_IMPL_CODEGEN_TIME_H #define GRPCXX_IMPL_CODEGEN_TIME_H
#include <chrono>
#include <grpc++/impl/codegen/config.h> #include <grpc++/impl/codegen/config.h>
#include <grpc/impl/codegen/grpc_types.h> #include <grpc/impl/codegen/grpc_types.h>
@ -59,10 +61,6 @@ class TimePoint<gpr_timespec> {
} // namespace grpc } // namespace grpc
#include <chrono>
#include <grpc/impl/codegen/grpc_types.h>
namespace grpc { namespace grpc {
// from and to should be absolute time. // from and to should be absolute time.

@ -175,7 +175,8 @@ class Server final : public ServerInterface, private GrpcLibraryCodegen {
/// \param num_cqs How many completion queues does \a cqs hold. /// \param num_cqs How many completion queues does \a cqs hold.
void Start(ServerCompletionQueue** cqs, size_t num_cqs) override; void Start(ServerCompletionQueue** cqs, size_t num_cqs) override;
void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override; void PerformOpsOnCall(internal::CallOpSetInterface* ops,
internal::Call* call) override;
void ShutdownInternal(gpr_timespec deadline) override; void ShutdownInternal(gpr_timespec deadline) override;

@ -40,7 +40,6 @@ namespace grpc {
class AsyncGenericService; class AsyncGenericService;
class ResourceQuota; class ResourceQuota;
class CompletionQueue; class CompletionQueue;
class RpcService;
class Server; class Server;
class ServerCompletionQueue; class ServerCompletionQueue;
class ServerCredentials; class ServerCredentials;
@ -203,7 +202,10 @@ class ServerBuilder {
struct SyncServerSettings { struct SyncServerSettings {
SyncServerSettings() SyncServerSettings()
: num_cqs(1), min_pollers(1), max_pollers(2), cq_timeout_msec(10000) {} : num_cqs(GPR_MAX(1, gpr_cpu_num_cores())),
min_pollers(1),
max_pollers(2),
cq_timeout_msec(10000) {}
/// Number of server completion queues to create to listen to incoming RPCs. /// Number of server completion queues to create to listen to incoming RPCs.
int num_cqs; int num_cqs;

@ -16,10 +16,6 @@
* *
*/ */
/** RPC-internal Census API's. These are designed to be generic enough that
* they can (ultimately) be used in many different RPC systems (with differing
* implementations). */
#ifndef GRPC_CENSUS_H #ifndef GRPC_CENSUS_H
#define GRPC_CENSUS_H #define GRPC_CENSUS_H
@ -29,439 +25,12 @@
extern "C" { extern "C" {
#endif #endif
/** Identify census features that can be enabled via census_initialize(). */
enum census_features {
CENSUS_FEATURE_NONE = 0, /** Do not enable census. */
CENSUS_FEATURE_TRACING = 1, /** Enable census tracing. */
CENSUS_FEATURE_STATS = 2, /** Enable Census stats collection. */
CENSUS_FEATURE_CPU = 4, /** Enable Census CPU usage collection. */
CENSUS_FEATURE_ALL =
CENSUS_FEATURE_TRACING | CENSUS_FEATURE_STATS | CENSUS_FEATURE_CPU
};
/** Shutdown and startup census subsystem. The 'features' argument should be
* the OR (|) of census_features values. If census fails to initialize, then
* census_initialize() will return -1, otherwise the set of enabled features
* (which may be smaller than that provided in the `features` argument, see
* census_supported()) is returned. It is an error to call census_initialize()
* more than once (without an intervening census_shutdown()). These functions
* are not thread-safe. */
CENSUSAPI int census_initialize(int features);
CENSUSAPI void census_shutdown(void);
/** Return the features supported by the current census implementation (not all
* features will be available on all platforms). */
CENSUSAPI int census_supported(void);
/** Return the census features currently enabled. */
CENSUSAPI int census_enabled(void);
/** /**
A Census Context is a handle used by Census to represent the current tracing A Census Context is a handle used by Census to represent the current tracing
and stats collection information. Contexts should be propagated across RPC's and stats collection information. Contexts should be propagated across RPC's
(this is the responsibility of the local RPC system). A context is typically (this is the responsibility of the local RPC system). */
used as the first argument to most census functions. Conceptually, they
should be thought of as specific to a single RPC/thread. The user visible
context representation is that of a collection of key:value string pairs,
each of which is termed a 'tag'; these form the basis against which Census
metrics will be recorded. Keys are unique within a context. */
typedef struct census_context census_context; typedef struct census_context census_context;
/** A tag is a key:value pair. Both keys and values are nil-terminated strings,
containing printable ASCII characters (decimal 32-126). Keys must be at
least one character in length. Both keys and values can have at most
CENSUS_MAX_TAG_KB_LEN characters (including the terminating nil). The
maximum number of tags that can be propagated is
CENSUS_MAX_PROPAGATED_TAGS. Users should also remember that some systems
may have limits on, e.g., the number of bytes that can be transmitted as
metadata, and that larger tags means more memory consumed and time in
processing. */
typedef struct {
const char *key;
const char *value;
uint8_t flags;
} census_tag;
/** Maximum length of a tag's key or value. */
#define CENSUS_MAX_TAG_KV_LEN 255
/** Maximum number of propagatable tags. */
#define CENSUS_MAX_PROPAGATED_TAGS 255
/** Tag flags. */
#define CENSUS_TAG_PROPAGATE 1 /** Tag should be propagated over RPC */
#define CENSUS_TAG_STATS 2 /** Tag will be used for statistics aggregation */
#define CENSUS_TAG_RESERVED 4 /** Reserved for internal use. */
/** Flag values 4,8,16,32,64,128 are reserved for future/internal use. Clients
should not use or rely on their values. */
#define CENSUS_TAG_IS_PROPAGATED(flags) (flags & CENSUS_TAG_PROPAGATE)
#define CENSUS_TAG_IS_STATS(flags) (flags & CENSUS_TAG_STATS)
/** An instance of this structure is kept by every context, and records the
basic information associated with the creation of that context. */
typedef struct {
int n_propagated_tags; /** number of propagated tags */
int n_local_tags; /** number of non-propagated (local) tags */
int n_deleted_tags; /** number of tags that were deleted */
int n_added_tags; /** number of tags that were added */
int n_modified_tags; /** number of tags that were modified */
int n_invalid_tags; /** number of tags with bad keys or values (e.g.
longer than CENSUS_MAX_TAG_KV_LEN) */
int n_ignored_tags; /** number of tags ignored because of
CENSUS_MAX_PROPAGATED_TAGS limit. */
} census_context_status;
/** Create a new context, adding and removing tags from an existing context.
This will copy all tags from the 'tags' input, so it is recommended
to add as many tags in a single operation as is practical for the client.
@param base Base context to build upon. Can be NULL.
@param tags A set of tags to be added/changed/deleted. Tags with keys that
are in 'tags', but not 'base', are added to the context. Keys that are in
both 'tags' and 'base' will have their value/flags modified. Tags with keys
in both, but with NULL values, will be deleted from the context. Tags with
invalid (too long or short) keys or values will be ignored.
If adding a tag will result in more than CENSUS_MAX_PROPAGATED_TAGS in either
binary or non-binary tags, they will be ignored, as will deletions of
tags that don't exist.
@param ntags number of tags in 'tags'
@param status If not NULL, will return a pointer to a census_context_status
structure containing information about the new context and status of the
tags used in its creation.
@return A new, valid census_context.
*/
CENSUSAPI census_context *census_context_create(
const census_context *base, const census_tag *tags, int ntags,
census_context_status const **status);
/** Destroy a context. Once this function has been called, the context cannot
be reused. */
CENSUSAPI void census_context_destroy(census_context *context);
/** Get a pointer to the original status from the context creation. */
CENSUSAPI const census_context_status *census_context_get_status(
const census_context *context);
/** Structure used for iterating over the tags in a context. API clients should
not use or reference internal fields - neither their contents or
presence/absence are guaranteed. */
typedef struct {
const census_context *context;
int base;
int index;
char *kvm;
} census_context_iterator;
/** Initialize a census_tag_iterator. Must be called before first use. */
CENSUSAPI void census_context_initialize_iterator(
const census_context *context, census_context_iterator *iterator);
/** Get the contents of the "next" tag in the context. If there are no more
tags, returns 0 (and 'tag' contents will be unchanged), otherwise returns 1.
*/
CENSUSAPI int census_context_next_tag(census_context_iterator *iterator,
census_tag *tag);
/** Get a context tag by key. Returns 0 if the key is not present. */
CENSUSAPI int census_context_get_tag(const census_context *context,
const char *key, census_tag *tag);
/** Tag set encode/decode functionality. These functions are intended
for use by RPC systems only, for purposes of transmitting/receiving contexts.
*/
/** Encode a context into a buffer.
@param context context to be encoded
@param buffer buffer into which the context will be encoded.
@param buf_size number of available bytes in buffer.
@return The number of buffer bytes consumed for the encoded context, or
zero if the buffer was of insufficient size. */
CENSUSAPI size_t census_context_encode(const census_context *context,
char *buffer, size_t buf_size);
/** Decode context buffer encoded with census_context_encode(). Returns NULL
if there is an error in parsing either buffer. */
CENSUSAPI census_context *census_context_decode(const char *buffer,
size_t size);
/** Distributed traces can have a number of options. */
enum census_trace_mask_values {
CENSUS_TRACE_MASK_NONE = 0, /** Default, empty flags */
CENSUS_TRACE_MASK_IS_SAMPLED = 1 /** RPC tracing enabled for this context. */
};
/** Get the current trace mask associated with this context. The value returned
will be the logical OR of census_trace_mask_values values. */
CENSUSAPI int census_trace_mask(const census_context *context);
/** Set the trace mask associated with a context. */
CENSUSAPI void census_set_trace_mask(int trace_mask);
/** The concept of "operation" is a fundamental concept for Census. In an RPC
system, an operation typically represents a single RPC, or a significant
sub-part thereof (e.g. a single logical "read" RPC to a distributed storage
system might do several other actions in parallel, from looking up metadata
indices to making requests of other services - each of these could be a
sub-operation with the larger RPC operation). Census uses operations for the
following:
CPU accounting: If enabled, census will measure the thread CPU time
consumed between operation start and end times.
Active operations: Census will maintain information on all currently
active operations.
Distributed tracing: Each operation serves as a logical trace span.
Stats collection: Stats are broken down by operation (e.g. latency
breakdown for each unique RPC path).
The following functions serve to delineate the start and stop points for
each logical operation. */
/**
This structure represents a timestamp as used by census to record the time
at which an operation begins.
*/
typedef struct {
/** Use gpr_timespec for default implementation. High performance
* implementations should use a cycle-counter based timestamp. */
gpr_timespec ts;
} census_timestamp;
/**
Mark the beginning of an RPC operation. The information required to call the
functions to record the start of RPC operations (both client and server) may
not be callable at the true start time of the operation, due to information
not being available (e.g. the census context data will not be available in a
server RPC until at least initial metadata has been processed). To ensure
correct CPU accounting and latency recording, RPC systems can call this
function to get the timestamp of operation beginning. This can later be used
as an argument to census_start_{client,server}_rpc_op(). NB: for correct
CPU accounting, the system must guarantee that the same thread is used
for all request processing after this function is called.
@return A timestamp representing the operation start time.
*/
CENSUSAPI census_timestamp census_start_rpc_op_timestamp(void);
/**
Represent functions to map RPC name ID to service/method names. Census
breaks down all RPC stats by service and method names. We leave the
definition and format of these to the RPC system. For efficiency purposes,
we encode these as a single 64 bit identifier, and allow the RPC system to
provide a structure for functions that can convert these to service and
method strings.
TODO(aveitch): Instead of providing this as an argument to the rpc_start_op()
functions, maybe it should be set once at census initialization.
*/
typedef struct {
const char *(*get_rpc_service_name)(int64_t id);
const char *(*get_rpc_method_name)(int64_t id);
} census_rpc_name_info;
/**
Start a client rpc operation. This function should be called as early in the
client RPC path as possible. This function will create a new context. If
the context argument is non-null, then the new context will inherit all
its properties, with the following changes:
- create a new operation ID for the new context, marking it as a child of
the previous operation.
- use the new RPC path and peer information for tracing and stats
collection purposes, rather than those from the original context
If the context argument is NULL, then a new root context is created. This
is particularly important for tracing purposes (the trace spans generated
will be unassociated with any other trace spans, except those
downstream). The trace_mask will be used for tracing operations associated
with the new context.
In some RPC systems (e.g. where load balancing is used), peer information
may not be available at the time the operation starts. In this case, use a
NULL value for peer, and set it later using the
census_set_rpc_client_peer() function.
@param context The parent context. Can be NULL.
@param rpc_name_id The rpc name identifier to be associated with this RPC.
@param rpc_name_info Used to decode rpc_name_id.
@param peer RPC peer. If not available at the time, NULL can be used,
and a later census_set_rpc_client_peer() call made.
@param trace_mask An OR of census_trace_mask_values values. Only used in
the creation of a new root context (context == NULL).
@param start_time A timestamp returned from census_start_rpc_op_timestamp().
Can be NULL. Used to set the true time the operation
begins.
@return A new census context.
*/
CENSUSAPI census_context *census_start_client_rpc_op(
const census_context *context, int64_t rpc_name_id,
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
const census_timestamp *start_time);
/**
Add peer information to a context representing a client RPC operation.
*/
CENSUSAPI void census_set_rpc_client_peer(census_context *context,
const char *peer);
/**
Start a server RPC operation. Returns a new context to be used in future
census calls. If buffer is non-NULL, then the buffer contents should
represent the client context, as generated by census_context_serialize().
If buffer is NULL, a new root context is created.
@param buffer Buffer containing bytes output from census_context_serialize().
@param rpc_name_id The rpc name identifier to be associated with this RPC.
@param rpc_name_info Used to decode rpc_name_id.
@param peer RPC peer.
@param trace_mask An OR of census_trace_mask_values values. Only used in
the creation of a new root context (buffer == NULL).
@param start_time A timestamp returned from census_start_rpc_op_timestamp().
Can be NULL. Used to set the true time the operation
begins.
@return A new census context.
*/
CENSUSAPI census_context *census_start_server_rpc_op(
const char *buffer, int64_t rpc_name_id,
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
census_timestamp *start_time);
/**
Start a new, non-RPC operation. In general, this function works very
similarly to census_start_client_rpc_op, with the primary difference being
the replacement of host/path information with the more generic family/name
tags. If the context argument is non-null, then the new context will
inherit all its properties, with the following changes:
- create a new operation ID for the new context, marking it as a child of
the previous operation.
- use the family and name information for tracing and stats collection
purposes, rather than those from the original context
If the context argument is NULL, then a new root context is created. This
is particularly important for tracing purposes (the trace spans generated
will be unassociated with any other trace spans, except those
downstream). The trace_mask will be used for tracing
operations associated with the new context.
@param context The base context. Can be NULL.
@param family Family name to associate with the trace
@param name Name within family to associate with traces/stats
@param trace_mask An OR of census_trace_mask_values values. Only used if
context is NULL.
@return A new census context.
*/
CENSUSAPI census_context *census_start_op(census_context *context,
const char *family, const char *name,
int trace_mask);
/**
End an operation started by any of the census_start_*_op*() calls. The
context used in this call will no longer be valid once this function
completes.
@param context Context associated with operation which is ending.
@param status status associated with the operation. Not interpreted by
census.
*/
CENSUSAPI void census_end_op(census_context *context, int status);
#define CENSUS_TRACE_RECORD_START_OP ((uint32_t)0)
#define CENSUS_TRACE_RECORD_END_OP ((uint32_t)1)
/** Insert a trace record into the trace stream. The record consists of an
arbitrary size buffer, the size of which is provided in 'n'.
@param context Trace context
@param type User-defined type to associate with trace entry.
@param buffer Pointer to buffer to use
@param n Number of bytes in buffer
*/
CENSUSAPI void census_trace_print(census_context *context, uint32_t type,
const char *buffer, size_t n);
/** Trace record. */
typedef struct {
census_timestamp timestamp; /** Time of record creation */
uint64_t trace_id; /** Trace ID associated with record */
uint64_t op_id; /** Operation ID associated with record */
uint32_t type; /** Type (as used in census_trace_print() */
const char *buffer; /** Buffer (from census_trace_print() */
size_t buf_size; /** Number of bytes inside buffer */
} census_trace_record;
/** Start a scan of existing trace records. While a scan is ongoing, addition
of new trace records will be blocked if the underlying trace buffers
fill up, so trace processing systems should endeavor to complete
reading as soon as possible.
@param consume if non-zero, indicates that reading records also "consumes"
the previously read record - i.e. releases space in the trace log
while scanning is ongoing.
@returns 0 on success, non-zero on failure (e.g. if a scan is already ongoing)
*/
CENSUSAPI int census_trace_scan_start(int consume);
/** Get a trace record. The data pointed to by the trace buffer is guaranteed
stable until the next census_get_trace_record() call (if the consume
argument to census_trace_scan_start was non-zero) or census_trace_scan_end()
is called (otherwise).
@param trace_record structure that will be filled in with oldest trace record.
@returns -1 if an error occurred (e.g. no previous call to
census_trace_scan_start()), 0 if there is no more trace data (and
trace_record will not be modified) or 1 otherwise.
*/
CENSUSAPI int census_get_trace_record(census_trace_record *trace_record);
/** End a scan previously started by census_trace_scan_start() */
CENSUSAPI void census_trace_scan_end();
/** Core stats collection API's. The following concepts are used:
* Resource: Users record measurements for a single resource. Examples
include RPC latency, CPU seconds consumed, and bytes transmitted.
* Aggregation: An aggregation of a set of measurements. Census supports the
following aggregation types:
* Distribution - statistical distribution information, used for
recording average, standard deviation etc. Can include a histogram.
* Interval - a count of events that happen in a rolling time window.
* View: A view is a combination of a Resource, a set of tag keys and an
Aggregation. When a measurement for a Resource matches the View tags, it is
recorded (for each unique set of tag values) using the Aggregation type.
Each resource can have an arbitrary number of views by which it will be
broken down.
Census uses protos to define each of the above, and output results. This
ensures unification across the different language and runtime
implementations. The proto definitions can be found in src/proto/census.
*/
/** Define a new resource. `resource_pb` should contain an encoded Resource
protobuf, `resource_pb_size` being the size of the buffer. Returns a -ve
value on error, or a positive (>= 0) resource id (for use in
census_delete_resource() and census_record_values()). In order to be valid, a
resource must have a name, and at least one numerator in its unit type. The
resource name must be unique, and an error will be returned if it is not. */
CENSUSAPI int32_t census_define_resource(const uint8_t *resource_pb,
size_t resource_pb_size);
/** Delete a resource created by census_define_resource(). */
CENSUSAPI void census_delete_resource(int32_t resource_id);
/** Determine the id of a resource, given its name. returns -1 if the resource
does not exist. */
CENSUSAPI int32_t census_resource_id(const char *name);
/** A single value to be recorded comprises two parts: an ID for the particular
* resource and the value to be recorded against it. */
typedef struct {
int32_t resource_id;
double value;
} census_value;
/** Record new usage values against the given context. */
CENSUSAPI void census_record_values(census_context *context,
census_value *values, size_t nvalues);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

@ -33,24 +33,24 @@ extern "C" {
/** Parses the \a slice as a grpc_compression_algorithm instance and updating \a /** Parses the \a slice as a grpc_compression_algorithm instance and updating \a
* algorithm. Returns 1 upon success, 0 otherwise. */ * algorithm. Returns 1 upon success, 0 otherwise. */
GRPCAPI int grpc_compression_algorithm_parse( GRPCAPI int grpc_compression_algorithm_parse(
grpc_slice value, grpc_compression_algorithm *algorithm); grpc_slice value, grpc_compression_algorithm* algorithm);
/** Parses the \a slice as a grpc_stream_compression_algorithm instance and /** Parses the \a slice as a grpc_stream_compression_algorithm instance and
* updating \a algorithm. Returns 1 upon success, 0 otherwise. */ * updating \a algorithm. Returns 1 upon success, 0 otherwise. */
int grpc_stream_compression_algorithm_parse( int grpc_stream_compression_algorithm_parse(
grpc_slice name, grpc_stream_compression_algorithm *algorithm); grpc_slice name, grpc_stream_compression_algorithm* algorithm);
/** Updates \a name with the encoding name corresponding to a valid \a /** Updates \a name with the encoding name corresponding to a valid \a
* algorithm. Note that \a name is statically allocated and must *not* be freed. * algorithm. Note that \a name is statically allocated and must *not* be freed.
* Returns 1 upon success, 0 otherwise. */ * Returns 1 upon success, 0 otherwise. */
GRPCAPI int grpc_compression_algorithm_name( GRPCAPI int grpc_compression_algorithm_name(
grpc_compression_algorithm algorithm, const char **name); grpc_compression_algorithm algorithm, const char** name);
/** Updates \a name with the encoding name corresponding to a valid \a /** Updates \a name with the encoding name corresponding to a valid \a
* algorithm. Note that \a name is statically allocated and must *not* be freed. * algorithm. Note that \a name is statically allocated and must *not* be freed.
* Returns 1 upon success, 0 otherwise. */ * Returns 1 upon success, 0 otherwise. */
GRPCAPI int grpc_stream_compression_algorithm_name( GRPCAPI int grpc_stream_compression_algorithm_name(
grpc_stream_compression_algorithm algorithm, const char **name); grpc_stream_compression_algorithm algorithm, const char** name);
/** Returns the compression algorithm corresponding to \a level for the /** Returns the compression algorithm corresponding to \a level for the
* compression algorithms encoded in the \a accepted_encodings bitset. * compression algorithms encoded in the \a accepted_encodings bitset.
@ -66,23 +66,23 @@ GRPCAPI grpc_stream_compression_algorithm
grpc_stream_compression_algorithm_for_level(grpc_stream_compression_level level, grpc_stream_compression_algorithm_for_level(grpc_stream_compression_level level,
uint32_t accepted_stream_encodings); uint32_t accepted_stream_encodings);
GRPCAPI void grpc_compression_options_init(grpc_compression_options *opts); GRPCAPI void grpc_compression_options_init(grpc_compression_options* opts);
/** Mark \a algorithm as enabled in \a opts. */ /** Mark \a algorithm as enabled in \a opts. */
GRPCAPI void grpc_compression_options_enable_algorithm( GRPCAPI void grpc_compression_options_enable_algorithm(
grpc_compression_options *opts, grpc_compression_algorithm algorithm); grpc_compression_options* opts, grpc_compression_algorithm algorithm);
/** Mark \a algorithm as disabled in \a opts. */ /** Mark \a algorithm as disabled in \a opts. */
GRPCAPI void grpc_compression_options_disable_algorithm( GRPCAPI void grpc_compression_options_disable_algorithm(
grpc_compression_options *opts, grpc_compression_algorithm algorithm); grpc_compression_options* opts, grpc_compression_algorithm algorithm);
/** Returns true if \a algorithm is marked as enabled in \a opts. */ /** Returns true if \a algorithm is marked as enabled in \a opts. */
GRPCAPI int grpc_compression_options_is_algorithm_enabled( GRPCAPI int grpc_compression_options_is_algorithm_enabled(
const grpc_compression_options *opts, grpc_compression_algorithm algorithm); const grpc_compression_options* opts, grpc_compression_algorithm algorithm);
/** Returns true if \a algorithm is marked as enabled in \a opts. */ /** Returns true if \a algorithm is marked as enabled in \a opts. */
GRPCAPI int grpc_compression_options_is_stream_compression_algorithm_enabled( GRPCAPI int grpc_compression_options_is_stream_compression_algorithm_enabled(
const grpc_compression_options *opts, const grpc_compression_options* opts,
grpc_stream_compression_algorithm algorithm); grpc_stream_compression_algorithm algorithm);
#ifdef __cplusplus #ifdef __cplusplus

@ -40,11 +40,11 @@ extern "C" {
* functionality lives in grpc_security.h. * functionality lives in grpc_security.h.
*/ */
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array); GRPCAPI void grpc_metadata_array_init(grpc_metadata_array* array);
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array); GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array* array);
GRPCAPI void grpc_call_details_init(grpc_call_details *details); GRPCAPI void grpc_call_details_init(grpc_call_details* details);
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details); GRPCAPI void grpc_call_details_destroy(grpc_call_details* details);
/** Registers a plugin to be initialized and destroyed with the library. /** Registers a plugin to be initialized and destroyed with the library.
@ -73,31 +73,31 @@ GRPCAPI void grpc_init(void);
GRPCAPI void grpc_shutdown(void); GRPCAPI void grpc_shutdown(void);
/** Return a string representing the current version of grpc */ /** Return a string representing the current version of grpc */
GRPCAPI const char *grpc_version_string(void); GRPCAPI const char* grpc_version_string(void);
/** Return a string specifying what the 'g' in gRPC stands for */ /** Return a string specifying what the 'g' in gRPC stands for */
GRPCAPI const char *grpc_g_stands_for(void); GRPCAPI const char* grpc_g_stands_for(void);
/** Returns the completion queue factory based on the attributes. MAY return a /** Returns the completion queue factory based on the attributes. MAY return a
NULL if no factory can be found */ NULL if no factory can be found */
GRPCAPI const grpc_completion_queue_factory * GRPCAPI const grpc_completion_queue_factory*
grpc_completion_queue_factory_lookup( grpc_completion_queue_factory_lookup(
const grpc_completion_queue_attributes *attributes); const grpc_completion_queue_attributes* attributes);
/** Helper function to create a completion queue with grpc_cq_completion_type /** Helper function to create a completion queue with grpc_cq_completion_type
of GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ of GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */
GRPCAPI grpc_completion_queue *grpc_completion_queue_create_for_next( GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_next(
void *reserved); void* reserved);
/** Helper function to create a completion queue with grpc_cq_completion_type /** Helper function to create a completion queue with grpc_cq_completion_type
of GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ of GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */
GRPCAPI grpc_completion_queue *grpc_completion_queue_create_for_pluck( GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_pluck(
void *reserved); void* reserved);
/** Create a completion queue */ /** Create a completion queue */
GRPCAPI grpc_completion_queue *grpc_completion_queue_create( GRPCAPI grpc_completion_queue* grpc_completion_queue_create(
const grpc_completion_queue_factory *factory, const grpc_completion_queue_factory* factory,
const grpc_completion_queue_attributes *attributes, void *reserved); const grpc_completion_queue_attributes* attributes, void* reserved);
/** Blocks until an event is available, the completion queue is being shut down, /** Blocks until an event is available, the completion queue is being shut down,
or deadline is reached. or deadline is reached.
@ -107,9 +107,9 @@ GRPCAPI grpc_completion_queue *grpc_completion_queue_create(
Callers must not call grpc_completion_queue_next and Callers must not call grpc_completion_queue_next and
grpc_completion_queue_pluck simultaneously on the same completion queue. */ grpc_completion_queue_pluck simultaneously on the same completion queue. */
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue* cq,
gpr_timespec deadline, gpr_timespec deadline,
void *reserved); void* reserved);
/** Blocks until an event with tag 'tag' is available, the completion queue is /** Blocks until an event with tag 'tag' is available, the completion queue is
being shutdown or deadline is reached. being shutdown or deadline is reached.
@ -122,9 +122,9 @@ GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq,
Completion queues support a maximum of GRPC_MAX_COMPLETION_QUEUE_PLUCKERS Completion queues support a maximum of GRPC_MAX_COMPLETION_QUEUE_PLUCKERS
concurrently executing plucks at any time. */ concurrently executing plucks at any time. */
GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cq, GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq,
void *tag, gpr_timespec deadline, void* tag, gpr_timespec deadline,
void *reserved); void* reserved);
/** Maximum number of outstanding grpc_completion_queue_pluck executions per /** Maximum number of outstanding grpc_completion_queue_pluck executions per
completion queue */ completion queue */
@ -137,14 +137,31 @@ GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cq,
After calling this function applications should ensure that no After calling this function applications should ensure that no
NEW work is added to be published on this completion queue. */ NEW work is added to be published on this completion queue. */
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq); GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue* cq);
/** Destroy a completion queue. The caller must ensure that the queue is /** Destroy a completion queue. The caller must ensure that the queue is
drained and no threads are executing grpc_completion_queue_next */ drained and no threads are executing grpc_completion_queue_next */
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq); GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue* cq);
/*********** EXPERIMENTAL API ************/
/** Initializes a thread local cache for \a cq.
* grpc_flush_cq_tls_cache() MUST be called on the same thread,
* with the same cq.
*/
GRPCAPI void grpc_completion_queue_thread_local_cache_init(
grpc_completion_queue* cq);
/*********** EXPERIMENTAL API ************/
/** Flushes the thread local cache for \a cq.
* Returns 1 if there was contents in the cache. If there was an event
* in \a cq tls cache, its tag is placed in tag, and ok is set to the
* event success.
*/
GRPCAPI int grpc_completion_queue_thread_local_cache_flush(
grpc_completion_queue* cq, void** tag, int* ok);
/** Create a completion queue alarm instance */ /** Create a completion queue alarm instance */
GRPCAPI grpc_alarm *grpc_alarm_create(void *reserved); GRPCAPI grpc_alarm* grpc_alarm_create(void* reserved);
/** Set a completion queue alarm instance associated to \a cq. /** Set a completion queue alarm instance associated to \a cq.
* *
@ -152,25 +169,25 @@ GRPCAPI grpc_alarm *grpc_alarm_create(void *reserved);
* grpc_alarm_cancel), an event with tag \a tag will be added to \a cq. If the * grpc_alarm_cancel), an event with tag \a tag will be added to \a cq. If the
* alarm expired, the event's success bit will be true, false otherwise (ie, * alarm expired, the event's success bit will be true, false otherwise (ie,
* upon cancellation). */ * upon cancellation). */
GRPCAPI void grpc_alarm_set(grpc_alarm *alarm, grpc_completion_queue *cq, GRPCAPI void grpc_alarm_set(grpc_alarm* alarm, grpc_completion_queue* cq,
gpr_timespec deadline, void *tag, void *reserved); gpr_timespec deadline, void* tag, void* reserved);
/** Cancel a completion queue alarm. Calling this function over an alarm that /** Cancel a completion queue alarm. Calling this function over an alarm that
* has already fired has no effect. */ * has already fired has no effect. */
GRPCAPI void grpc_alarm_cancel(grpc_alarm *alarm, void *reserved); GRPCAPI void grpc_alarm_cancel(grpc_alarm* alarm, void* reserved);
/** Destroy the given completion queue alarm, cancelling it in the process. */ /** Destroy the given completion queue alarm, cancelling it in the process. */
GRPCAPI void grpc_alarm_destroy(grpc_alarm *alarm, void *reserved); GRPCAPI void grpc_alarm_destroy(grpc_alarm* alarm, void* reserved);
/** Check the connectivity state of a channel. */ /** Check the connectivity state of a channel. */
GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state( GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state(
grpc_channel *channel, int try_to_connect); grpc_channel* channel, int try_to_connect);
/** Number of active "external connectivity state watchers" attached to a /** Number of active "external connectivity state watchers" attached to a
* channel. * channel.
* Useful for testing. **/ * Useful for testing. **/
GRPCAPI int grpc_channel_num_external_connectivity_watchers( GRPCAPI int grpc_channel_num_external_connectivity_watchers(
grpc_channel *channel); grpc_channel* channel);
/** Watch for a change in connectivity state. /** Watch for a change in connectivity state.
Once the channel connectivity state is different from last_observed_state, Once the channel connectivity state is different from last_observed_state,
@ -178,11 +195,11 @@ GRPCAPI int grpc_channel_num_external_connectivity_watchers(
If deadline expires BEFORE the state is changed, tag will be enqueued on cq If deadline expires BEFORE the state is changed, tag will be enqueued on cq
with success=0. */ with success=0. */
GRPCAPI void grpc_channel_watch_connectivity_state( GRPCAPI void grpc_channel_watch_connectivity_state(
grpc_channel *channel, grpc_connectivity_state last_observed_state, grpc_channel* channel, grpc_connectivity_state last_observed_state,
gpr_timespec deadline, grpc_completion_queue *cq, void *tag); gpr_timespec deadline, grpc_completion_queue* cq, void* tag);
/** Check whether a grpc channel supports connectivity watcher */ /** Check whether a grpc channel supports connectivity watcher */
GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel *channel); GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel* channel);
/** Create a call given a grpc_channel, in order to call 'method'. All /** Create a call given a grpc_channel, in order to call 'method'. All
completions are sent to 'completion_queue'. 'method' and 'host' need only completions are sent to 'completion_queue'. 'method' and 'host' need only
@ -191,31 +208,31 @@ GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel *channel);
to propagate properties from the server call to this new client call, to propagate properties from the server call to this new client call,
depending on the value of \a propagation_mask (see propagation_bits.h for depending on the value of \a propagation_mask (see propagation_bits.h for
possible values). */ possible values). */
GRPCAPI grpc_call *grpc_channel_create_call( GRPCAPI grpc_call* grpc_channel_create_call(
grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask, grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
grpc_completion_queue *completion_queue, grpc_slice method, grpc_completion_queue* completion_queue, grpc_slice method,
const grpc_slice *host, gpr_timespec deadline, void *reserved); const grpc_slice* host, gpr_timespec deadline, void* reserved);
/** Ping the channels peer (load balanced channels will select one sub-channel /** Ping the channels peer (load balanced channels will select one sub-channel
to ping); if the channel is not connected, posts a failed. */ to ping); if the channel is not connected, posts a failed. */
GRPCAPI void grpc_channel_ping(grpc_channel *channel, grpc_completion_queue *cq, GRPCAPI void grpc_channel_ping(grpc_channel* channel, grpc_completion_queue* cq,
void *tag, void *reserved); void* tag, void* reserved);
/** Pre-register a method/host pair on a channel. */ /** Pre-register a method/host pair on a channel. */
GRPCAPI void *grpc_channel_register_call(grpc_channel *channel, GRPCAPI void* grpc_channel_register_call(grpc_channel* channel,
const char *method, const char *host, const char* method, const char* host,
void *reserved); void* reserved);
/** Create a call given a handle returned from grpc_channel_register_call. /** Create a call given a handle returned from grpc_channel_register_call.
\sa grpc_channel_create_call. */ \sa grpc_channel_create_call. */
GRPCAPI grpc_call *grpc_channel_create_registered_call( GRPCAPI grpc_call* grpc_channel_create_registered_call(
grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask, grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
grpc_completion_queue *completion_queue, void *registered_call_handle, grpc_completion_queue* completion_queue, void* registered_call_handle,
gpr_timespec deadline, void *reserved); gpr_timespec deadline, void* reserved);
/** Allocate memory in the grpc_call arena: this memory is automatically /** Allocate memory in the grpc_call arena: this memory is automatically
discarded at call completion */ discarded at call completion */
GRPCAPI void *grpc_call_arena_alloc(grpc_call *call, size_t size); GRPCAPI void* grpc_call_arena_alloc(grpc_call* call, size_t size);
/** Start a batch of operations defined in the array ops; when complete, post a /** Start a batch of operations defined in the array ops; when complete, post a
completion of type 'tag' to the completion queue bound to the call. completion of type 'tag' to the completion queue bound to the call.
@ -234,9 +251,9 @@ GRPCAPI void *grpc_call_arena_alloc(grpc_call *call, size_t size);
needs to be synchronized. As an optimization, you may synchronize batches needs to be synchronized. As an optimization, you may synchronize batches
containing just send operations independently from batches containing just containing just send operations independently from batches containing just
receive operations. */ receive operations. */
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call* call,
const grpc_op *ops, size_t nops, const grpc_op* ops, size_t nops,
void *tag, void *reserved); void* tag, void* reserved);
/** Returns a newly allocated string representing the endpoint to which this /** Returns a newly allocated string representing the endpoint to which this
call is communicating with. The string is in the uri format accepted by call is communicating with. The string is in the uri format accepted by
@ -246,43 +263,43 @@ GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call,
WARNING: this value is never authenticated or subject to any security WARNING: this value is never authenticated or subject to any security
related code. It must not be used for any authentication related related code. It must not be used for any authentication related
functionality. Instead, use grpc_auth_context. */ functionality. Instead, use grpc_auth_context. */
GRPCAPI char *grpc_call_get_peer(grpc_call *call); GRPCAPI char* grpc_call_get_peer(grpc_call* call);
struct census_context; struct census_context;
/** Set census context for a call; Must be called before first call to /** Set census context for a call; Must be called before first call to
grpc_call_start_batch(). */ grpc_call_start_batch(). */
GRPCAPI void grpc_census_call_set_context(grpc_call *call, GRPCAPI void grpc_census_call_set_context(grpc_call* call,
struct census_context *context); struct census_context* context);
/** Retrieve the calls current census context. */ /** Retrieve the calls current census context. */
GRPCAPI struct census_context *grpc_census_call_get_context(grpc_call *call); GRPCAPI struct census_context* grpc_census_call_get_context(grpc_call* call);
/** Return a newly allocated string representing the target a channel was /** Return a newly allocated string representing the target a channel was
created for. */ created for. */
GRPCAPI char *grpc_channel_get_target(grpc_channel *channel); GRPCAPI char* grpc_channel_get_target(grpc_channel* channel);
/** Request info about the channel. /** Request info about the channel.
\a channel_info indicates what information is being requested and \a channel_info indicates what information is being requested and
how that information will be returned. how that information will be returned.
\a channel_info is owned by the caller. */ \a channel_info is owned by the caller. */
GRPCAPI void grpc_channel_get_info(grpc_channel *channel, GRPCAPI void grpc_channel_get_info(grpc_channel* channel,
const grpc_channel_info *channel_info); const grpc_channel_info* channel_info);
/** Create a client channel to 'target'. Additional channel level configuration /** Create a client channel to 'target'. Additional channel level configuration
MAY be provided by grpc_channel_args, though the expectation is that most MAY be provided by grpc_channel_args, though the expectation is that most
clients will want to simply pass NULL. See grpc_channel_args definition for clients will want to simply pass NULL. See grpc_channel_args definition for
more on this. The data in 'args' need only live through the invocation of more on this. The data in 'args' need only live through the invocation of
this function. */ this function. */
GRPCAPI grpc_channel *grpc_insecure_channel_create( GRPCAPI grpc_channel* grpc_insecure_channel_create(
const char *target, const grpc_channel_args *args, void *reserved); const char* target, const grpc_channel_args* args, void* reserved);
/** Create a lame client: this client fails every operation attempted on it. */ /** Create a lame client: this client fails every operation attempted on it. */
GRPCAPI grpc_channel *grpc_lame_client_channel_create( GRPCAPI grpc_channel* grpc_lame_client_channel_create(
const char *target, grpc_status_code error_code, const char *error_message); const char* target, grpc_status_code error_code, const char* error_message);
/** Close and destroy a grpc channel */ /** Close and destroy a grpc channel */
GRPCAPI void grpc_channel_destroy(grpc_channel *channel); GRPCAPI void grpc_channel_destroy(grpc_channel* channel);
/** Error handling for grpc_call /** Error handling for grpc_call
Most grpc_call functions return a grpc_error. If the error is not GRPC_OK Most grpc_call functions return a grpc_error. If the error is not GRPC_OK
@ -295,7 +312,7 @@ GRPCAPI void grpc_channel_destroy(grpc_channel *channel);
THREAD-SAFETY grpc_call_cancel and grpc_call_cancel_with_status THREAD-SAFETY grpc_call_cancel and grpc_call_cancel_with_status
are thread-safe, and can be called at any point before grpc_call_unref are thread-safe, and can be called at any point before grpc_call_unref
is called.*/ is called.*/
GRPCAPI grpc_call_error grpc_call_cancel(grpc_call *call, void *reserved); GRPCAPI grpc_call_error grpc_call_cancel(grpc_call* call, void* reserved);
/** Called by clients to cancel an RPC on the server. /** Called by clients to cancel an RPC on the server.
Can be called multiple times, from any thread. Can be called multiple times, from any thread.
@ -307,18 +324,18 @@ GRPCAPI grpc_call_error grpc_call_cancel(grpc_call *call, void *reserved);
It doesn't need to be alive after the call to It doesn't need to be alive after the call to
grpc_call_cancel_with_status completes. grpc_call_cancel_with_status completes.
*/ */
GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call *call, GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call* call,
grpc_status_code status, grpc_status_code status,
const char *description, const char* description,
void *reserved); void* reserved);
/** Ref a call. /** Ref a call.
THREAD SAFETY: grpc_call_ref is thread-compatible */ THREAD SAFETY: grpc_call_ref is thread-compatible */
GRPCAPI void grpc_call_ref(grpc_call *call); GRPCAPI void grpc_call_ref(grpc_call* call);
/** Unref a call. /** Unref a call.
THREAD SAFETY: grpc_call_unref is thread-compatible */ THREAD SAFETY: grpc_call_unref is thread-compatible */
GRPCAPI void grpc_call_unref(grpc_call *call); GRPCAPI void grpc_call_unref(grpc_call* call);
/** Request notification of a new call. /** Request notification of a new call.
Once a call is received, a notification tagged with \a tag_new is added to Once a call is received, a notification tagged with \a tag_new is added to
@ -329,10 +346,10 @@ GRPCAPI void grpc_call_unref(grpc_call *call);
Note that \a cq_for_notification must have been registered to the server via Note that \a cq_for_notification must have been registered to the server via
\a grpc_server_register_completion_queue. */ \a grpc_server_register_completion_queue. */
GRPCAPI grpc_call_error grpc_server_request_call( GRPCAPI grpc_call_error grpc_server_request_call(
grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_server* server, grpc_call** call, grpc_call_details* details,
grpc_metadata_array *request_metadata, grpc_metadata_array* request_metadata,
grpc_completion_queue *cq_bound_to_call, grpc_completion_queue* cq_bound_to_call,
grpc_completion_queue *cq_for_notification, void *tag_new); grpc_completion_queue* cq_for_notification, void* tag_new);
/** How to handle payloads for a registered method */ /** How to handle payloads for a registered method */
typedef enum { typedef enum {
@ -349,8 +366,8 @@ typedef enum {
registered_method (as returned by this function). registered_method (as returned by this function).
Must be called before grpc_server_start. Must be called before grpc_server_start.
Returns NULL on failure. */ Returns NULL on failure. */
GRPCAPI void *grpc_server_register_method( GRPCAPI void* grpc_server_register_method(
grpc_server *server, const char *method, const char *host, grpc_server* server, const char* method, const char* host,
grpc_server_register_method_payload_handling payload_handling, grpc_server_register_method_payload_handling payload_handling,
uint32_t flags); uint32_t flags);
@ -358,35 +375,35 @@ GRPCAPI void *grpc_server_register_method(
must have been registered to the server via must have been registered to the server via
grpc_server_register_completion_queue. */ grpc_server_register_completion_queue. */
GRPCAPI grpc_call_error grpc_server_request_registered_call( GRPCAPI grpc_call_error grpc_server_request_registered_call(
grpc_server *server, void *registered_method, grpc_call **call, grpc_server* server, void* registered_method, grpc_call** call,
gpr_timespec *deadline, grpc_metadata_array *request_metadata, gpr_timespec* deadline, grpc_metadata_array* request_metadata,
grpc_byte_buffer **optional_payload, grpc_byte_buffer** optional_payload,
grpc_completion_queue *cq_bound_to_call, grpc_completion_queue* cq_bound_to_call,
grpc_completion_queue *cq_for_notification, void *tag_new); grpc_completion_queue* cq_for_notification, void* tag_new);
/** Create a server. Additional configuration for each incoming channel can /** Create a server. Additional configuration for each incoming channel can
be specified with args. If no additional configuration is needed, args can be specified with args. If no additional configuration is needed, args can
be NULL. See grpc_channel_args for more. The data in 'args' need only live be NULL. See grpc_channel_args for more. The data in 'args' need only live
through the invocation of this function. */ through the invocation of this function. */
GRPCAPI grpc_server *grpc_server_create(const grpc_channel_args *args, GRPCAPI grpc_server* grpc_server_create(const grpc_channel_args* args,
void *reserved); void* reserved);
/** Register a completion queue with the server. Must be done for any /** Register a completion queue with the server. Must be done for any
notification completion queue that is passed to grpc_server_request_*_call notification completion queue that is passed to grpc_server_request_*_call
and to grpc_server_shutdown_and_notify. Must be performed prior to and to grpc_server_shutdown_and_notify. Must be performed prior to
grpc_server_start. */ grpc_server_start. */
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, GRPCAPI void grpc_server_register_completion_queue(grpc_server* server,
grpc_completion_queue *cq, grpc_completion_queue* cq,
void *reserved); void* reserved);
/** Add a HTTP2 over plaintext over tcp listener. /** Add a HTTP2 over plaintext over tcp listener.
Returns bound port number on success, 0 on failure. Returns bound port number on success, 0 on failure.
REQUIRES: server not started */ REQUIRES: server not started */
GRPCAPI int grpc_server_add_insecure_http2_port(grpc_server *server, GRPCAPI int grpc_server_add_insecure_http2_port(grpc_server* server,
const char *addr); const char* addr);
/** Start a server - tells all listeners to start listening */ /** Start a server - tells all listeners to start listening */
GRPCAPI void grpc_server_start(grpc_server *server); GRPCAPI void grpc_server_start(grpc_server* server);
/** Begin shutting down a server. /** Begin shutting down a server.
After completion, no new calls or connections will be admitted. After completion, no new calls or connections will be admitted.
@ -395,19 +412,19 @@ GRPCAPI void grpc_server_start(grpc_server *server);
Shutdown is idempotent, and all tags will be notified at once if multiple Shutdown is idempotent, and all tags will be notified at once if multiple
grpc_server_shutdown_and_notify calls are made. 'cq' must have been grpc_server_shutdown_and_notify calls are made. 'cq' must have been
registered to this server via grpc_server_register_completion_queue. */ registered to this server via grpc_server_register_completion_queue. */
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, GRPCAPI void grpc_server_shutdown_and_notify(grpc_server* server,
grpc_completion_queue *cq, grpc_completion_queue* cq,
void *tag); void* tag);
/** Cancel all in-progress calls. /** Cancel all in-progress calls.
Only usable after shutdown. */ Only usable after shutdown. */
GRPCAPI void grpc_server_cancel_all_calls(grpc_server *server); GRPCAPI void grpc_server_cancel_all_calls(grpc_server* server);
/** Destroy a server. /** Destroy a server.
Shutdown must have completed beforehand (i.e. all tags generated by Shutdown must have completed beforehand (i.e. all tags generated by
grpc_server_shutdown_and_notify must have been received, and at least grpc_server_shutdown_and_notify must have been received, and at least
one call to grpc_server_shutdown_and_notify must have been made). */ one call to grpc_server_shutdown_and_notify must have been made). */
GRPCAPI void grpc_server_destroy(grpc_server *server); GRPCAPI void grpc_server_destroy(grpc_server* server);
/** Enable or disable a tracer. /** Enable or disable a tracer.
@ -417,7 +434,7 @@ GRPCAPI void grpc_server_destroy(grpc_server *server);
Use of this function is not strictly thread-safe, but the Use of this function is not strictly thread-safe, but the
thread-safety issues raised by it should not be of concern. */ thread-safety issues raised by it should not be of concern. */
GRPCAPI int grpc_tracer_set_enabled(const char *name, int enabled); GRPCAPI int grpc_tracer_set_enabled(const char* name, int enabled);
/** Check whether a metadata key is legal (will be accepted by core) */ /** Check whether a metadata key is legal (will be accepted by core) */
GRPCAPI int grpc_header_key_is_legal(grpc_slice slice); GRPCAPI int grpc_header_key_is_legal(grpc_slice slice);
@ -430,24 +447,24 @@ GRPCAPI int grpc_header_nonbin_value_is_legal(grpc_slice slice);
GRPCAPI int grpc_is_binary_header(grpc_slice slice); GRPCAPI int grpc_is_binary_header(grpc_slice slice);
/** Convert grpc_call_error values to a string */ /** Convert grpc_call_error values to a string */
GRPCAPI const char *grpc_call_error_to_string(grpc_call_error error); GRPCAPI const char* grpc_call_error_to_string(grpc_call_error error);
/** Create a buffer pool */ /** Create a buffer pool */
GRPCAPI grpc_resource_quota *grpc_resource_quota_create(const char *trace_name); GRPCAPI grpc_resource_quota* grpc_resource_quota_create(const char* trace_name);
/** Add a reference to a buffer pool */ /** Add a reference to a buffer pool */
GRPCAPI void grpc_resource_quota_ref(grpc_resource_quota *resource_quota); GRPCAPI void grpc_resource_quota_ref(grpc_resource_quota* resource_quota);
/** Drop a reference to a buffer pool */ /** Drop a reference to a buffer pool */
GRPCAPI void grpc_resource_quota_unref(grpc_resource_quota *resource_quota); GRPCAPI void grpc_resource_quota_unref(grpc_resource_quota* resource_quota);
/** Update the size of a buffer pool */ /** Update the size of a buffer pool */
GRPCAPI void grpc_resource_quota_resize(grpc_resource_quota *resource_quota, GRPCAPI void grpc_resource_quota_resize(grpc_resource_quota* resource_quota,
size_t new_size); size_t new_size);
/** Fetch a vtable for a grpc_channel_arg that points to a grpc_resource_quota /** Fetch a vtable for a grpc_channel_arg that points to a grpc_resource_quota
*/ */
GRPCAPI const grpc_arg_pointer_vtable *grpc_resource_quota_arg_vtable(void); GRPCAPI const grpc_arg_pointer_vtable* grpc_resource_quota_arg_vtable(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -25,9 +25,9 @@
extern "C" { extern "C" {
#endif #endif
GRPCAPI grpc_channel *grpc_cronet_secure_channel_create( GRPCAPI grpc_channel* grpc_cronet_secure_channel_create(
void *engine, const char *target, const grpc_channel_args *args, void* engine, const char* target, const grpc_channel_args* args,
void *reserved); void* reserved);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -37,8 +37,8 @@ extern "C" {
/** Create a client channel to 'target' using file descriptor 'fd'. The 'target' /** Create a client channel to 'target' using file descriptor 'fd'. The 'target'
argument will be used to indicate the name for this channel. See the comment argument will be used to indicate the name for this channel. See the comment
for grpc_insecure_channel_create for description of 'args' argument. */ for grpc_insecure_channel_create for description of 'args' argument. */
GRPCAPI grpc_channel *grpc_insecure_channel_create_from_fd( GRPCAPI grpc_channel* grpc_insecure_channel_create_from_fd(
const char *target, int fd, const grpc_channel_args *args); const char* target, int fd, const grpc_channel_args* args);
/** Add the connected communication channel based on file descriptor 'fd' to the /** Add the connected communication channel based on file descriptor 'fd' to the
'server'. The 'fd' must be an open file descriptor corresponding to a 'server'. The 'fd' must be an open file descriptor corresponding to a
@ -48,8 +48,8 @@ GRPCAPI grpc_channel *grpc_insecure_channel_create_from_fd(
The 'reserved' pointer MUST be NULL. The 'reserved' pointer MUST be NULL.
*/ */
GRPCAPI void grpc_server_add_insecure_channel_from_fd(grpc_server *server, GRPCAPI void grpc_server_add_insecure_channel_from_fd(grpc_server* server,
void *reserved, int fd); void* reserved, int fd);
/** GRPC Core POSIX library may internally use signals to optimize some work. /** GRPC Core POSIX library may internally use signals to optimize some work.
The library uses (SIGRTMIN + 6) signal by default. Use this API to instruct The library uses (SIGRTMIN + 6) signal by default. Use this API to instruct

@ -32,51 +32,51 @@ extern "C" {
typedef struct grpc_auth_context grpc_auth_context; typedef struct grpc_auth_context grpc_auth_context;
typedef struct grpc_auth_property_iterator { typedef struct grpc_auth_property_iterator {
const grpc_auth_context *ctx; const grpc_auth_context* ctx;
size_t index; size_t index;
const char *name; const char* name;
} grpc_auth_property_iterator; } grpc_auth_property_iterator;
/** value, if not NULL, is guaranteed to be NULL terminated. */ /** value, if not NULL, is guaranteed to be NULL terminated. */
typedef struct grpc_auth_property { typedef struct grpc_auth_property {
char *name; char* name;
char *value; char* value;
size_t value_length; size_t value_length;
} grpc_auth_property; } grpc_auth_property;
/** Returns NULL when the iterator is at the end. */ /** Returns NULL when the iterator is at the end. */
GRPCAPI const grpc_auth_property *grpc_auth_property_iterator_next( GRPCAPI const grpc_auth_property* grpc_auth_property_iterator_next(
grpc_auth_property_iterator *it); grpc_auth_property_iterator* it);
/** Iterates over the auth context. */ /** Iterates over the auth context. */
GRPCAPI grpc_auth_property_iterator GRPCAPI grpc_auth_property_iterator
grpc_auth_context_property_iterator(const grpc_auth_context *ctx); grpc_auth_context_property_iterator(const grpc_auth_context* ctx);
/** Gets the peer identity. Returns an empty iterator (first _next will return /** Gets the peer identity. Returns an empty iterator (first _next will return
NULL) if the peer is not authenticated. */ NULL) if the peer is not authenticated. */
GRPCAPI grpc_auth_property_iterator GRPCAPI grpc_auth_property_iterator
grpc_auth_context_peer_identity(const grpc_auth_context *ctx); grpc_auth_context_peer_identity(const grpc_auth_context* ctx);
/** Finds a property in the context. May return an empty iterator (first _next /** Finds a property in the context. May return an empty iterator (first _next
will return NULL) if no property with this name was found in the context. */ will return NULL) if no property with this name was found in the context. */
GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name( GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name(
const grpc_auth_context *ctx, const char *name); const grpc_auth_context* ctx, const char* name);
/** Gets the name of the property that indicates the peer identity. Will return /** Gets the name of the property that indicates the peer identity. Will return
NULL if the peer is not authenticated. */ NULL if the peer is not authenticated. */
GRPCAPI const char *grpc_auth_context_peer_identity_property_name( GRPCAPI const char* grpc_auth_context_peer_identity_property_name(
const grpc_auth_context *ctx); const grpc_auth_context* ctx);
/** Returns 1 if the peer is authenticated, 0 otherwise. */ /** Returns 1 if the peer is authenticated, 0 otherwise. */
GRPCAPI int grpc_auth_context_peer_is_authenticated( GRPCAPI int grpc_auth_context_peer_is_authenticated(
const grpc_auth_context *ctx); const grpc_auth_context* ctx);
/** Gets the auth context from the call. Caller needs to call /** Gets the auth context from the call. Caller needs to call
grpc_auth_context_release on the returned context. */ grpc_auth_context_release on the returned context. */
GRPCAPI grpc_auth_context *grpc_call_auth_context(grpc_call *call); GRPCAPI grpc_auth_context* grpc_call_auth_context(grpc_call* call);
/** Releases the auth context returned from grpc_call_auth_context. */ /** Releases the auth context returned from grpc_call_auth_context. */
GRPCAPI void grpc_auth_context_release(grpc_auth_context *context); GRPCAPI void grpc_auth_context_release(grpc_auth_context* context);
/** -- /** --
The following auth context methods should only be called by a server metadata The following auth context methods should only be called by a server metadata
@ -84,19 +84,19 @@ GRPCAPI void grpc_auth_context_release(grpc_auth_context *context);
-- */ -- */
/** Add a property. */ /** Add a property. */
GRPCAPI void grpc_auth_context_add_property(grpc_auth_context *ctx, GRPCAPI void grpc_auth_context_add_property(grpc_auth_context* ctx,
const char *name, const char *value, const char* name, const char* value,
size_t value_length); size_t value_length);
/** Add a C string property. */ /** Add a C string property. */
GRPCAPI void grpc_auth_context_add_cstring_property(grpc_auth_context *ctx, GRPCAPI void grpc_auth_context_add_cstring_property(grpc_auth_context* ctx,
const char *name, const char* name,
const char *value); const char* value);
/** Sets the property name. Returns 1 if successful or 0 in case of failure /** Sets the property name. Returns 1 if successful or 0 in case of failure
(which means that no property with this name exists). */ (which means that no property with this name exists). */
GRPCAPI int grpc_auth_context_set_peer_identity_property_name( GRPCAPI int grpc_auth_context_set_peer_identity_property_name(
grpc_auth_context *ctx, const char *name); grpc_auth_context* ctx, const char* name);
/** --- grpc_channel_credentials object. --- /** --- grpc_channel_credentials object. ---
@ -107,12 +107,12 @@ typedef struct grpc_channel_credentials grpc_channel_credentials;
/** Releases a channel credentials object. /** Releases a channel credentials object.
The creator of the credentials object is responsible for its release. */ The creator of the credentials object is responsible for its release. */
GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds); GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials* creds);
/** Creates default credentials to connect to a google gRPC service. /** Creates default credentials to connect to a google gRPC service.
WARNING: Do NOT use this credentials to connect to a non-google service as WARNING: Do NOT use this credentials to connect to a non-google service as
this could result in an oauth2 token leak. */ this could result in an oauth2 token leak. */
GRPCAPI grpc_channel_credentials *grpc_google_default_credentials_create(void); GRPCAPI grpc_channel_credentials* grpc_google_default_credentials_create(void);
/** Callback for getting the SSL roots override from the application. /** Callback for getting the SSL roots override from the application.
In case of success, *pem_roots_certs must be set to a NULL terminated string In case of success, *pem_roots_certs must be set to a NULL terminated string
@ -121,7 +121,7 @@ GRPCAPI grpc_channel_credentials *grpc_google_default_credentials_create(void);
If this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is If this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is
set to a valid path, it will override the roots specified this func */ set to a valid path, it will override the roots specified this func */
typedef grpc_ssl_roots_override_result (*grpc_ssl_roots_override_callback)( typedef grpc_ssl_roots_override_result (*grpc_ssl_roots_override_callback)(
char **pem_root_certs); char** pem_root_certs);
/** Setup a callback to override the default TLS/SSL roots. /** Setup a callback to override the default TLS/SSL roots.
This function is not thread-safe and must be called at initialization time This function is not thread-safe and must be called at initialization time
@ -135,11 +135,11 @@ GRPCAPI void grpc_set_ssl_roots_override_callback(
typedef struct { typedef struct {
/** private_key is the NULL-terminated string containing the PEM encoding of /** private_key is the NULL-terminated string containing the PEM encoding of
the client's private key. */ the client's private key. */
const char *private_key; const char* private_key;
/** cert_chain is the NULL-terminated string containing the PEM encoding of /** cert_chain is the NULL-terminated string containing the PEM encoding of
the client's certificate chain. */ the client's certificate chain. */
const char *cert_chain; const char* cert_chain;
} grpc_ssl_pem_key_cert_pair; } grpc_ssl_pem_key_cert_pair;
/** Creates an SSL credentials object. /** Creates an SSL credentials object.
@ -153,9 +153,9 @@ typedef struct {
- pem_key_cert_pair is a pointer on the object containing client's private - pem_key_cert_pair is a pointer on the object containing client's private
key and certificate chain. This parameter can be NULL if the client does key and certificate chain. This parameter can be NULL if the client does
not have such a key/cert pair. */ not have such a key/cert pair. */
GRPCAPI grpc_channel_credentials *grpc_ssl_credentials_create( GRPCAPI grpc_channel_credentials* grpc_ssl_credentials_create(
const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair, const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair,
void *reserved); void* reserved);
/** --- grpc_call_credentials object. /** --- grpc_call_credentials object.
@ -167,23 +167,23 @@ typedef struct grpc_call_credentials grpc_call_credentials;
/** Releases a call credentials object. /** Releases a call credentials object.
The creator of the credentials object is responsible for its release. */ The creator of the credentials object is responsible for its release. */
GRPCAPI void grpc_call_credentials_release(grpc_call_credentials *creds); GRPCAPI void grpc_call_credentials_release(grpc_call_credentials* creds);
/** Creates a composite channel credentials object. */ /** Creates a composite channel credentials object. */
GRPCAPI grpc_channel_credentials *grpc_composite_channel_credentials_create( GRPCAPI grpc_channel_credentials* grpc_composite_channel_credentials_create(
grpc_channel_credentials *channel_creds, grpc_call_credentials *call_creds, grpc_channel_credentials* channel_creds, grpc_call_credentials* call_creds,
void *reserved); void* reserved);
/** Creates a composite call credentials object. */ /** Creates a composite call credentials object. */
GRPCAPI grpc_call_credentials *grpc_composite_call_credentials_create( GRPCAPI grpc_call_credentials* grpc_composite_call_credentials_create(
grpc_call_credentials *creds1, grpc_call_credentials *creds2, grpc_call_credentials* creds1, grpc_call_credentials* creds2,
void *reserved); void* reserved);
/** Creates a compute engine credentials object for connecting to Google. /** Creates a compute engine credentials object for connecting to Google.
WARNING: Do NOT use this credentials to connect to a non-google service as WARNING: Do NOT use this credentials to connect to a non-google service as
this could result in an oauth2 token leak. */ this could result in an oauth2 token leak. */
GRPCAPI grpc_call_credentials *grpc_google_compute_engine_credentials_create( GRPCAPI grpc_call_credentials* grpc_google_compute_engine_credentials_create(
void *reserved); void* reserved);
GRPCAPI gpr_timespec grpc_max_auth_token_lifetime(); GRPCAPI gpr_timespec grpc_max_auth_token_lifetime();
@ -192,10 +192,10 @@ GRPCAPI gpr_timespec grpc_max_auth_token_lifetime();
- token_lifetime is the lifetime of each Json Web Token (JWT) created with - token_lifetime is the lifetime of each Json Web Token (JWT) created with
this credentials. It should not exceed grpc_max_auth_token_lifetime or this credentials. It should not exceed grpc_max_auth_token_lifetime or
will be cropped to this value. */ will be cropped to this value. */
GRPCAPI grpc_call_credentials * GRPCAPI grpc_call_credentials*
grpc_service_account_jwt_access_credentials_create(const char *json_key, grpc_service_account_jwt_access_credentials_create(const char* json_key,
gpr_timespec token_lifetime, gpr_timespec token_lifetime,
void *reserved); void* reserved);
/** Creates an Oauth2 Refresh Token credentials object for connecting to Google. /** Creates an Oauth2 Refresh Token credentials object for connecting to Google.
May return NULL if the input is invalid. May return NULL if the input is invalid.
@ -203,18 +203,18 @@ grpc_service_account_jwt_access_credentials_create(const char *json_key,
this could result in an oauth2 token leak. this could result in an oauth2 token leak.
- json_refresh_token is the JSON string containing the refresh token itself - json_refresh_token is the JSON string containing the refresh token itself
along with a client_id and client_secret. */ along with a client_id and client_secret. */
GRPCAPI grpc_call_credentials *grpc_google_refresh_token_credentials_create( GRPCAPI grpc_call_credentials* grpc_google_refresh_token_credentials_create(
const char *json_refresh_token, void *reserved); const char* json_refresh_token, void* reserved);
/** Creates an Oauth2 Access Token credentials with an access token that was /** Creates an Oauth2 Access Token credentials with an access token that was
aquired by an out of band mechanism. */ aquired by an out of band mechanism. */
GRPCAPI grpc_call_credentials *grpc_access_token_credentials_create( GRPCAPI grpc_call_credentials* grpc_access_token_credentials_create(
const char *access_token, void *reserved); const char* access_token, void* reserved);
/** Creates an IAM credentials object for connecting to Google. */ /** Creates an IAM credentials object for connecting to Google. */
GRPCAPI grpc_call_credentials *grpc_google_iam_credentials_create( GRPCAPI grpc_call_credentials* grpc_google_iam_credentials_create(
const char *authorization_token, const char *authority_selector, const char* authorization_token, const char* authority_selector,
void *reserved); void* reserved);
/** Callback function to be called by the metadata credentials plugin /** Callback function to be called by the metadata credentials plugin
implementation when the metadata is ready. implementation when the metadata is ready.
@ -228,25 +228,25 @@ GRPCAPI grpc_call_credentials *grpc_google_iam_credentials_create(
- error_details contains details about the error if any. In case of success - error_details contains details about the error if any. In case of success
it should be NULL and will be otherwise ignored. */ it should be NULL and will be otherwise ignored. */
typedef void (*grpc_credentials_plugin_metadata_cb)( typedef void (*grpc_credentials_plugin_metadata_cb)(
void *user_data, const grpc_metadata *creds_md, size_t num_creds_md, void* user_data, const grpc_metadata* creds_md, size_t num_creds_md,
grpc_status_code status, const char *error_details); grpc_status_code status, const char* error_details);
/** Context that can be used by metadata credentials plugin in order to create /** Context that can be used by metadata credentials plugin in order to create
auth related metadata. */ auth related metadata. */
typedef struct { typedef struct {
/** The fully qualifed service url. */ /** The fully qualifed service url. */
const char *service_url; const char* service_url;
/** The method name of the RPC being called (not fully qualified). /** The method name of the RPC being called (not fully qualified).
The fully qualified method name can be built from the service_url: The fully qualified method name can be built from the service_url:
full_qualified_method_name = ctx->service_url + '/' + ctx->method_name. */ full_qualified_method_name = ctx->service_url + '/' + ctx->method_name. */
const char *method_name; const char* method_name;
/** The auth_context of the channel which gives the server's identity. */ /** The auth_context of the channel which gives the server's identity. */
const grpc_auth_context *channel_auth_context; const grpc_auth_context* channel_auth_context;
/** Reserved for future use. */ /** Reserved for future use. */
void *reserved; void* reserved;
} grpc_auth_metadata_context; } grpc_auth_metadata_context;
/** Maximum number of metadata entries returnable by a credentials plugin via /** Maximum number of metadata entries returnable by a credentials plugin via
@ -278,32 +278,32 @@ typedef struct {
\a context is the information that can be used by the plugin to create \a context is the information that can be used by the plugin to create
auth metadata. */ auth metadata. */
int (*get_metadata)( int (*get_metadata)(
void *state, grpc_auth_metadata_context context, void* state, grpc_auth_metadata_context context,
grpc_credentials_plugin_metadata_cb cb, void *user_data, grpc_credentials_plugin_metadata_cb cb, void* user_data,
grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX],
size_t *num_creds_md, grpc_status_code *status, size_t* num_creds_md, grpc_status_code* status,
const char **error_details); const char** error_details);
/** Destroys the plugin state. */ /** Destroys the plugin state. */
void (*destroy)(void *state); void (*destroy)(void* state);
/** State that will be set as the first parameter of the methods above. */ /** State that will be set as the first parameter of the methods above. */
void *state; void* state;
/** Type of credentials that this plugin is implementing. */ /** Type of credentials that this plugin is implementing. */
const char *type; const char* type;
} grpc_metadata_credentials_plugin; } grpc_metadata_credentials_plugin;
/** Creates a credentials object from a plugin. */ /** Creates a credentials object from a plugin. */
GRPCAPI grpc_call_credentials *grpc_metadata_credentials_create_from_plugin( GRPCAPI grpc_call_credentials* grpc_metadata_credentials_create_from_plugin(
grpc_metadata_credentials_plugin plugin, void *reserved); grpc_metadata_credentials_plugin plugin, void* reserved);
/** --- Secure channel creation. --- */ /** --- Secure channel creation. --- */
/** Creates a secure channel using the passed-in credentials. */ /** Creates a secure channel using the passed-in credentials. */
GRPCAPI grpc_channel *grpc_secure_channel_create( GRPCAPI grpc_channel* grpc_secure_channel_create(
grpc_channel_credentials *creds, const char *target, grpc_channel_credentials* creds, const char* target,
const grpc_channel_args *args, void *reserved); const grpc_channel_args* args, void* reserved);
/** --- grpc_server_credentials object. --- /** --- grpc_server_credentials object. ---
@ -314,7 +314,44 @@ typedef struct grpc_server_credentials grpc_server_credentials;
/** Releases a server_credentials object. /** Releases a server_credentials object.
The creator of the server_credentials object is responsible for its release. The creator of the server_credentials object is responsible for its release.
*/ */
GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds); GRPCAPI void grpc_server_credentials_release(grpc_server_credentials* creds);
/** Server certificate config object holds the server's public certificates and
associated private keys, as well as any CA certificates needed for client
certificate validation (if applicable). Create using
grpc_ssl_server_certificate_config_create(). */
typedef struct grpc_ssl_server_certificate_config
grpc_ssl_server_certificate_config;
/** Creates a grpc_ssl_server_certificate_config object.
- pem_roots_cert is the NULL-terminated string containing the PEM encoding of
the client root certificates. This parameter may be NULL if the server does
not want the client to be authenticated with SSL.
- pem_key_cert_pairs is an array private key / certificate chains of the
server. This parameter cannot be NULL.
- num_key_cert_pairs indicates the number of items in the private_key_files
and cert_chain_files parameters. It must be at least 1.
- It is the caller's responsibility to free this object via
grpc_ssl_server_certificate_config_destroy(). */
GRPCAPI grpc_ssl_server_certificate_config*
grpc_ssl_server_certificate_config_create(
const char* pem_root_certs,
const grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs,
size_t num_key_cert_pairs);
/** Destroys a grpc_ssl_server_certificate_config object. */
GRPCAPI void grpc_ssl_server_certificate_config_destroy(
grpc_ssl_server_certificate_config* config);
/** Callback to retrieve updated SSL server certificates, private keys, and
trusted CAs (for client authentication).
- user_data parameter, if not NULL, contains opaque data to be used by the
callback.
- Use grpc_ssl_server_certificate_config_create to create the config.
- The caller assumes ownership of the config. */
typedef grpc_ssl_certificate_config_reload_status (
*grpc_ssl_server_certificate_config_callback)(
void* user_data, grpc_ssl_server_certificate_config** config);
/** Deprecated in favor of grpc_ssl_server_credentials_create_ex. /** Deprecated in favor of grpc_ssl_server_credentials_create_ex.
Creates an SSL server_credentials object. Creates an SSL server_credentials object.
@ -328,34 +365,69 @@ GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds);
- force_client_auth, if set to non-zero will force the client to authenticate - force_client_auth, if set to non-zero will force the client to authenticate
with an SSL cert. Note that this option is ignored if pem_root_certs is with an SSL cert. Note that this option is ignored if pem_root_certs is
NULL. */ NULL. */
GRPCAPI grpc_server_credentials *grpc_ssl_server_credentials_create( GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create(
const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs, const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs,
size_t num_key_cert_pairs, int force_client_auth, void *reserved); size_t num_key_cert_pairs, int force_client_auth, void* reserved);
/** Same as grpc_ssl_server_credentials_create method except uses /** Deprecated in favor of grpc_ssl_server_credentials_create_with_options.
Same as grpc_ssl_server_credentials_create method except uses
grpc_ssl_client_certificate_request_type enum to support more ways to grpc_ssl_client_certificate_request_type enum to support more ways to
authenticate client cerificates.*/ authenticate client cerificates.*/
GRPCAPI grpc_server_credentials *grpc_ssl_server_credentials_create_ex( GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create_ex(
const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs, const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs,
size_t num_key_cert_pairs, size_t num_key_cert_pairs,
grpc_ssl_client_certificate_request_type client_certificate_request, grpc_ssl_client_certificate_request_type client_certificate_request,
void *reserved); void* reserved);
typedef struct grpc_ssl_server_credentials_options
grpc_ssl_server_credentials_options;
/** Creates an options object using a certificate config. Use this method when
the certificates and keys of the SSL server will not change during the
server's lifetime.
- Takes ownership of the certificate_config parameter. */
GRPCAPI grpc_ssl_server_credentials_options*
grpc_ssl_server_credentials_create_options_using_config(
grpc_ssl_client_certificate_request_type client_certificate_request,
grpc_ssl_server_certificate_config* certificate_config);
/** Creates an options object using a certificate config fetcher. Use this
method to reload the certificates and keys of the SSL server without
interrupting the operation of the server. Initial certificate config will be
fetched during server initialization.
- user_data parameter, if not NULL, contains opaque data which will be passed
to the fetcher (see definition of
grpc_ssl_server_certificate_config_callback). */
GRPCAPI grpc_ssl_server_credentials_options*
grpc_ssl_server_credentials_create_options_using_config_fetcher(
grpc_ssl_client_certificate_request_type client_certificate_request,
grpc_ssl_server_certificate_config_callback cb, void* user_data);
/** Destroys a grpc_ssl_server_credentials_options object. */
GRPCAPI void grpc_ssl_server_credentials_options_destroy(
grpc_ssl_server_credentials_options* options);
/** Creates an SSL server_credentials object using the provided options struct.
- Takes ownership of the options parameter. */
GRPCAPI grpc_server_credentials*
grpc_ssl_server_credentials_create_with_options(
grpc_ssl_server_credentials_options* options);
/** --- Server-side secure ports. --- */ /** --- Server-side secure ports. --- */
/** Add a HTTP2 over an encrypted link over tcp listener. /** Add a HTTP2 over an encrypted link over tcp listener.
Returns bound port number on success, 0 on failure. Returns bound port number on success, 0 on failure.
REQUIRES: server not started */ REQUIRES: server not started */
GRPCAPI int grpc_server_add_secure_http2_port(grpc_server *server, GRPCAPI int grpc_server_add_secure_http2_port(grpc_server* server,
const char *addr, const char* addr,
grpc_server_credentials *creds); grpc_server_credentials* creds);
/** --- Call specific credentials. --- */ /** --- Call specific credentials. --- */
/** Sets a credentials to a call. Can only be called on the client side before /** Sets a credentials to a call. Can only be called on the client side before
grpc_call_start_batch. */ grpc_call_start_batch. */
GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call *call, GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call* call,
grpc_call_credentials *creds); grpc_call_credentials* creds);
/** --- Auth Metadata Processing --- */ /** --- Auth Metadata Processing --- */
@ -369,9 +441,9 @@ GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call *call,
GRPC_STATUS PERMISSION_DENIED in case of an authorization failure. GRPC_STATUS PERMISSION_DENIED in case of an authorization failure.
- error_details gives details about the error. May be NULL. */ - error_details gives details about the error. May be NULL. */
typedef void (*grpc_process_auth_metadata_done_cb)( typedef void (*grpc_process_auth_metadata_done_cb)(
void *user_data, const grpc_metadata *consumed_md, size_t num_consumed_md, void* user_data, const grpc_metadata* consumed_md, size_t num_consumed_md,
const grpc_metadata *response_md, size_t num_response_md, const grpc_metadata* response_md, size_t num_response_md,
grpc_status_code status, const char *error_details); grpc_status_code status, const char* error_details);
/** Pluggable server-side metadata processor object. */ /** Pluggable server-side metadata processor object. */
typedef struct { typedef struct {
@ -379,15 +451,15 @@ typedef struct {
channel peer and it is the job of the process function to augment it with channel peer and it is the job of the process function to augment it with
properties derived from the passed-in metadata. properties derived from the passed-in metadata.
The lifetime of these objects is guaranteed until cb is invoked. */ The lifetime of these objects is guaranteed until cb is invoked. */
void (*process)(void *state, grpc_auth_context *context, void (*process)(void* state, grpc_auth_context* context,
const grpc_metadata *md, size_t num_md, const grpc_metadata* md, size_t num_md,
grpc_process_auth_metadata_done_cb cb, void *user_data); grpc_process_auth_metadata_done_cb cb, void* user_data);
void (*destroy)(void *state); void (*destroy)(void* state);
void *state; void* state;
} grpc_auth_metadata_processor; } grpc_auth_metadata_processor;
GRPCAPI void grpc_server_credentials_set_auth_metadata_processor( GRPCAPI void grpc_server_credentials_set_auth_metadata_processor(
grpc_server_credentials *creds, grpc_auth_metadata_processor processor); grpc_server_credentials* creds, grpc_auth_metadata_processor processor);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -48,6 +48,13 @@ typedef enum {
GRPC_SSL_ROOTS_OVERRIDE_FAIL GRPC_SSL_ROOTS_OVERRIDE_FAIL
} grpc_ssl_roots_override_result; } grpc_ssl_roots_override_result;
/** Callback results for dynamically loading a SSL certificate config. */
typedef enum {
GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED,
GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW,
GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
} grpc_ssl_certificate_config_reload_status;
typedef enum { typedef enum {
/** Server does not request client certificate. A client can present a self /** Server does not request client certificate. A client can present a self
signed or signed certificates if it wishes to do so and they would be signed or signed certificates if it wishes to do so and they would be

@ -79,9 +79,17 @@
#error could not determine platform for atm #error could not determine platform for atm
#endif #endif
#ifdef __cplusplus
extern "C" {
#endif
/** Adds \a delta to \a *value, clamping the result to the range specified /** Adds \a delta to \a *value, clamping the result to the range specified
by \a min and \a max. Returns the new value. */ by \a min and \a max. Returns the new value. */
gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm *value, gpr_atm delta, gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta,
gpr_atm min, gpr_atm max); gpr_atm min, gpr_atm max);
#ifdef __cplusplus
}
#endif
#endif /* GRPC_IMPL_CODEGEN_ATM_H */ #endif /* GRPC_IMPL_CODEGEN_ATM_H */

@ -23,6 +23,10 @@
__atomic_* interface. */ __atomic_* interface. */
#include <grpc/impl/codegen/port_platform.h> #include <grpc/impl/codegen/port_platform.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef intptr_t gpr_atm; typedef intptr_t gpr_atm;
#define GPR_ATM_MAX INTPTR_MAX #define GPR_ATM_MAX INTPTR_MAX
#define GPR_ATM_MIN INTPTR_MIN #define GPR_ATM_MIN INTPTR_MIN
@ -57,22 +61,22 @@ extern gpr_atm gpr_counter_atm_add;
GPR_ATM_INC_ADD_THEN( \ GPR_ATM_INC_ADD_THEN( \
__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL)) __atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL))
static __inline int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
p, &o, n, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED)); p, &o, n, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED));
} }
static __inline int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
p, &o, n, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)); p, &o, n, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED));
} }
static __inline int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
p, &o, n, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED)); p, &o, n, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED));
} }
static __inline int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
p, &o, n, 0, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED)); p, &o, n, 0, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED));
} }
@ -80,4 +84,8 @@ static __inline int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
#define gpr_atm_full_xchg(p, n) \ #define gpr_atm_full_xchg(p, n) \
GPR_ATM_INC_CAS_THEN(__atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL)) GPR_ATM_INC_CAS_THEN(__atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL))
#ifdef __cplusplus
}
#endif
#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */ #endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */

@ -38,24 +38,24 @@ typedef intptr_t gpr_atm;
#define gpr_atm_full_barrier() (__sync_synchronize()) #define gpr_atm_full_barrier() (__sync_synchronize())
static __inline gpr_atm gpr_atm_acq_load(const gpr_atm *p) { static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) {
gpr_atm value = *p; gpr_atm value = *p;
GPR_ATM_LS_BARRIER_(); GPR_ATM_LS_BARRIER_();
return value; return value;
} }
static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm *p) { static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) {
gpr_atm value = *p; gpr_atm value = *p;
GPR_ATM_COMPILE_BARRIER_(); GPR_ATM_COMPILE_BARRIER_();
return value; return value;
} }
static __inline void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) { static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) {
GPR_ATM_LS_BARRIER_(); GPR_ATM_LS_BARRIER_();
*p = value; *p = value;
} }
static __inline void gpr_atm_no_barrier_store(gpr_atm *p, gpr_atm value) { static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) {
GPR_ATM_COMPILE_BARRIER_(); GPR_ATM_COMPILE_BARRIER_();
*p = value; *p = value;
} }
@ -72,7 +72,7 @@ static __inline void gpr_atm_no_barrier_store(gpr_atm *p, gpr_atm value) {
#define gpr_atm_rel_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) #define gpr_atm_rel_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))
#define gpr_atm_full_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) #define gpr_atm_full_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))
static __inline gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n) { static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) {
gpr_atm cur; gpr_atm cur;
do { do {
cur = gpr_atm_acq_load(p); cur = gpr_atm_acq_load(p);

@ -28,70 +28,70 @@ typedef intptr_t gpr_atm;
#define gpr_atm_full_barrier MemoryBarrier #define gpr_atm_full_barrier MemoryBarrier
static __inline gpr_atm gpr_atm_acq_load(const gpr_atm *p) { static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) {
gpr_atm result = *p; gpr_atm result = *p;
gpr_atm_full_barrier(); gpr_atm_full_barrier();
return result; return result;
} }
static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm *p) { static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) {
/* TODO(dklempner): Can we implement something better here? */ /* TODO(dklempner): Can we implement something better here? */
return gpr_atm_acq_load(p); return gpr_atm_acq_load(p);
} }
static __inline void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) { static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) {
gpr_atm_full_barrier(); gpr_atm_full_barrier();
*p = value; *p = value;
} }
static __inline void gpr_atm_no_barrier_store(gpr_atm *p, gpr_atm value) { static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) {
/* TODO(ctiller): Can we implement something better here? */ /* TODO(ctiller): Can we implement something better here? */
gpr_atm_rel_store(p, value); gpr_atm_rel_store(p, value);
} }
static __inline int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
/** InterlockedCompareExchangePointerNoFence() not available on vista or /** InterlockedCompareExchangePointerNoFence() not available on vista or
windows7 */ windows7 */
#ifdef GPR_ARCH_64 #ifdef GPR_ARCH_64
return o == (gpr_atm)InterlockedCompareExchangeAcquire64( return o == (gpr_atm)InterlockedCompareExchangeAcquire64(
(volatile LONGLONG *)p, (LONGLONG)n, (LONGLONG)o); (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o);
#else #else
return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG *)p, return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p,
(LONG)n, (LONG)o); (LONG)n, (LONG)o);
#endif #endif
} }
static __inline int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
#ifdef GPR_ARCH_64 #ifdef GPR_ARCH_64
return o == (gpr_atm)InterlockedCompareExchangeAcquire64( return o == (gpr_atm)InterlockedCompareExchangeAcquire64(
(volatile LONGLONG *)p, (LONGLONG)n, (LONGLONG)o); (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o);
#else #else
return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG *)p, return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p,
(LONG)n, (LONG)o); (LONG)n, (LONG)o);
#endif #endif
} }
static __inline int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
#ifdef GPR_ARCH_64 #ifdef GPR_ARCH_64
return o == (gpr_atm)InterlockedCompareExchangeRelease64( return o == (gpr_atm)InterlockedCompareExchangeRelease64(
(volatile LONGLONG *)p, (LONGLONG)n, (LONGLONG)o); (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o);
#else #else
return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG *)p, return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG*)p,
(LONG)n, (LONG)o); (LONG)n, (LONG)o);
#endif #endif
} }
static __inline int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
#ifdef GPR_ARCH_64 #ifdef GPR_ARCH_64
return o == (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG *)p, return o == (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p,
(LONGLONG)n, (LONGLONG)o); (LONGLONG)n, (LONGLONG)o);
#else #else
return o == (gpr_atm)InterlockedCompareExchange((volatile LONG *)p, (LONG)n, return o == (gpr_atm)InterlockedCompareExchange((volatile LONG*)p, (LONG)n,
(LONG)o); (LONG)o);
#endif #endif
} }
static __inline gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p, static __inline gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm* p,
gpr_atm delta) { gpr_atm delta) {
/** Use the CAS operation to get pointer-sized fetch and add */ /** Use the CAS operation to get pointer-sized fetch and add */
gpr_atm old; gpr_atm old;
@ -101,26 +101,26 @@ static __inline gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p,
return old; return old;
} }
static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta) { static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm* p, gpr_atm delta) {
/** Use a CAS operation to get pointer-sized fetch and add */ /** Use a CAS operation to get pointer-sized fetch and add */
gpr_atm old; gpr_atm old;
#ifdef GPR_ARCH_64 #ifdef GPR_ARCH_64
do { do {
old = *p; old = *p;
} while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG *)p, } while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p,
(LONGLONG)old + delta, (LONGLONG)old + delta,
(LONGLONG)old)); (LONGLONG)old));
#else #else
do { do {
old = *p; old = *p;
} while (old != (gpr_atm)InterlockedCompareExchange( } while (old != (gpr_atm)InterlockedCompareExchange(
(volatile LONG *)p, (LONG)old + delta, (LONG)old)); (volatile LONG*)p, (LONG)old + delta, (LONG)old));
#endif #endif
return old; return old;
} }
static __inline gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n) { static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) {
return (gpr_atm)InterlockedExchangePointer((PVOID *)p, (PVOID)n); return (gpr_atm)InterlockedExchangePointer((PVOID*)p, (PVOID)n);
} }
#endif /* GRPC_IMPL_CODEGEN_ATM_WINDOWS_H */ #endif /* GRPC_IMPL_CODEGEN_ATM_WINDOWS_H */

@ -29,7 +29,7 @@ extern "C" {
* *
* Increases the reference count for all \a slices processed. The user is * Increases the reference count for all \a slices processed. The user is
* responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ * responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/
GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_create(grpc_slice *slices, GRPCAPI grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slices,
size_t nslices); size_t nslices);
/** Returns a *compressed* RAW byte buffer instance over the given slices (up to /** Returns a *compressed* RAW byte buffer instance over the given slices (up to
@ -38,20 +38,20 @@ GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_create(grpc_slice *slices,
* *
* Increases the reference count for all \a slices processed. The user is * Increases the reference count for all \a slices processed. The user is
* responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ * responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/
GRPCAPI grpc_byte_buffer *grpc_raw_compressed_byte_buffer_create( GRPCAPI grpc_byte_buffer* grpc_raw_compressed_byte_buffer_create(
grpc_slice *slices, size_t nslices, grpc_compression_algorithm compression); grpc_slice* slices, size_t nslices, grpc_compression_algorithm compression);
/** Copies input byte buffer \a bb. /** Copies input byte buffer \a bb.
* *
* Increases the reference count of all the source slices. The user is * Increases the reference count of all the source slices. The user is
* responsible for calling grpc_byte_buffer_destroy over the returned copy. */ * responsible for calling grpc_byte_buffer_destroy over the returned copy. */
GRPCAPI grpc_byte_buffer *grpc_byte_buffer_copy(grpc_byte_buffer *bb); GRPCAPI grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb);
/** Returns the size of the given byte buffer, in bytes. */ /** Returns the size of the given byte buffer, in bytes. */
GRPCAPI size_t grpc_byte_buffer_length(grpc_byte_buffer *bb); GRPCAPI size_t grpc_byte_buffer_length(grpc_byte_buffer* bb);
/** Destroys \a byte_buffer deallocating all its memory. */ /** Destroys \a byte_buffer deallocating all its memory. */
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *byte_buffer); GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer* byte_buffer);
/** Reader for byte buffers. Iterates over slices in the byte buffer */ /** Reader for byte buffers. Iterates over slices in the byte buffer */
struct grpc_byte_buffer_reader; struct grpc_byte_buffer_reader;
@ -59,25 +59,25 @@ typedef struct grpc_byte_buffer_reader grpc_byte_buffer_reader;
/** Initialize \a reader to read over \a buffer. /** Initialize \a reader to read over \a buffer.
* Returns 1 upon success, 0 otherwise. */ * Returns 1 upon success, 0 otherwise. */
GRPCAPI int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader, GRPCAPI int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader,
grpc_byte_buffer *buffer); grpc_byte_buffer* buffer);
/** Cleanup and destroy \a reader */ /** Cleanup and destroy \a reader */
GRPCAPI void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader *reader); GRPCAPI void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader);
/** Updates \a slice with the next piece of data from from \a reader and returns /** Updates \a slice with the next piece of data from from \a reader and returns
* 1. Returns 0 at the end of the stream. Caller is responsible for calling * 1. Returns 0 at the end of the stream. Caller is responsible for calling
* grpc_slice_unref on the result. */ * grpc_slice_unref on the result. */
GRPCAPI int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader *reader, GRPCAPI int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader,
grpc_slice *slice); grpc_slice* slice);
/** Merge all data from \a reader into single slice */ /** Merge all data from \a reader into single slice */
GRPCAPI grpc_slice GRPCAPI grpc_slice
grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader *reader); grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader* reader);
/** Returns a RAW byte buffer instance from the output of \a reader. */ /** Returns a RAW byte buffer instance from the output of \a reader. */
GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_from_reader( GRPCAPI grpc_byte_buffer* grpc_raw_byte_buffer_from_reader(
grpc_byte_buffer_reader *reader); grpc_byte_buffer_reader* reader);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -26,8 +26,8 @@ extern "C" {
struct grpc_byte_buffer; struct grpc_byte_buffer;
struct grpc_byte_buffer_reader { struct grpc_byte_buffer_reader {
struct grpc_byte_buffer *buffer_in; struct grpc_byte_buffer* buffer_in;
struct grpc_byte_buffer *buffer_out; struct grpc_byte_buffer* buffer_out;
/** Different current objects correspond to different types of byte buffers */ /** Different current objects correspond to different types of byte buffers */
union grpc_byte_buffer_reader_current { union grpc_byte_buffer_reader_current {
/** Index into a slice buffer's array of slices */ /** Index into a slice buffer's array of slices */

@ -25,8 +25,6 @@ extern "C" {
/** Connectivity state of a channel. */ /** Connectivity state of a channel. */
typedef enum { typedef enum {
/** channel has just been initialized */
GRPC_CHANNEL_INIT = -1,
/** channel is idle */ /** channel is idle */
GRPC_CHANNEL_IDLE, GRPC_CHANNEL_IDLE,
/** channel is connecting */ /** channel is connecting */

@ -39,11 +39,11 @@ typedef enum {
} grpc_byte_buffer_type; } grpc_byte_buffer_type;
typedef struct grpc_byte_buffer { typedef struct grpc_byte_buffer {
void *reserved; void* reserved;
grpc_byte_buffer_type type; grpc_byte_buffer_type type;
union grpc_byte_buffer_data { union grpc_byte_buffer_data {
struct /* internal */ { struct /* internal */ {
void *reserved[8]; void* reserved[8];
} reserved; } reserved;
struct grpc_compressed_buffer { struct grpc_compressed_buffer {
grpc_compression_algorithm compression; grpc_compression_algorithm compression;
@ -84,9 +84,9 @@ typedef enum {
} grpc_arg_type; } grpc_arg_type;
typedef struct grpc_arg_pointer_vtable { typedef struct grpc_arg_pointer_vtable {
void *(*copy)(void *p); void* (*copy)(void* p);
void (*destroy)(grpc_exec_ctx *exec_ctx, void *p); void (*destroy)(grpc_exec_ctx* exec_ctx, void* p);
int (*cmp)(void *p, void *q); int (*cmp)(void* p, void* q);
} grpc_arg_pointer_vtable; } grpc_arg_pointer_vtable;
/** A single argument... each argument has a key and a value /** A single argument... each argument has a key and a value
@ -103,13 +103,13 @@ typedef struct grpc_arg_pointer_vtable {
their keys so that it's possible to change them in the future. */ their keys so that it's possible to change them in the future. */
typedef struct { typedef struct {
grpc_arg_type type; grpc_arg_type type;
char *key; char* key;
union grpc_arg_value { union grpc_arg_value {
char *string; char* string;
int integer; int integer;
struct grpc_arg_pointer { struct grpc_arg_pointer {
void *p; void* p;
const grpc_arg_pointer_vtable *vtable; const grpc_arg_pointer_vtable* vtable;
} pointer; } pointer;
} value; } value;
} grpc_arg; } grpc_arg;
@ -127,7 +127,7 @@ typedef struct {
details. */ details. */
typedef struct { typedef struct {
size_t num_args; size_t num_args;
grpc_arg *args; grpc_arg* args;
} grpc_channel_args; } grpc_channel_args;
/** \defgroup grpc_arg_keys /** \defgroup grpc_arg_keys
@ -400,7 +400,7 @@ typedef struct grpc_metadata {
There is no need to initialize them, and they will be set to garbage There is no need to initialize them, and they will be set to garbage
during calls to grpc. */ during calls to grpc. */
struct /* internal */ { struct /* internal */ {
void *obfuscated[4]; void* obfuscated[4];
} internal_data; } internal_data;
} grpc_metadata; } grpc_metadata;
@ -428,13 +428,13 @@ typedef struct grpc_event {
int success; int success;
/** The tag passed to grpc_call_start_batch etc to start this operation. /** The tag passed to grpc_call_start_batch etc to start this operation.
Only GRPC_OP_COMPLETE has a tag. */ Only GRPC_OP_COMPLETE has a tag. */
void *tag; void* tag;
} grpc_event; } grpc_event;
typedef struct { typedef struct {
size_t count; size_t count;
size_t capacity; size_t capacity;
grpc_metadata *metadata; grpc_metadata* metadata;
} grpc_metadata_array; } grpc_metadata_array;
typedef struct { typedef struct {
@ -442,7 +442,7 @@ typedef struct {
grpc_slice host; grpc_slice host;
gpr_timespec deadline; gpr_timespec deadline;
uint32_t flags; uint32_t flags;
void *reserved; void* reserved;
} grpc_call_details; } grpc_call_details;
typedef enum { typedef enum {
@ -498,15 +498,15 @@ typedef struct grpc_op {
/** Write flags bitset for grpc_begin_messages */ /** Write flags bitset for grpc_begin_messages */
uint32_t flags; uint32_t flags;
/** Reserved for future usage */ /** Reserved for future usage */
void *reserved; void* reserved;
union grpc_op_data { union grpc_op_data {
/** Reserved for future usage */ /** Reserved for future usage */
struct /* internal */ { struct /* internal */ {
void *reserved[8]; void* reserved[8];
} reserved; } reserved;
struct grpc_op_send_initial_metadata { struct grpc_op_send_initial_metadata {
size_t count; size_t count;
grpc_metadata *metadata; grpc_metadata* metadata;
/** If \a is_set, \a compression_level will be used for the call. /** If \a is_set, \a compression_level will be used for the call.
* Otherwise, \a compression_level won't be considered */ * Otherwise, \a compression_level won't be considered */
struct grpc_op_send_initial_metadata_maybe_compression_level { struct grpc_op_send_initial_metadata_maybe_compression_level {
@ -524,16 +524,16 @@ typedef struct grpc_op {
* and likely empty. The original owner should still call * and likely empty. The original owner should still call
* grpc_byte_buffer_destroy() on this object however. * grpc_byte_buffer_destroy() on this object however.
*/ */
struct grpc_byte_buffer *send_message; struct grpc_byte_buffer* send_message;
} send_message; } send_message;
struct grpc_op_send_status_from_server { struct grpc_op_send_status_from_server {
size_t trailing_metadata_count; size_t trailing_metadata_count;
grpc_metadata *trailing_metadata; grpc_metadata* trailing_metadata;
grpc_status_code status; grpc_status_code status;
/** optional: set to NULL if no details need sending, non-NULL if they do /** optional: set to NULL if no details need sending, non-NULL if they do
* pointer will not be retained past the start_batch call * pointer will not be retained past the start_batch call
*/ */
grpc_slice *status_details; grpc_slice* status_details;
} send_status_from_server; } send_status_from_server;
/** ownership of the array is with the caller, but ownership of the elements /** ownership of the array is with the caller, but ownership of the elements
stays with the call object (ie key, value members are owned by the call stays with the call object (ie key, value members are owned by the call
@ -541,13 +541,13 @@ typedef struct grpc_op {
After the operation completes, call grpc_metadata_array_destroy on this After the operation completes, call grpc_metadata_array_destroy on this
value, or reuse it in a future op. */ value, or reuse it in a future op. */
struct grpc_op_recv_initial_metadata { struct grpc_op_recv_initial_metadata {
grpc_metadata_array *recv_initial_metadata; grpc_metadata_array* recv_initial_metadata;
} recv_initial_metadata; } recv_initial_metadata;
/** ownership of the byte buffer is moved to the caller; the caller must /** ownership of the byte buffer is moved to the caller; the caller must
call grpc_byte_buffer_destroy on this value, or reuse it in a future op. call grpc_byte_buffer_destroy on this value, or reuse it in a future op.
*/ */
struct grpc_op_recv_message { struct grpc_op_recv_message {
struct grpc_byte_buffer **recv_message; struct grpc_byte_buffer** recv_message;
} recv_message; } recv_message;
struct grpc_op_recv_status_on_client { struct grpc_op_recv_status_on_client {
/** ownership of the array is with the caller, but ownership of the /** ownership of the array is with the caller, but ownership of the
@ -555,14 +555,14 @@ typedef struct grpc_op {
by the call object, trailing_metadata->array is owned by the caller). by the call object, trailing_metadata->array is owned by the caller).
After the operation completes, call grpc_metadata_array_destroy on After the operation completes, call grpc_metadata_array_destroy on
this value, or reuse it in a future op. */ this value, or reuse it in a future op. */
grpc_metadata_array *trailing_metadata; grpc_metadata_array* trailing_metadata;
grpc_status_code *status; grpc_status_code* status;
grpc_slice *status_details; grpc_slice* status_details;
} recv_status_on_client; } recv_status_on_client;
struct grpc_op_recv_close_on_server { struct grpc_op_recv_close_on_server {
/** out argument, set to 1 if the call failed in any way (seen as a /** out argument, set to 1 if the call failed in any way (seen as a
cancellation on the server), or 0 if the call succeeded */ cancellation on the server), or 0 if the call succeeded */
int *cancelled; int* cancelled;
} recv_close_on_server; } recv_close_on_server;
} data; } data;
} grpc_op; } grpc_op;
@ -571,10 +571,10 @@ typedef struct grpc_op {
typedef struct { typedef struct {
/** If non-NULL, will be set to point to a string indicating the LB /** If non-NULL, will be set to point to a string indicating the LB
* policy name. Caller takes ownership. */ * policy name. Caller takes ownership. */
char **lb_policy_name; char** lb_policy_name;
/** If non-NULL, will be set to point to a string containing the /** If non-NULL, will be set to point to a string containing the
* service config used by the channel in JSON form. */ * service config used by the channel in JSON form. */
char **service_config_json; char** service_config_json;
} grpc_channel_info; } grpc_channel_info;
typedef struct grpc_resource_quota grpc_resource_quota; typedef struct grpc_resource_quota grpc_resource_quota;

@ -42,8 +42,8 @@ typedef struct grpc_slice grpc_slice;
constraints (is the callee allowed to modify the slice?) */ constraints (is the callee allowed to modify the slice?) */
typedef struct grpc_slice_refcount_vtable { typedef struct grpc_slice_refcount_vtable {
void (*ref)(void *); void (*ref)(void*);
void (*unref)(grpc_exec_ctx *exec_ctx, void *); void (*unref)(grpc_exec_ctx* exec_ctx, void*);
int (*eq)(grpc_slice a, grpc_slice b); int (*eq)(grpc_slice a, grpc_slice b);
uint32_t (*hash)(grpc_slice slice); uint32_t (*hash)(grpc_slice slice);
} grpc_slice_refcount_vtable; } grpc_slice_refcount_vtable;
@ -54,20 +54,20 @@ typedef struct grpc_slice_refcount_vtable {
Typically client code should not touch this, and use grpc_slice_malloc, Typically client code should not touch this, and use grpc_slice_malloc,
grpc_slice_new, or grpc_slice_new_with_len instead. */ grpc_slice_new, or grpc_slice_new_with_len instead. */
typedef struct grpc_slice_refcount { typedef struct grpc_slice_refcount {
const grpc_slice_refcount_vtable *vtable; const grpc_slice_refcount_vtable* vtable;
/** If a subset of this slice is taken, use this pointer for the refcount. /** If a subset of this slice is taken, use this pointer for the refcount.
Typically points back to the refcount itself, however iterning Typically points back to the refcount itself, however iterning
implementations can use this to avoid a verification step on each hash implementations can use this to avoid a verification step on each hash
or equality check */ or equality check */
struct grpc_slice_refcount *sub_refcount; struct grpc_slice_refcount* sub_refcount;
} grpc_slice_refcount; } grpc_slice_refcount;
/* Inlined half of grpc_slice is allowed to expand the size of the overall type /* Inlined half of grpc_slice is allowed to expand the size of the overall type
by this many bytes */ by this many bytes */
#define GRPC_SLICE_INLINE_EXTRA_SIZE sizeof(void *) #define GRPC_SLICE_INLINE_EXTRA_SIZE sizeof(void*)
#define GRPC_SLICE_INLINED_SIZE \ #define GRPC_SLICE_INLINED_SIZE \
(sizeof(size_t) + sizeof(uint8_t *) - 1 + GRPC_SLICE_INLINE_EXTRA_SIZE) (sizeof(size_t) + sizeof(uint8_t*) - 1 + GRPC_SLICE_INLINE_EXTRA_SIZE)
/** A grpc_slice s, if initialized, represents the byte range /** A grpc_slice s, if initialized, represents the byte range
s.bytes[0..s.length-1]. s.bytes[0..s.length-1].
@ -79,10 +79,10 @@ typedef struct grpc_slice_refcount {
If the slice does not have a refcount, it represents an inlined small piece If the slice does not have a refcount, it represents an inlined small piece
of data that is copied by value. */ of data that is copied by value. */
struct grpc_slice { struct grpc_slice {
struct grpc_slice_refcount *refcount; struct grpc_slice_refcount* refcount;
union grpc_slice_data { union grpc_slice_data {
struct grpc_slice_refcounted { struct grpc_slice_refcounted {
uint8_t *bytes; uint8_t* bytes;
size_t length; size_t length;
} refcounted; } refcounted;
struct grpc_slice_inlined { struct grpc_slice_inlined {
@ -99,10 +99,10 @@ struct grpc_slice {
typedef struct { typedef struct {
/** This is for internal use only. External users (i.e any code outside grpc /** This is for internal use only. External users (i.e any code outside grpc
* core) MUST NOT use this field */ * core) MUST NOT use this field */
grpc_slice *base_slices; grpc_slice* base_slices;
/** slices in the array (Points to the first valid grpc_slice in the array) */ /** slices in the array (Points to the first valid grpc_slice in the array) */
grpc_slice *slices; grpc_slice* slices;
/** the number of slices in the array */ /** the number of slices in the array */
size_t count; size_t count;
/** the number of slices allocated in the array. External users (i.e any code /** the number of slices allocated in the array. External users (i.e any code

@ -23,16 +23,22 @@
#include <grpc/impl/codegen/atm.h> #include <grpc/impl/codegen/atm.h>
/* gpr_event */ /* gpr_event */
typedef struct { gpr_atm state; } gpr_event; typedef struct {
gpr_atm state;
} gpr_event;
#define GPR_EVENT_INIT \ #define GPR_EVENT_INIT \
{ 0 } { 0 }
/* gpr_refcount */ /* gpr_refcount */
typedef struct { gpr_atm count; } gpr_refcount; typedef struct {
gpr_atm count;
} gpr_refcount;
/* gpr_stats_counter */ /* gpr_stats_counter */
typedef struct { gpr_atm value; } gpr_stats_counter; typedef struct {
gpr_atm value;
} gpr_stats_counter;
#define GPR_STATS_INIT \ #define GPR_STATS_INIT \
{ 0 } { 0 }

@ -44,20 +44,20 @@ GPRAPI grpc_slice grpc_slice_copy(grpc_slice s);
/** Create a slice pointing at some data. Calls malloc to allocate a refcount /** Create a slice pointing at some data. Calls malloc to allocate a refcount
for the object, and arranges that destroy will be called with the pointer for the object, and arranges that destroy will be called with the pointer
passed in at destruction. */ passed in at destruction. */
GPRAPI grpc_slice grpc_slice_new(void *p, size_t len, void (*destroy)(void *)); GPRAPI grpc_slice grpc_slice_new(void* p, size_t len, void (*destroy)(void*));
/** Equivalent to grpc_slice_new, but with a separate pointer that is /** Equivalent to grpc_slice_new, but with a separate pointer that is
passed to the destroy function. This function can be useful when passed to the destroy function. This function can be useful when
the data is part of a larger structure that must be destroyed when the data is part of a larger structure that must be destroyed when
the data is no longer needed. */ the data is no longer needed. */
GPRAPI grpc_slice grpc_slice_new_with_user_data(void *p, size_t len, GPRAPI grpc_slice grpc_slice_new_with_user_data(void* p, size_t len,
void (*destroy)(void *), void (*destroy)(void*),
void *user_data); void* user_data);
/** Equivalent to grpc_slice_new, but with a two argument destroy function that /** Equivalent to grpc_slice_new, but with a two argument destroy function that
also takes the slice length. */ also takes the slice length. */
GPRAPI grpc_slice grpc_slice_new_with_len(void *p, size_t len, GPRAPI grpc_slice grpc_slice_new_with_len(void* p, size_t len,
void (*destroy)(void *, size_t)); void (*destroy)(void*, size_t));
/** Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc() /** Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc()
call. call.
@ -79,19 +79,19 @@ GPRAPI grpc_slice grpc_slice_intern(grpc_slice slice);
size_t len = strlen(source); size_t len = strlen(source);
grpc_slice slice = grpc_slice_malloc(len); grpc_slice slice = grpc_slice_malloc(len);
memcpy(slice->data, source, len); */ memcpy(slice->data, source, len); */
GPRAPI grpc_slice grpc_slice_from_copied_string(const char *source); GPRAPI grpc_slice grpc_slice_from_copied_string(const char* source);
/** Create a slice by copying a buffer. /** Create a slice by copying a buffer.
Equivalent to: Equivalent to:
grpc_slice slice = grpc_slice_malloc(len); grpc_slice slice = grpc_slice_malloc(len);
memcpy(slice->data, source, len); */ memcpy(slice->data, source, len); */
GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char *source, size_t len); GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t len);
/** Create a slice pointing to constant memory */ /** Create a slice pointing to constant memory */
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source); GPRAPI grpc_slice grpc_slice_from_static_string(const char* source);
/** Create a slice pointing to constant memory */ /** Create a slice pointing to constant memory */
GPRAPI grpc_slice grpc_slice_from_static_buffer(const void *source, size_t len); GPRAPI grpc_slice grpc_slice_from_static_buffer(const void* source, size_t len);
/** Return a result slice derived from s, which shares a ref count with \a s, /** Return a result slice derived from s, which shares a ref count with \a s,
where result.data==s.data+begin, and result.length==end-begin. The ref count where result.data==s.data+begin, and result.length==end-begin. The ref count
@ -106,7 +106,7 @@ GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end);
/** Splits s into two: modifies s to be s[0:split], and returns a new slice, /** Splits s into two: modifies s to be s[0:split], and returns a new slice,
sharing a refcount with s, that contains s[split:s.length]. sharing a refcount with s, that contains s[split:s.length].
Requires s intialized, split <= s.length */ Requires s intialized, split <= s.length */
GPRAPI grpc_slice grpc_slice_split_tail(grpc_slice *s, size_t split); GPRAPI grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split);
typedef enum { typedef enum {
GRPC_SLICE_REF_TAIL = 1, GRPC_SLICE_REF_TAIL = 1,
@ -117,13 +117,13 @@ typedef enum {
/** The same as grpc_slice_split_tail, but with an option to skip altering /** The same as grpc_slice_split_tail, but with an option to skip altering
* refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to * refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to
* grpc_slice_split_tail(...)) */ * grpc_slice_split_tail(...)) */
GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice *s, size_t split, GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice* s, size_t split,
grpc_slice_ref_whom ref_whom); grpc_slice_ref_whom ref_whom);
/** Splits s into two: modifies s to be s[split:s.length], and returns a new /** Splits s into two: modifies s to be s[split:s.length], and returns a new
slice, sharing a refcount with s, that contains s[0:split]. slice, sharing a refcount with s, that contains s[0:split].
Requires s intialized, split <= s.length */ Requires s intialized, split <= s.length */
GPRAPI grpc_slice grpc_slice_split_head(grpc_slice *s, size_t split); GPRAPI grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split);
GPRAPI grpc_slice grpc_empty_slice(void); GPRAPI grpc_slice grpc_empty_slice(void);
@ -136,11 +136,10 @@ GPRAPI int grpc_slice_eq(grpc_slice a, grpc_slice b);
The order is arbitrary, and is not guaranteed to be stable across different The order is arbitrary, and is not guaranteed to be stable across different
versions of the API. */ versions of the API. */
GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b); GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b);
GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char *b); GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char* b);
GPRAPI int grpc_slice_buf_cmp(grpc_slice a, const void *b, size_t blen);
/** return non-zero if the first blen bytes of a are equal to b */ /** return non-zero if the first blen bytes of a are equal to b */
GPRAPI int grpc_slice_buf_start_eq(grpc_slice a, const void *b, size_t blen); GPRAPI int grpc_slice_buf_start_eq(grpc_slice a, const void* b, size_t blen);
/** return the index of the last instance of \a c in \a s, or -1 if not found */ /** return the index of the last instance of \a c in \a s, or -1 if not found */
GPRAPI int grpc_slice_rchr(grpc_slice s, char c); GPRAPI int grpc_slice_rchr(grpc_slice s, char c);
@ -162,7 +161,7 @@ GPRAPI grpc_slice grpc_slice_dup(grpc_slice a);
/** Return a copy of slice as a C string. Offers no protection against embedded /** Return a copy of slice as a C string. Offers no protection against embedded
NULL's. Returned string must be freed with gpr_free. */ NULL's. Returned string must be freed with gpr_free. */
GPRAPI char *grpc_slice_to_c_string(grpc_slice s); GPRAPI char* grpc_slice_to_c_string(grpc_slice s);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -26,13 +26,13 @@ extern "C" {
#endif #endif
/** initialize a slice buffer */ /** initialize a slice buffer */
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer *sb); GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer* sb);
/** destroy a slice buffer - unrefs any held elements */ /** destroy a slice buffer - unrefs any held elements */
GPRAPI void grpc_slice_buffer_destroy(grpc_slice_buffer *sb); GPRAPI void grpc_slice_buffer_destroy(grpc_slice_buffer* sb);
/** Add an element to a slice buffer - takes ownership of the slice. /** Add an element to a slice buffer - takes ownership of the slice.
This function is allowed to concatenate the passed in slice to the end of This function is allowed to concatenate the passed in slice to the end of
some other slice if desired by the slice buffer. */ some other slice if desired by the slice buffer. */
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice); GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice);
/** add an element to a slice buffer - takes ownership of the slice and returns /** add an element to a slice buffer - takes ownership of the slice and returns
the index of the slice. the index of the slice.
Guarantees that the slice will not be concatenated at the end of another Guarantees that the slice will not be concatenated at the end of another
@ -40,40 +40,40 @@ GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice);
slice at the returned index in sb->slices) slice at the returned index in sb->slices)
The implementation MAY decide to concatenate data at the end of a small The implementation MAY decide to concatenate data at the end of a small
slice added in this fashion. */ slice added in this fashion. */
GPRAPI size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer *sb, GPRAPI size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer* sb,
grpc_slice slice); grpc_slice slice);
GPRAPI void grpc_slice_buffer_addn(grpc_slice_buffer *sb, grpc_slice *slices, GPRAPI void grpc_slice_buffer_addn(grpc_slice_buffer* sb, grpc_slice* slices,
size_t n); size_t n);
/** add a very small (less than 8 bytes) amount of data to the end of a slice /** add a very small (less than 8 bytes) amount of data to the end of a slice
buffer: returns a pointer into which to add the data */ buffer: returns a pointer into which to add the data */
GPRAPI uint8_t *grpc_slice_buffer_tiny_add(grpc_slice_buffer *sb, size_t len); GPRAPI uint8_t* grpc_slice_buffer_tiny_add(grpc_slice_buffer* sb, size_t len);
/** pop the last buffer, but don't unref it */ /** pop the last buffer, but don't unref it */
GPRAPI void grpc_slice_buffer_pop(grpc_slice_buffer *sb); GPRAPI void grpc_slice_buffer_pop(grpc_slice_buffer* sb);
/** clear a slice buffer, unref all elements */ /** clear a slice buffer, unref all elements */
GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer *sb); GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer* sb);
/** swap the contents of two slice buffers */ /** swap the contents of two slice buffers */
GPRAPI void grpc_slice_buffer_swap(grpc_slice_buffer *a, grpc_slice_buffer *b); GPRAPI void grpc_slice_buffer_swap(grpc_slice_buffer* a, grpc_slice_buffer* b);
/** move all of the elements of src into dst */ /** move all of the elements of src into dst */
GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer *src, GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer* src,
grpc_slice_buffer *dst); grpc_slice_buffer* dst);
/** remove n bytes from the end of a slice buffer */ /** remove n bytes from the end of a slice buffer */
GPRAPI void grpc_slice_buffer_trim_end(grpc_slice_buffer *src, size_t n, GPRAPI void grpc_slice_buffer_trim_end(grpc_slice_buffer* src, size_t n,
grpc_slice_buffer *garbage); grpc_slice_buffer* garbage);
/** move the first n bytes of src into dst */ /** move the first n bytes of src into dst */
GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer *src, size_t n, GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer* src, size_t n,
grpc_slice_buffer *dst); grpc_slice_buffer* dst);
/** move the first n bytes of src into dst without adding references */ /** move the first n bytes of src into dst without adding references */
GPRAPI void grpc_slice_buffer_move_first_no_ref(grpc_slice_buffer *src, GPRAPI void grpc_slice_buffer_move_first_no_ref(grpc_slice_buffer* src,
size_t n, size_t n,
grpc_slice_buffer *dst); grpc_slice_buffer* dst);
/** move the first n bytes of src into dst (copying them) */ /** move the first n bytes of src into dst (copying them) */
GPRAPI void grpc_slice_buffer_move_first_into_buffer(grpc_exec_ctx *exec_ctx, GPRAPI void grpc_slice_buffer_move_first_into_buffer(grpc_exec_ctx* exec_ctx,
grpc_slice_buffer *src, grpc_slice_buffer* src,
size_t n, void *dst); size_t n, void* dst);
/** take the first slice in the slice buffer */ /** take the first slice in the slice buffer */
GPRAPI grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer *src); GPRAPI grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer* src);
/** undo the above with (a possibly different) \a slice */ /** undo the above with (a possibly different) \a slice */
GPRAPI void grpc_slice_buffer_undo_take_first(grpc_slice_buffer *src, GPRAPI void grpc_slice_buffer_undo_take_first(grpc_slice_buffer* src,
grpc_slice slice); grpc_slice slice);
#ifdef __cplusplus #ifdef __cplusplus

@ -28,10 +28,10 @@ extern "C" {
#endif #endif
typedef struct gpr_allocation_functions { typedef struct gpr_allocation_functions {
void *(*malloc_fn)(size_t size); void* (*malloc_fn)(size_t size);
void *(*zalloc_fn)(size_t size); /** if NULL, uses malloc_fn then memset */ void* (*zalloc_fn)(size_t size); /** if NULL, uses malloc_fn then memset */
void *(*realloc_fn)(void *ptr, size_t size); void* (*realloc_fn)(void* ptr, size_t size);
void (*free_fn)(void *ptr); void (*free_fn)(void* ptr);
} gpr_allocation_functions; } gpr_allocation_functions;
/** malloc. /** malloc.
@ -39,17 +39,17 @@ typedef struct gpr_allocation_functions {
* The pointer returned is suitably aligned for any kind of variable it could * The pointer returned is suitably aligned for any kind of variable it could
* contain. * contain.
*/ */
GPRAPI void *gpr_malloc(size_t size); GPRAPI void* gpr_malloc(size_t size);
/** like malloc, but zero all bytes before returning them */ /** like malloc, but zero all bytes before returning them */
GPRAPI void *gpr_zalloc(size_t size); GPRAPI void* gpr_zalloc(size_t size);
/** free */ /** free */
GPRAPI void gpr_free(void *ptr); GPRAPI void gpr_free(void* ptr);
/** realloc, never returns NULL */ /** realloc, never returns NULL */
GPRAPI void *gpr_realloc(void *p, size_t size); GPRAPI void* gpr_realloc(void* p, size_t size);
/** aligned malloc, never returns NULL, will align to 1 << alignment_log */ /** aligned malloc, never returns NULL, will align to 1 << alignment_log */
GPRAPI void *gpr_malloc_aligned(size_t size, size_t alignment_log); GPRAPI void* gpr_malloc_aligned(size_t size, size_t alignment_log);
/** free memory allocated by gpr_malloc_aligned */ /** free memory allocated by gpr_malloc_aligned */
GPRAPI void gpr_free_aligned(void *ptr); GPRAPI void gpr_free_aligned(void* ptr);
/** Request the family of allocation functions in \a functions be used. NOTE /** Request the family of allocation functions in \a functions be used. NOTE
* that this request will be honored in a *best effort* basis and that no * that this request will be honored in a *best effort* basis and that no

@ -28,10 +28,10 @@ extern "C" {
/** internal node of an AVL tree */ /** internal node of an AVL tree */
typedef struct gpr_avl_node { typedef struct gpr_avl_node {
gpr_refcount refs; gpr_refcount refs;
void *key; void* key;
void *value; void* value;
struct gpr_avl_node *left; struct gpr_avl_node* left;
struct gpr_avl_node *right; struct gpr_avl_node* right;
long height; long height;
} gpr_avl_node; } gpr_avl_node;
@ -42,56 +42,56 @@ typedef struct gpr_avl_node {
*/ */
typedef struct gpr_avl_vtable { typedef struct gpr_avl_vtable {
/** destroy a key */ /** destroy a key */
void (*destroy_key)(void *key, void *user_data); void (*destroy_key)(void* key, void* user_data);
/** copy a key, returning new value */ /** copy a key, returning new value */
void *(*copy_key)(void *key, void *user_data); void* (*copy_key)(void* key, void* user_data);
/** compare key1, key2; return <0 if key1 < key2, /** compare key1, key2; return <0 if key1 < key2,
>0 if key1 > key2, 0 if key1 == key2 */ >0 if key1 > key2, 0 if key1 == key2 */
long (*compare_keys)(void *key1, void *key2, void *user_data); long (*compare_keys)(void* key1, void* key2, void* user_data);
/** destroy a value */ /** destroy a value */
void (*destroy_value)(void *value, void *user_data); void (*destroy_value)(void* value, void* user_data);
/** copy a value */ /** copy a value */
void *(*copy_value)(void *value, void *user_data); void* (*copy_value)(void* value, void* user_data);
} gpr_avl_vtable; } gpr_avl_vtable;
/** "pointer" to an AVL tree - this is a reference /** "pointer" to an AVL tree - this is a reference
counted object - use gpr_avl_ref to add a reference, counted object - use gpr_avl_ref to add a reference,
gpr_avl_unref when done with a reference */ gpr_avl_unref when done with a reference */
typedef struct gpr_avl { typedef struct gpr_avl {
const gpr_avl_vtable *vtable; const gpr_avl_vtable* vtable;
gpr_avl_node *root; gpr_avl_node* root;
} gpr_avl; } gpr_avl;
/** Create an immutable AVL tree. */ /** Create an immutable AVL tree. */
GPRAPI gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable); GPRAPI gpr_avl gpr_avl_create(const gpr_avl_vtable* vtable);
/** Add a reference to an existing tree - returns /** Add a reference to an existing tree - returns
the tree as a convenience. The optional user_data will be passed to vtable the tree as a convenience. The optional user_data will be passed to vtable
functions. */ functions. */
GPRAPI gpr_avl gpr_avl_ref(gpr_avl avl, void *user_data); GPRAPI gpr_avl gpr_avl_ref(gpr_avl avl, void* user_data);
/** Remove a reference to a tree - destroying it if there /** Remove a reference to a tree - destroying it if there
are no references left. The optional user_data will be passed to vtable are no references left. The optional user_data will be passed to vtable
functions. */ functions. */
GPRAPI void gpr_avl_unref(gpr_avl avl, void *user_data); GPRAPI void gpr_avl_unref(gpr_avl avl, void* user_data);
/** Return a new tree with (key, value) added to avl. /** Return a new tree with (key, value) added to avl.
implicitly unrefs avl to allow easy chaining. implicitly unrefs avl to allow easy chaining.
if key exists in avl, the new tree's key entry updated if key exists in avl, the new tree's key entry updated
(i.e. a duplicate is not created). The optional user_data will be passed to (i.e. a duplicate is not created). The optional user_data will be passed to
vtable functions. */ vtable functions. */
GPRAPI gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value, GPRAPI gpr_avl gpr_avl_add(gpr_avl avl, void* key, void* value,
void *user_data); void* user_data);
/** Return a new tree with key deleted /** Return a new tree with key deleted
implicitly unrefs avl to allow easy chaining. The optional user_data will be implicitly unrefs avl to allow easy chaining. The optional user_data will be
passed to vtable functions. */ passed to vtable functions. */
GPRAPI gpr_avl gpr_avl_remove(gpr_avl avl, void *key, void *user_data); GPRAPI gpr_avl gpr_avl_remove(gpr_avl avl, void* key, void* user_data);
/** Lookup key, and return the associated value. /** Lookup key, and return the associated value.
Does not mutate avl. Does not mutate avl.
Returns NULL if key is not found. The optional user_data will be passed to Returns NULL if key is not found. The optional user_data will be passed to
vtable functions.*/ vtable functions.*/
GPRAPI void *gpr_avl_get(gpr_avl avl, void *key, void *user_data); GPRAPI void* gpr_avl_get(gpr_avl avl, void* key, void* user_data);
/** Return 1 if avl contains key, 0 otherwise; if it has the key, sets *value to /** Return 1 if avl contains key, 0 otherwise; if it has the key, sets *value to
its value. THe optional user_data will be passed to vtable functions. */ its value. THe optional user_data will be passed to vtable functions. */
GPRAPI int gpr_avl_maybe_get(gpr_avl avl, void *key, void **value, GPRAPI int gpr_avl_maybe_get(gpr_avl avl, void* key, void** value,
void *user_data); void* user_data);
/** Return 1 if avl is empty, 0 otherwise */ /** Return 1 if avl is empty, 0 otherwise */
GPRAPI int gpr_avl_is_empty(gpr_avl avl); GPRAPI int gpr_avl_is_empty(gpr_avl avl);

@ -55,31 +55,31 @@ typedef struct gpr_cmdline gpr_cmdline;
/** Construct a command line parser: takes a short description of the tool /** Construct a command line parser: takes a short description of the tool
doing the parsing */ doing the parsing */
GPRAPI gpr_cmdline *gpr_cmdline_create(const char *description); GPRAPI gpr_cmdline* gpr_cmdline_create(const char* description);
/** Add an integer parameter, with a name (used on the command line) and some /** Add an integer parameter, with a name (used on the command line) and some
helpful text (used in the command usage) */ helpful text (used in the command usage) */
GPRAPI void gpr_cmdline_add_int(gpr_cmdline *cl, const char *name, GPRAPI void gpr_cmdline_add_int(gpr_cmdline* cl, const char* name,
const char *help, int *value); const char* help, int* value);
/** The same, for a boolean flag */ /** The same, for a boolean flag */
GPRAPI void gpr_cmdline_add_flag(gpr_cmdline *cl, const char *name, GPRAPI void gpr_cmdline_add_flag(gpr_cmdline* cl, const char* name,
const char *help, int *value); const char* help, int* value);
/** And for a string */ /** And for a string */
GPRAPI void gpr_cmdline_add_string(gpr_cmdline *cl, const char *name, GPRAPI void gpr_cmdline_add_string(gpr_cmdline* cl, const char* name,
const char *help, char **value); const char* help, const char** value);
/** Set a callback for non-named arguments */ /** Set a callback for non-named arguments */
GPRAPI void gpr_cmdline_on_extra_arg( GPRAPI void gpr_cmdline_on_extra_arg(
gpr_cmdline *cl, const char *name, const char *help, gpr_cmdline* cl, const char* name, const char* help,
void (*on_extra_arg)(void *user_data, const char *arg), void *user_data); void (*on_extra_arg)(void* user_data, const char* arg), void* user_data);
/** Enable surviving failure: default behavior is to exit the process */ /** Enable surviving failure: default behavior is to exit the process */
GPRAPI void gpr_cmdline_set_survive_failure(gpr_cmdline *cl); GPRAPI void gpr_cmdline_set_survive_failure(gpr_cmdline* cl);
/** Parse the command line; returns 1 on success, on failure either dies /** Parse the command line; returns 1 on success, on failure either dies
(by default) or returns 0 if gpr_cmdline_set_survive_failure() has been (by default) or returns 0 if gpr_cmdline_set_survive_failure() has been
called */ called */
GPRAPI int gpr_cmdline_parse(gpr_cmdline *cl, int argc, char **argv); GPRAPI int gpr_cmdline_parse(gpr_cmdline* cl, int argc, char** argv);
/** Destroy the parser */ /** Destroy the parser */
GPRAPI void gpr_cmdline_destroy(gpr_cmdline *cl); GPRAPI void gpr_cmdline_destroy(gpr_cmdline* cl);
/** Get a string describing usage */ /** Get a string describing usage */
GPRAPI char *gpr_cmdline_usage_string(gpr_cmdline *cl, const char *argv0); GPRAPI char* gpr_cmdline_usage_string(gpr_cmdline* cl, const char* argv0);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -28,31 +28,31 @@ extern "C" {
typedef struct gpr_histogram gpr_histogram; typedef struct gpr_histogram gpr_histogram;
GPRAPI gpr_histogram *gpr_histogram_create(double resolution, GPRAPI gpr_histogram* gpr_histogram_create(double resolution,
double max_bucket_start); double max_bucket_start);
GPRAPI void gpr_histogram_destroy(gpr_histogram *h); GPRAPI void gpr_histogram_destroy(gpr_histogram* h);
GPRAPI void gpr_histogram_add(gpr_histogram *h, double x); GPRAPI void gpr_histogram_add(gpr_histogram* h, double x);
/** The following merges the second histogram into the first. It only works /** The following merges the second histogram into the first. It only works
if they have the same buckets and resolution. Returns 0 on failure, 1 if they have the same buckets and resolution. Returns 0 on failure, 1
on success */ on success */
GPRAPI int gpr_histogram_merge(gpr_histogram *dst, const gpr_histogram *src); GPRAPI int gpr_histogram_merge(gpr_histogram* dst, const gpr_histogram* src);
GPRAPI double gpr_histogram_percentile(gpr_histogram *histogram, GPRAPI double gpr_histogram_percentile(gpr_histogram* histogram,
double percentile); double percentile);
GPRAPI double gpr_histogram_mean(gpr_histogram *histogram); GPRAPI double gpr_histogram_mean(gpr_histogram* histogram);
GPRAPI double gpr_histogram_stddev(gpr_histogram *histogram); GPRAPI double gpr_histogram_stddev(gpr_histogram* histogram);
GPRAPI double gpr_histogram_variance(gpr_histogram *histogram); GPRAPI double gpr_histogram_variance(gpr_histogram* histogram);
GPRAPI double gpr_histogram_maximum(gpr_histogram *histogram); GPRAPI double gpr_histogram_maximum(gpr_histogram* histogram);
GPRAPI double gpr_histogram_minimum(gpr_histogram *histogram); GPRAPI double gpr_histogram_minimum(gpr_histogram* histogram);
GPRAPI double gpr_histogram_count(gpr_histogram *histogram); GPRAPI double gpr_histogram_count(gpr_histogram* histogram);
GPRAPI double gpr_histogram_sum(gpr_histogram *histogram); GPRAPI double gpr_histogram_sum(gpr_histogram* histogram);
GPRAPI double gpr_histogram_sum_of_squares(gpr_histogram *histogram); GPRAPI double gpr_histogram_sum_of_squares(gpr_histogram* histogram);
GPRAPI const uint32_t *gpr_histogram_get_contents(gpr_histogram *histogram, GPRAPI const uint32_t* gpr_histogram_get_contents(gpr_histogram* histogram,
size_t *count); size_t* count);
GPRAPI void gpr_histogram_merge_contents(gpr_histogram *histogram, GPRAPI void gpr_histogram_merge_contents(gpr_histogram* histogram,
const uint32_t *data, const uint32_t* data,
size_t data_count, double min_seen, size_t data_count, double min_seen,
double max_seen, double sum, double max_seen, double sum,
double sum_of_squares, double count); double sum_of_squares, double count);

@ -35,14 +35,14 @@ extern "C" {
destroyed using gpr_free(). destroyed using gpr_free().
In the unlikely event of an error, returns -1 and sets *out to NULL. */ In the unlikely event of an error, returns -1 and sets *out to NULL. */
GPRAPI int gpr_join_host_port(char **out, const char *host, int port); GPRAPI int gpr_join_host_port(char** out, const char* host, int port);
/** Given a name in the form "host:port" or "[ho:st]:port", split into hostname /** Given a name in the form "host:port" or "[ho:st]:port", split into hostname
and port number, into newly allocated strings, which must later be and port number, into newly allocated strings, which must later be
destroyed using gpr_free(). destroyed using gpr_free().
Return 1 on success, 0 on failure. Guarantees *host and *port == NULL on Return 1 on success, 0 on failure. Guarantees *host and *port == NULL on
failure. */ failure. */
GPRAPI int gpr_split_host_port(const char *name, char **host, char **port); GPRAPI int gpr_split_host_port(const char* name, char** host, char** port);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -50,7 +50,7 @@ typedef enum gpr_log_severity {
#define GPR_LOG_VERBOSITY_UNSET -1 #define GPR_LOG_VERBOSITY_UNSET -1
/** Returns a string representation of the log severity */ /** Returns a string representation of the log severity */
GPRAPI const char *gpr_log_severity_string(gpr_log_severity severity); GPRAPI const char* gpr_log_severity_string(gpr_log_severity severity);
/** Macros to build log contexts at various severity levels */ /** Macros to build log contexts at various severity levels */
#define GPR_DEBUG __FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG #define GPR_DEBUG __FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG
@ -59,11 +59,11 @@ GPRAPI const char *gpr_log_severity_string(gpr_log_severity severity);
/** Log a message. It's advised to use GPR_xxx above to generate the context /** Log a message. It's advised to use GPR_xxx above to generate the context
* for each message */ * for each message */
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, GPRAPI void gpr_log(const char* file, int line, gpr_log_severity severity,
const char *format, ...) GPR_PRINT_FORMAT_CHECK(4, 5); const char* format, ...) GPR_PRINT_FORMAT_CHECK(4, 5);
GPRAPI void gpr_log_message(const char *file, int line, GPRAPI void gpr_log_message(const char* file, int line,
gpr_log_severity severity, const char *message); gpr_log_severity severity, const char* message);
/** Set global log verbosity */ /** Set global log verbosity */
GPRAPI void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print); GPRAPI void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print);
@ -74,13 +74,13 @@ GPRAPI void gpr_log_verbosity_init();
and use their own implementations */ and use their own implementations */
typedef struct { typedef struct {
const char *file; const char* file;
int line; int line;
gpr_log_severity severity; gpr_log_severity severity;
const char *message; const char* message;
} gpr_log_func_args; } gpr_log_func_args;
typedef void (*gpr_log_func)(gpr_log_func_args *args); typedef void (*gpr_log_func)(gpr_log_func_args* args);
GPRAPI void gpr_set_log_function(gpr_log_func func); GPRAPI void gpr_set_log_function(gpr_log_func func);
/** abort() the process if x is zero, having written a line to the log. /** abort() the process if x is zero, having written a line to the log.

@ -29,7 +29,7 @@ extern "C" {
* formatted error message, corresponding to the error messageid. * formatted error message, corresponding to the error messageid.
* Use in conjunction with GetLastError() et al. * Use in conjunction with GetLastError() et al.
*/ */
GPRAPI char *gpr_format_message(int messageid); GPRAPI char* gpr_format_message(int messageid);
#ifdef __cplusplus #ifdef __cplusplus
} }

@ -29,7 +29,7 @@ extern "C" {
/** Returns a copy of src that can be passed to gpr_free(). /** Returns a copy of src that can be passed to gpr_free().
If allocation fails or if src is NULL, returns NULL. */ If allocation fails or if src is NULL, returns NULL. */
GPRAPI char *gpr_strdup(const char *src); GPRAPI char* gpr_strdup(const char* src);
/** printf to a newly-allocated string. The set of supported formats may vary /** printf to a newly-allocated string. The set of supported formats may vary
between platforms. between platforms.
@ -39,7 +39,7 @@ GPRAPI char *gpr_strdup(const char *src);
On error, returns -1 and sets *strp to NULL. If the format string is bad, On error, returns -1 and sets *strp to NULL. If the format string is bad,
the result is undefined. */ the result is undefined. */
GPRAPI int gpr_asprintf(char **strp, const char *format, ...) GPRAPI int gpr_asprintf(char** strp, const char* format, ...)
GPR_PRINT_FORMAT_CHECK(2, 3); GPR_PRINT_FORMAT_CHECK(2, 3);
#ifdef __cplusplus #ifdef __cplusplus

@ -28,14 +28,14 @@ extern "C" {
typedef struct gpr_subprocess gpr_subprocess; typedef struct gpr_subprocess gpr_subprocess;
/** .exe on windows, empty on unices */ /** .exe on windows, empty on unices */
GPRAPI const char *gpr_subprocess_binary_extension(); GPRAPI const char* gpr_subprocess_binary_extension();
GPRAPI gpr_subprocess *gpr_subprocess_create(int argc, const char **argv); GPRAPI gpr_subprocess* gpr_subprocess_create(int argc, const char** argv);
/** if subprocess has not been joined, kill it */ /** if subprocess has not been joined, kill it */
GPRAPI void gpr_subprocess_destroy(gpr_subprocess *p); GPRAPI void gpr_subprocess_destroy(gpr_subprocess* p);
/** returns exit status; can be called at most once */ /** returns exit status; can be called at most once */
GPRAPI int gpr_subprocess_join(gpr_subprocess *p); GPRAPI int gpr_subprocess_join(gpr_subprocess* p);
GPRAPI void gpr_subprocess_interrupt(gpr_subprocess *p); GPRAPI void gpr_subprocess_interrupt(gpr_subprocess* p);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"

@ -34,26 +34,26 @@ extern "C" {
gpr_mu are uninitialized when first declared. */ gpr_mu are uninitialized when first declared. */
/** Initialize *mu. Requires: *mu uninitialized. */ /** Initialize *mu. Requires: *mu uninitialized. */
GPRAPI void gpr_mu_init(gpr_mu *mu); GPRAPI void gpr_mu_init(gpr_mu* mu);
/** Cause *mu no longer to be initialized, freeing any memory in use. Requires: /** Cause *mu no longer to be initialized, freeing any memory in use. Requires:
*mu initialized; no other concurrent operation on *mu. */ *mu initialized; no other concurrent operation on *mu. */
GPRAPI void gpr_mu_destroy(gpr_mu *mu); GPRAPI void gpr_mu_destroy(gpr_mu* mu);
/** Wait until no thread has a lock on *mu, cause the calling thread to own an /** Wait until no thread has a lock on *mu, cause the calling thread to own an
exclusive lock on *mu, then return. May block indefinitely or crash if the exclusive lock on *mu, then return. May block indefinitely or crash if the
calling thread has a lock on *mu. Requires: *mu initialized. */ calling thread has a lock on *mu. Requires: *mu initialized. */
GPRAPI void gpr_mu_lock(gpr_mu *mu); GPRAPI void gpr_mu_lock(gpr_mu* mu);
/** Release an exclusive lock on *mu held by the calling thread. Requires: *mu /** Release an exclusive lock on *mu held by the calling thread. Requires: *mu
initialized; the calling thread holds an exclusive lock on *mu. */ initialized; the calling thread holds an exclusive lock on *mu. */
GPRAPI void gpr_mu_unlock(gpr_mu *mu); GPRAPI void gpr_mu_unlock(gpr_mu* mu);
/** Without blocking, attempt to acquire an exclusive lock on *mu for the /** Without blocking, attempt to acquire an exclusive lock on *mu for the
calling thread, then return non-zero iff success. Fail, if any thread holds calling thread, then return non-zero iff success. Fail, if any thread holds
the lock; succeeds with high probability if no thread holds the lock. the lock; succeeds with high probability if no thread holds the lock.
Requires: *mu initialized. */ Requires: *mu initialized. */
GPRAPI int gpr_mu_trylock(gpr_mu *mu); GPRAPI int gpr_mu_trylock(gpr_mu* mu);
/** --- Condition variable interface --- /** --- Condition variable interface ---
@ -62,11 +62,11 @@ GPRAPI int gpr_mu_trylock(gpr_mu *mu);
uninitialized when first declared. */ uninitialized when first declared. */
/** Initialize *cv. Requires: *cv uninitialized. */ /** Initialize *cv. Requires: *cv uninitialized. */
GPRAPI void gpr_cv_init(gpr_cv *cv); GPRAPI void gpr_cv_init(gpr_cv* cv);
/** Cause *cv no longer to be initialized, freeing any memory in use. Requires: /** Cause *cv no longer to be initialized, freeing any memory in use. Requires:
*cv initialized; no other concurrent operation on *cv.*/ *cv initialized; no other concurrent operation on *cv.*/
GPRAPI void gpr_cv_destroy(gpr_cv *cv); GPRAPI void gpr_cv_destroy(gpr_cv* cv);
/** Atomically release *mu and wait on *cv. When the calling thread is woken /** Atomically release *mu and wait on *cv. When the calling thread is woken
from *cv or the deadline abs_deadline is exceeded, execute gpr_mu_lock(mu) from *cv or the deadline abs_deadline is exceeded, execute gpr_mu_lock(mu)
@ -75,16 +75,16 @@ GPRAPI void gpr_cv_destroy(gpr_cv *cv);
an absolute deadline, or a GPR_TIMESPAN. May return even when not an absolute deadline, or a GPR_TIMESPAN. May return even when not
woken explicitly. Requires: *mu and *cv initialized; the calling thread woken explicitly. Requires: *mu and *cv initialized; the calling thread
holds an exclusive lock on *mu. */ holds an exclusive lock on *mu. */
GPRAPI int gpr_cv_wait(gpr_cv *cv, gpr_mu *mu, gpr_timespec abs_deadline); GPRAPI int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline);
/** If any threads are waiting on *cv, wake at least one. /** If any threads are waiting on *cv, wake at least one.
Clients may treat this as an optimization of gpr_cv_broadcast() Clients may treat this as an optimization of gpr_cv_broadcast()
for use in the case where waking more than one waiter is not useful. for use in the case where waking more than one waiter is not useful.
Requires: *cv initialized. */ Requires: *cv initialized. */
GPRAPI void gpr_cv_signal(gpr_cv *cv); GPRAPI void gpr_cv_signal(gpr_cv* cv);
/** Wake all threads waiting on *cv. Requires: *cv initialized. */ /** Wake all threads waiting on *cv. Requires: *cv initialized. */
GPRAPI void gpr_cv_broadcast(gpr_cv *cv); GPRAPI void gpr_cv_broadcast(gpr_cv* cv);
/** --- One-time initialization --- /** --- One-time initialization ---
@ -97,7 +97,7 @@ GPRAPI void gpr_cv_broadcast(gpr_cv *cv);
If multiple threads call gpr_once() on the same gpr_once instance, one of If multiple threads call gpr_once() on the same gpr_once instance, one of
them will call (*init_routine)(), and the others will block until that call them will call (*init_routine)(), and the others will block until that call
finishes.*/ finishes.*/
GPRAPI void gpr_once_init(gpr_once *once, void (*init_routine)(void)); GPRAPI void gpr_once_init(gpr_once* once, void (*init_routine)(void));
/** --- One-time event notification --- /** --- One-time event notification ---
@ -107,51 +107,51 @@ GPRAPI void gpr_once_init(gpr_once *once, void (*init_routine)(void));
It requires no destruction. */ It requires no destruction. */
/** Initialize *ev. */ /** Initialize *ev. */
GPRAPI void gpr_event_init(gpr_event *ev); GPRAPI void gpr_event_init(gpr_event* ev);
/** Set *ev so that gpr_event_get() and gpr_event_wait() will return value. /** Set *ev so that gpr_event_get() and gpr_event_wait() will return value.
Requires: *ev initialized; value != NULL; no prior or concurrent calls to Requires: *ev initialized; value != NULL; no prior or concurrent calls to
gpr_event_set(ev, ...) since initialization. */ gpr_event_set(ev, ...) since initialization. */
GPRAPI void gpr_event_set(gpr_event *ev, void *value); GPRAPI void gpr_event_set(gpr_event* ev, void* value);
/** Return the value set by gpr_event_set(ev, ...), or NULL if no such call has /** Return the value set by gpr_event_set(ev, ...), or NULL if no such call has
completed. If the result is non-NULL, all operations that occurred prior to completed. If the result is non-NULL, all operations that occurred prior to
the gpr_event_set(ev, ...) set will be visible after this call returns. the gpr_event_set(ev, ...) set will be visible after this call returns.
Requires: *ev initialized. This operation is faster than acquiring a mutex Requires: *ev initialized. This operation is faster than acquiring a mutex
on most platforms. */ on most platforms. */
GPRAPI void *gpr_event_get(gpr_event *ev); GPRAPI void* gpr_event_get(gpr_event* ev);
/** Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is /** Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is
exceeded, then return gpr_event_get(ev). Requires: *ev initialized. Use exceeded, then return gpr_event_get(ev). Requires: *ev initialized. Use
abs_deadline==gpr_inf_future for no deadline. When the event has been abs_deadline==gpr_inf_future for no deadline. When the event has been
signalled before the call, this operation is faster than acquiring a mutex signalled before the call, this operation is faster than acquiring a mutex
on most platforms. */ on most platforms. */
GPRAPI void *gpr_event_wait(gpr_event *ev, gpr_timespec abs_deadline); GPRAPI void* gpr_event_wait(gpr_event* ev, gpr_timespec abs_deadline);
/** --- Reference counting --- /** --- Reference counting ---
These calls act on the type gpr_refcount. It requires no destruction. */ These calls act on the type gpr_refcount. It requires no destruction. */
/** Initialize *r to value n. */ /** Initialize *r to value n. */
GPRAPI void gpr_ref_init(gpr_refcount *r, int n); GPRAPI void gpr_ref_init(gpr_refcount* r, int n);
/** Increment the reference count *r. Requires *r initialized. */ /** Increment the reference count *r. Requires *r initialized. */
GPRAPI void gpr_ref(gpr_refcount *r); GPRAPI void gpr_ref(gpr_refcount* r);
/** Increment the reference count *r. Requires *r initialized. /** Increment the reference count *r. Requires *r initialized.
Crashes if refcount is zero */ Crashes if refcount is zero */
GPRAPI void gpr_ref_non_zero(gpr_refcount *r); GPRAPI void gpr_ref_non_zero(gpr_refcount* r);
/** Increment the reference count *r by n. Requires *r initialized, n > 0. */ /** Increment the reference count *r by n. Requires *r initialized, n > 0. */
GPRAPI void gpr_refn(gpr_refcount *r, int n); GPRAPI void gpr_refn(gpr_refcount* r, int n);
/** Decrement the reference count *r and return non-zero iff it has reached /** Decrement the reference count *r and return non-zero iff it has reached
zero. . Requires *r initialized. */ zero. . Requires *r initialized. */
GPRAPI int gpr_unref(gpr_refcount *r); GPRAPI int gpr_unref(gpr_refcount* r);
/** Return non-zero iff the reference count of *r is one, and thus is owned /** Return non-zero iff the reference count of *r is one, and thus is owned
by exactly one object. */ by exactly one object. */
GPRAPI int gpr_ref_is_unique(gpr_refcount *r); GPRAPI int gpr_ref_is_unique(gpr_refcount* r);
/** --- Stats counters --- /** --- Stats counters ---
@ -162,13 +162,13 @@ GPRAPI int gpr_ref_is_unique(gpr_refcount *r);
synchronize other events. */ synchronize other events. */
/** Initialize *c to the value n. */ /** Initialize *c to the value n. */
GPRAPI void gpr_stats_init(gpr_stats_counter *c, intptr_t n); GPRAPI void gpr_stats_init(gpr_stats_counter* c, intptr_t n);
/** *c += inc. Requires: *c initialized. */ /** *c += inc. Requires: *c initialized. */
GPRAPI void gpr_stats_inc(gpr_stats_counter *c, intptr_t inc); GPRAPI void gpr_stats_inc(gpr_stats_counter* c, intptr_t inc);
/** Return *c. Requires: *c initialized. */ /** Return *c. Requires: *c initialized. */
GPRAPI intptr_t gpr_stats_read(const gpr_stats_counter *c); GPRAPI intptr_t gpr_stats_read(const gpr_stats_counter* c);
/** ==================Example use of interface=================== /** ==================Example use of interface===================
A producer-consumer queue of up to N integers, A producer-consumer queue of up to N integers,
@ -280,14 +280,14 @@ namespace grpc_core {
class mu_guard { class mu_guard {
public: public:
mu_guard(gpr_mu *mu) : mu_(mu) { gpr_mu_lock(mu); } mu_guard(gpr_mu* mu) : mu_(mu) { gpr_mu_lock(mu); }
~mu_guard() { gpr_mu_unlock(mu_); } ~mu_guard() { gpr_mu_unlock(mu_); }
mu_guard(const mu_guard &) = delete; mu_guard(const mu_guard&) = delete;
mu_guard &operator=(const mu_guard &) = delete; mu_guard& operator=(const mu_guard&) = delete;
private: private:
gpr_mu *const mu_; gpr_mu* const mu_;
}; };
} // namespace grpc_core } // namespace grpc_core

@ -44,23 +44,23 @@ typedef struct {
in *t, and return true. If there are insufficient resources, return false. in *t, and return true. If there are insufficient resources, return false.
If options==NULL, default options are used. If options==NULL, default options are used.
The thread is immediately runnable, and exits when (*thd_body)() returns. */ The thread is immediately runnable, and exits when (*thd_body)() returns. */
GPRAPI int gpr_thd_new(gpr_thd_id *t, void (*thd_body)(void *arg), void *arg, GPRAPI int gpr_thd_new(gpr_thd_id* t, void (*thd_body)(void* arg), void* arg,
const gpr_thd_options *options); const gpr_thd_options* options);
/** Return a gpr_thd_options struct with all fields set to defaults. */ /** Return a gpr_thd_options struct with all fields set to defaults. */
GPRAPI gpr_thd_options gpr_thd_options_default(void); GPRAPI gpr_thd_options gpr_thd_options_default(void);
/** Set the thread to become detached on startup - this is the default. */ /** Set the thread to become detached on startup - this is the default. */
GPRAPI void gpr_thd_options_set_detached(gpr_thd_options *options); GPRAPI void gpr_thd_options_set_detached(gpr_thd_options* options);
/** Set the thread to become joinable - mutually exclusive with detached. */ /** Set the thread to become joinable - mutually exclusive with detached. */
GPRAPI void gpr_thd_options_set_joinable(gpr_thd_options *options); GPRAPI void gpr_thd_options_set_joinable(gpr_thd_options* options);
/** Returns non-zero if the option detached is set. */ /** Returns non-zero if the option detached is set. */
GPRAPI int gpr_thd_options_is_detached(const gpr_thd_options *options); GPRAPI int gpr_thd_options_is_detached(const gpr_thd_options* options);
/** Returns non-zero if the option joinable is set. */ /** Returns non-zero if the option joinable is set. */
GPRAPI int gpr_thd_options_is_joinable(const gpr_thd_options *options); GPRAPI int gpr_thd_options_is_joinable(const gpr_thd_options* options);
/** Returns the identifier of the current thread. */ /** Returns the identifier of the current thread. */
GPRAPI gpr_thd_id gpr_thd_currentid(void); GPRAPI gpr_thd_id gpr_thd_currentid(void);

@ -30,7 +30,7 @@
struct gpr_gcc_thread_local { struct gpr_gcc_thread_local {
intptr_t value; intptr_t value;
bool *inited; bool* inited;
}; };
#define GPR_TLS_DECL(name) \ #define GPR_TLS_DECL(name) \

@ -37,7 +37,7 @@ struct gpr_pthread_thread_local {
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
intptr_t gpr_tls_set(struct gpr_pthread_thread_local *tls, intptr_t value); intptr_t gpr_tls_set(struct gpr_pthread_thread_local* tls, intptr_t value);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

@ -1,103 +0,0 @@
{
"name": "grpc",
"version": "1.8.0-dev",
"author": "Google Inc.",
"description": "gRPC Library for Node",
"homepage": "https://grpc.io/",
"repository": {
"type": "git",
"url": "https://github.com/grpc/grpc.git"
},
"bugs": "https://github.com/grpc/grpc/issues",
"contributors": [
{
"name": "Michael Lumish",
"email": "mlumish@google.com"
}
],
"directories": {
"lib": "src/node/src"
},
"scripts": {
"lint": "node ./node_modules/jshint/bin/jshint src/node/src src/node/test src/node/interop src/node/index.js --exclude-path=src/node/.jshintignore",
"test": "./node_modules/.bin/mocha src/node/test && npm run-script lint",
"electron-build": "./node_modules/.bin/node-pre-gyp configure build --runtime=electron --disturl=https://atom.io/download/atom-shell",
"gen_docs": "./node_modules/.bin/jsdoc -c src/node/jsdoc_conf.json",
"coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha src/node/test",
"install": "./node_modules/.bin/node-pre-gyp install --fallback-to-build --library=static_library"
},
"bundledDependencies": [
"node-pre-gyp"
],
"dependencies": {
"arguejs": "^0.2.3",
"lodash": "^4.15.0",
"nan": "^2.0.0",
"node-pre-gyp": "^0.6.35",
"protobufjs": "^5.0.0"
},
"devDependencies": {
"async": "^2.0.1",
"body-parser": "^1.15.2",
"electron-mocha": "^3.1.1",
"express": "^4.14.0",
"google-auth-library": "^0.9.2",
"google-protobuf": "^3.0.0",
"istanbul": "^0.4.4",
"jsdoc": "^3.3.2",
"jshint": "^2.5.0",
"minimist": "^1.1.0",
"mocha": "^3.0.2",
"mocha-jenkins-reporter": "^0.2.3",
"poisson-process": "^0.2.1"
},
"engines": {
"node": ">=4"
},
"binary": {
"module_name": "grpc_node",
"module_path": "src/node/extension_binary/{node_abi}-{platform}-{arch}",
"host": "https://storage.googleapis.com/",
"remote_path": "grpc-precompiled-binaries/node/{name}/v{version}",
"package_name": "{node_abi}-{platform}-{arch}.tar.gz"
},
"files": [
"LICENSE",
"src/node/README.md",
"src/proto",
"etc",
"src/node/index.js",
"src/node/src",
"src/node/ext",
"include/grpc",
"src/core",
"src/boringssl",
"src/zlib",
"third_party/nanopb",
"third_party/zlib",
"third_party/boringssl",
"binding.gyp"
],
"main": "src/node/index.js",
"license": "Apache-2.0",
"jshintConfig": {
"bitwise": true,
"curly": true,
"eqeqeq": true,
"esnext": true,
"freeze": true,
"immed": true,
"indent": 2,
"latedef": "nofunc",
"maxlen": 80,
"mocha": true,
"newcap": true,
"node": true,
"noarg": true,
"quotmark": "single",
"strict": true,
"trailing": true,
"undef": true,
"unused": "vars"
}
}

@ -242,6 +242,7 @@
<file baseinstalldir="/" name="src/core/tsi/transport_security_adapter.h" role="src" /> <file baseinstalldir="/" name="src/core/tsi/transport_security_adapter.h" role="src" />
<file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" /> <file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/server/chttp2_server.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/transport/chttp2/server/chttp2_server.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel_factory.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel_factory.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/connector.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/connector.h" role="src" />
@ -395,28 +396,11 @@
<file baseinstalldir="/" name="third_party/nanopb/pb_decode.h" role="src" /> <file baseinstalldir="/" name="third_party/nanopb/pb_decode.h" role="src" />
<file baseinstalldir="/" name="third_party/nanopb/pb_encode.h" role="src" /> <file baseinstalldir="/" name="third_party/nanopb/pb_encode.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/subchannel_list.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_filter.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_filter.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_plugin.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_plugin.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/aggregation.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/base_resources.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/census_interface.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/census_rpc_stats.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/gen/census.pb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/gen/trace_context.pb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/grpc_filter.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/intrusive_hash_map.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/intrusive_hash_map_internal.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/mlog.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/resource.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/rpc_metric_id.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/trace_context.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/trace_label.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/trace_propagation.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/trace_status.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/trace_string.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/tracing.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/max_age/max_age_filter.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/max_age/max_age_filter.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/message_size/message_size_filter.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/message_size/message_size_filter.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h" role="src" />
@ -615,6 +599,7 @@
<file baseinstalldir="/" name="src/core/tsi/transport_security_adapter.cc" role="src" /> <file baseinstalldir="/" name="src/core/tsi/transport_security_adapter.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/server/chttp2_server.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/transport/chttp2/server/chttp2_server.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/channel_connectivity.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/channel_connectivity.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel_factory.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/client_channel_factory.cc" role="src" />
@ -654,6 +639,7 @@
<file baseinstalldir="/" name="third_party/nanopb/pb_encode.c" role="src" /> <file baseinstalldir="/" name="third_party/nanopb/pb_encode.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc" role="src" />
@ -663,21 +649,7 @@
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_filter.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_filter.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/base_resources.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/context.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/gen/census.pb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/gen/trace_context.pb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/grpc_context.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/census/grpc_context.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/grpc_filter.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/grpc_plugin.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/initialize.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/intrusive_hash_map.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/mlog.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/operation.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/placeholders.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/resource.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/trace_context.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/census/tracing.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/max_age/max_age_filter.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/max_age/max_age_filter.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/message_size/message_size_filter.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/message_size/message_size_filter.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc" role="src" /> <file baseinstalldir="/" name="src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc" role="src" />

@ -32,15 +32,15 @@ grpc::string as_string(T x) {
return out.str(); return out.str();
} }
inline bool ClientOnlyStreaming(const grpc_generator::Method *method) { inline bool ClientOnlyStreaming(const grpc_generator::Method* method) {
return method->ClientStreaming() && !method->ServerStreaming(); return method->ClientStreaming() && !method->ServerStreaming();
} }
inline bool ServerOnlyStreaming(const grpc_generator::Method *method) { inline bool ServerOnlyStreaming(const grpc_generator::Method* method) {
return !method->ClientStreaming() && method->ServerStreaming(); return !method->ClientStreaming() && method->ServerStreaming();
} }
grpc::string FilenameIdentifier(const grpc::string &filename) { grpc::string FilenameIdentifier(const grpc::string& filename) {
grpc::string result; grpc::string result;
for (unsigned i = 0; i < filename.size(); i++) { for (unsigned i = 0; i < filename.size(); i++) {
char c = filename[i]; char c = filename[i];
@ -58,19 +58,19 @@ grpc::string FilenameIdentifier(const grpc::string &filename) {
} // namespace } // namespace
template <class T, size_t N> template <class T, size_t N>
T *array_end(T (&array)[N]) { T* array_end(T (&array)[N]) {
return array + N; return array + N;
} }
void PrintIncludes(grpc_generator::Printer *printer, void PrintIncludes(grpc_generator::Printer* printer,
const std::vector<grpc::string> &headers, const std::vector<grpc::string>& headers,
const Parameters &params) { const Parameters& params) {
std::map<grpc::string, grpc::string> vars; std::map<grpc::string, grpc::string> vars;
vars["l"] = params.use_system_headers ? '<' : '"'; vars["l"] = params.use_system_headers ? '<' : '"';
vars["r"] = params.use_system_headers ? '>' : '"'; vars["r"] = params.use_system_headers ? '>' : '"';
auto &s = params.grpc_search_path; auto& s = params.grpc_search_path;
if (!s.empty()) { if (!s.empty()) {
vars["l"] += s; vars["l"] += s;
if (s[s.size() - 1] != '/') { if (s[s.size() - 1] != '/') {
@ -84,8 +84,8 @@ void PrintIncludes(grpc_generator::Printer *printer,
} }
} }
grpc::string GetHeaderPrologue(grpc_generator::File *file, grpc::string GetHeaderPrologue(grpc_generator::File* file,
const Parameters & /*params*/) { const Parameters& /*params*/) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -116,15 +116,15 @@ grpc::string GetHeaderPrologue(grpc_generator::File *file,
return output; return output;
} }
grpc::string GetHeaderIncludes(grpc_generator::File *file, grpc::string GetHeaderIncludes(grpc_generator::File* file,
const Parameters &params) { const Parameters& params) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
auto printer = file->CreatePrinter(&output); auto printer = file->CreatePrinter(&output);
std::map<grpc::string, grpc::string> vars; std::map<grpc::string, grpc::string> vars;
static const char *headers_strs[] = { static const char* headers_strs[] = {
"grpc++/impl/codegen/async_stream.h", "grpc++/impl/codegen/async_stream.h",
"grpc++/impl/codegen/async_unary_call.h", "grpc++/impl/codegen/async_unary_call.h",
"grpc++/impl/codegen/method_handler_impl.h", "grpc++/impl/codegen/method_handler_impl.h",
@ -140,7 +140,6 @@ grpc::string GetHeaderIncludes(grpc_generator::File *file,
printer->Print(vars, "namespace grpc {\n"); printer->Print(vars, "namespace grpc {\n");
printer->Print(vars, "class CompletionQueue;\n"); printer->Print(vars, "class CompletionQueue;\n");
printer->Print(vars, "class Channel;\n"); printer->Print(vars, "class Channel;\n");
printer->Print(vars, "class RpcService;\n");
printer->Print(vars, "class ServerCompletionQueue;\n"); printer->Print(vars, "class ServerCompletionQueue;\n");
printer->Print(vars, "class ServerContext;\n"); printer->Print(vars, "class ServerContext;\n");
printer->Print(vars, "} // namespace grpc\n\n"); printer->Print(vars, "} // namespace grpc\n\n");
@ -159,8 +158,8 @@ grpc::string GetHeaderIncludes(grpc_generator::File *file,
} }
void PrintHeaderClientMethodInterfaces( void PrintHeaderClientMethodInterfaces(
grpc_generator::Printer *printer, const grpc_generator::Method *method, grpc_generator::Printer* printer, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars, bool is_public) { std::map<grpc::string, grpc::string>* vars, bool is_public) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -324,7 +323,8 @@ void PrintHeaderClientMethodInterfaces(
} else if (ServerOnlyStreaming(method)) { } else if (ServerOnlyStreaming(method)) {
printer->Print( printer->Print(
*vars, *vars,
"virtual ::grpc::ClientReaderInterface< $Response$>* $Method$Raw(" "virtual ::grpc::ClientReaderInterface< $Response$>* "
"$Method$Raw("
"::grpc::ClientContext* context, const $Request$& request) = 0;\n"); "::grpc::ClientContext* context, const $Request$& request) = 0;\n");
for (auto async_prefix : async_prefixes) { for (auto async_prefix : async_prefixes) {
(*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncPrefix"] = async_prefix.prefix;
@ -355,9 +355,9 @@ void PrintHeaderClientMethodInterfaces(
} }
} }
void PrintHeaderClientMethod(grpc_generator::Printer *printer, void PrintHeaderClientMethod(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars, std::map<grpc::string, grpc::string>* vars,
bool is_public) { bool is_public) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
@ -542,16 +542,17 @@ void PrintHeaderClientMethod(grpc_generator::Printer *printer,
} }
} }
void PrintHeaderClientMethodData(grpc_generator::Printer *printer, void PrintHeaderClientMethodData(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
printer->Print(*vars, "const ::grpc::RpcMethod rpcmethod_$Method$_;\n"); printer->Print(*vars,
"const ::grpc::internal::RpcMethod rpcmethod_$Method$_;\n");
} }
void PrintHeaderServerMethodSync(grpc_generator::Printer *printer, void PrintHeaderServerMethodSync(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -583,9 +584,9 @@ void PrintHeaderServerMethodSync(grpc_generator::Printer *printer,
printer->Print(method->GetTrailingComments("//").c_str()); printer->Print(method->GetTrailingComments("//").c_str());
} }
void PrintHeaderServerMethodAsync(grpc_generator::Printer *printer, void PrintHeaderServerMethodAsync(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -699,8 +700,8 @@ void PrintHeaderServerMethodAsync(grpc_generator::Printer *printer,
} }
void PrintHeaderServerMethodStreamedUnary( void PrintHeaderServerMethodStreamedUnary(
grpc_generator::Printer *printer, const grpc_generator::Method *method, grpc_generator::Printer* printer, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -718,7 +719,7 @@ void PrintHeaderServerMethodStreamedUnary(
printer->Print(*vars, printer->Print(*vars,
"WithStreamedUnaryMethod_$Method$() {\n" "WithStreamedUnaryMethod_$Method$() {\n"
" ::grpc::Service::MarkMethodStreamed($Idx$,\n" " ::grpc::Service::MarkMethodStreamed($Idx$,\n"
" new ::grpc::StreamedUnaryHandler< $Request$, " " new ::grpc::internal::StreamedUnaryHandler< $Request$, "
"$Response$>(std::bind" "$Response$>(std::bind"
"(&WithStreamedUnaryMethod_$Method$<BaseClass>::" "(&WithStreamedUnaryMethod_$Method$<BaseClass>::"
"Streamed$Method$, this, std::placeholders::_1, " "Streamed$Method$, this, std::placeholders::_1, "
@ -750,8 +751,8 @@ void PrintHeaderServerMethodStreamedUnary(
} }
void PrintHeaderServerMethodSplitStreaming( void PrintHeaderServerMethodSplitStreaming(
grpc_generator::Printer *printer, const grpc_generator::Method *method, grpc_generator::Printer* printer, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -766,10 +767,11 @@ void PrintHeaderServerMethodSplitStreaming(
"{}\n"); "{}\n");
printer->Print(" public:\n"); printer->Print(" public:\n");
printer->Indent(); printer->Indent();
printer->Print(*vars, printer->Print(
*vars,
"WithSplitStreamingMethod_$Method$() {\n" "WithSplitStreamingMethod_$Method$() {\n"
" ::grpc::Service::MarkMethodStreamed($Idx$,\n" " ::grpc::Service::MarkMethodStreamed($Idx$,\n"
" new ::grpc::SplitServerStreamingHandler< $Request$, " " new ::grpc::internal::SplitServerStreamingHandler< $Request$, "
"$Response$>(std::bind" "$Response$>(std::bind"
"(&WithSplitStreamingMethod_$Method$<BaseClass>::" "(&WithSplitStreamingMethod_$Method$<BaseClass>::"
"Streamed$Method$, this, std::placeholders::_1, " "Streamed$Method$, this, std::placeholders::_1, "
@ -802,8 +804,8 @@ void PrintHeaderServerMethodSplitStreaming(
} }
void PrintHeaderServerMethodGeneric( void PrintHeaderServerMethodGeneric(
grpc_generator::Printer *printer, const grpc_generator::Method *method, grpc_generator::Printer* printer, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -871,9 +873,9 @@ void PrintHeaderServerMethodGeneric(
printer->Print(*vars, "};\n"); printer->Print(*vars, "};\n");
} }
void PrintHeaderService(grpc_generator::Printer *printer, void PrintHeaderService(grpc_generator::Printer* printer,
const grpc_generator::Service *service, const grpc_generator::Service* service,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Service"] = service->name(); (*vars)["Service"] = service->name();
printer->Print(service->GetLeadingComments("//").c_str()); printer->Print(service->GetLeadingComments("//").c_str());
@ -914,7 +916,8 @@ void PrintHeaderService(grpc_generator::Printer *printer,
" {\n public:\n"); " {\n public:\n");
printer->Indent(); printer->Indent();
printer->Print( printer->Print(
"Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n"); "Stub(const std::shared_ptr< ::grpc::ChannelInterface>& "
"channel);\n");
for (int i = 0; i < service->method_count(); ++i) { for (int i = 0; i < service->method_count(); ++i) {
PrintHeaderClientMethod(printer, service->method(i).get(), vars, true); PrintHeaderClientMethod(printer, service->method(i).get(), vars, true);
} }
@ -1047,8 +1050,8 @@ void PrintHeaderService(grpc_generator::Printer *printer,
printer->Print(service->GetTrailingComments("//").c_str()); printer->Print(service->GetTrailingComments("//").c_str());
} }
grpc::string GetHeaderServices(grpc_generator::File *file, grpc::string GetHeaderServices(grpc_generator::File* file,
const Parameters &params) { const Parameters& params) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -1078,8 +1081,8 @@ grpc::string GetHeaderServices(grpc_generator::File *file,
return output; return output;
} }
grpc::string GetHeaderEpilogue(grpc_generator::File *file, grpc::string GetHeaderEpilogue(grpc_generator::File* file,
const Parameters & /*params*/) { const Parameters& /*params*/) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -1107,8 +1110,8 @@ grpc::string GetHeaderEpilogue(grpc_generator::File *file,
return output; return output;
} }
grpc::string GetSourcePrologue(grpc_generator::File *file, grpc::string GetSourcePrologue(grpc_generator::File* file,
const Parameters & /*params*/) { const Parameters& /*params*/) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -1132,15 +1135,15 @@ grpc::string GetSourcePrologue(grpc_generator::File *file,
return output; return output;
} }
grpc::string GetSourceIncludes(grpc_generator::File *file, grpc::string GetSourceIncludes(grpc_generator::File* file,
const Parameters &params) { const Parameters& params) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
auto printer = file->CreatePrinter(&output); auto printer = file->CreatePrinter(&output);
std::map<grpc::string, grpc::string> vars; std::map<grpc::string, grpc::string> vars;
static const char *headers_strs[] = { static const char* headers_strs[] = {
"grpc++/impl/codegen/async_stream.h", "grpc++/impl/codegen/async_stream.h",
"grpc++/impl/codegen/async_unary_call.h", "grpc++/impl/codegen/async_unary_call.h",
"grpc++/impl/codegen/channel_interface.h", "grpc++/impl/codegen/channel_interface.h",
@ -1166,9 +1169,9 @@ grpc::string GetSourceIncludes(grpc_generator::File *file,
return output; return output;
} }
void PrintSourceClientMethod(grpc_generator::Printer *printer, void PrintSourceClientMethod(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -1185,10 +1188,9 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"::grpc::ClientContext* context, " "::grpc::ClientContext* context, "
"const $Request$& request, $Response$* response) {\n"); "const $Request$& request, $Response$* response) {\n");
printer->Print(*vars, printer->Print(*vars,
" return ::grpc::BlockingUnaryCall(channel_.get(), " " return ::grpc::internal::BlockingUnaryCall"
"rpcmethod_$Method$_, " "(channel_.get(), rpcmethod_$Method$_, "
"context, request, response);\n" "context, request, response);\n}\n\n");
"}\n\n");
for (auto async_prefix : async_prefixes) { for (auto async_prefix : async_prefixes) {
(*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncPrefix"] = async_prefix.prefix;
(*vars)["AsyncStart"] = async_prefix.start; (*vars)["AsyncStart"] = async_prefix.start;
@ -1198,10 +1200,11 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"ClientContext* context, " "ClientContext* context, "
"const $Request$& request, " "const $Request$& request, "
"::grpc::CompletionQueue* cq) {\n"); "::grpc::CompletionQueue* cq) {\n");
printer->Print(*vars, printer->Print(
*vars,
" return " " return "
"::grpc::ClientAsyncResponseReader< $Response$>::Create(" "::grpc::internal::ClientAsyncResponseReaderFactory< $Response$>"
"channel_.get(), cq, " "::Create(channel_.get(), cq, "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context, request, $AsyncStart$);\n" "context, request, $AsyncStart$);\n"
"}\n\n"); "}\n\n");
@ -1211,8 +1214,9 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"::grpc::ClientWriter< $Request$>* " "::grpc::ClientWriter< $Request$>* "
"$ns$$Service$::Stub::$Method$Raw(" "$ns$$Service$::Stub::$Method$Raw("
"::grpc::ClientContext* context, $Response$* response) {\n"); "::grpc::ClientContext* context, $Response$* response) {\n");
printer->Print(*vars, printer->Print(
" return new ::grpc::ClientWriter< $Request$>(" *vars,
" return ::grpc::internal::ClientWriterFactory< $Request$>::Create("
"channel_.get(), " "channel_.get(), "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context, response);\n" "context, response);\n"
@ -1227,9 +1231,10 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(" "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw("
"::grpc::ClientContext* context, $Response$* response, " "::grpc::ClientContext* context, $Response$* response, "
"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
printer->Print(*vars, printer->Print(
" return ::grpc::ClientAsyncWriter< $Request$>::Create(" *vars,
"channel_.get(), cq, " " return ::grpc::internal::ClientAsyncWriterFactory< $Request$>"
"::Create(channel_.get(), cq, "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context, response, $AsyncStart$$AsyncCreateArgs$);\n" "context, response, $AsyncStart$$AsyncCreateArgs$);\n"
"}\n\n"); "}\n\n");
@ -1240,8 +1245,9 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"::grpc::ClientReader< $Response$>* " "::grpc::ClientReader< $Response$>* "
"$ns$$Service$::Stub::$Method$Raw(" "$ns$$Service$::Stub::$Method$Raw("
"::grpc::ClientContext* context, const $Request$& request) {\n"); "::grpc::ClientContext* context, const $Request$& request) {\n");
printer->Print(*vars, printer->Print(
" return new ::grpc::ClientReader< $Response$>(" *vars,
" return ::grpc::internal::ClientReaderFactory< $Response$>::Create("
"channel_.get(), " "channel_.get(), "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context, request);\n" "context, request);\n"
@ -1257,9 +1263,10 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(" "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw("
"::grpc::ClientContext* context, const $Request$& request, " "::grpc::ClientContext* context, const $Request$& request, "
"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
printer->Print(*vars, printer->Print(
" return ::grpc::ClientAsyncReader< $Response$>::Create(" *vars,
"channel_.get(), cq, " " return ::grpc::internal::ClientAsyncReaderFactory< $Response$>"
"::Create(channel_.get(), cq, "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context, request, $AsyncStart$$AsyncCreateArgs$);\n" "context, request, $AsyncStart$$AsyncCreateArgs$);\n"
"}\n\n"); "}\n\n");
@ -1270,8 +1277,8 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"::grpc::ClientReaderWriter< $Request$, $Response$>* " "::grpc::ClientReaderWriter< $Request$, $Response$>* "
"$ns$$Service$::Stub::$Method$Raw(::grpc::ClientContext* context) {\n"); "$ns$$Service$::Stub::$Method$Raw(::grpc::ClientContext* context) {\n");
printer->Print(*vars, printer->Print(*vars,
" return new ::grpc::ClientReaderWriter< " " return ::grpc::internal::ClientReaderWriterFactory< "
"$Request$, $Response$>(" "$Request$, $Response$>::Create("
"channel_.get(), " "channel_.get(), "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context);\n" "context);\n"
@ -1286,10 +1293,10 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
"$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::" "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::"
"ClientContext* context, " "ClientContext* context, "
"::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n");
printer->Print( printer->Print(*vars,
*vars,
" return " " return "
"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>::Create(" "::grpc::internal::ClientAsyncReaderWriterFactory< "
"$Request$, $Response$>::Create("
"channel_.get(), cq, " "channel_.get(), cq, "
"rpcmethod_$Method$_, " "rpcmethod_$Method$_, "
"context, $AsyncStart$$AsyncCreateArgs$);\n" "context, $AsyncStart$$AsyncCreateArgs$);\n"
@ -1298,9 +1305,9 @@ void PrintSourceClientMethod(grpc_generator::Printer *printer,
} }
} }
void PrintSourceServerMethod(grpc_generator::Printer *printer, void PrintSourceServerMethod(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -1357,9 +1364,9 @@ void PrintSourceServerMethod(grpc_generator::Printer *printer,
} }
} }
void PrintSourceService(grpc_generator::Printer *printer, void PrintSourceService(grpc_generator::Printer* printer,
const grpc_generator::Service *service, const grpc_generator::Service* service,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Service"] = service->name(); (*vars)["Service"] = service->name();
if (service->method_count() > 0) { if (service->method_count() > 0) {
@ -1404,7 +1411,7 @@ void PrintSourceService(grpc_generator::Printer *printer,
printer->Print(*vars, printer->Print(*vars,
", rpcmethod_$Method$_(" ", rpcmethod_$Method$_("
"$prefix$$Service$_method_names[$Idx$], " "$prefix$$Service$_method_names[$Idx$], "
"::grpc::RpcMethod::$StreamingType$, " "::grpc::internal::RpcMethod::$StreamingType$, "
"channel" "channel"
")\n"); ")\n");
} }
@ -1427,38 +1434,38 @@ void PrintSourceService(grpc_generator::Printer *printer,
if (method->NoStreaming()) { if (method->NoStreaming()) {
printer->Print( printer->Print(
*vars, *vars,
"AddMethod(new ::grpc::RpcServiceMethod(\n" "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
" $prefix$$Service$_method_names[$Idx$],\n" " $prefix$$Service$_method_names[$Idx$],\n"
" ::grpc::RpcMethod::NORMAL_RPC,\n" " ::grpc::internal::RpcMethod::NORMAL_RPC,\n"
" new ::grpc::RpcMethodHandler< $ns$$Service$::Service, " " new ::grpc::internal::RpcMethodHandler< $ns$$Service$::Service, "
"$Request$, " "$Request$, "
"$Response$>(\n" "$Response$>(\n"
" std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
} else if (ClientOnlyStreaming(method.get())) { } else if (ClientOnlyStreaming(method.get())) {
printer->Print( printer->Print(
*vars, *vars,
"AddMethod(new ::grpc::RpcServiceMethod(\n" "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
" $prefix$$Service$_method_names[$Idx$],\n" " $prefix$$Service$_method_names[$Idx$],\n"
" ::grpc::RpcMethod::CLIENT_STREAMING,\n" " ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n"
" new ::grpc::ClientStreamingHandler< " " new ::grpc::internal::ClientStreamingHandler< "
"$ns$$Service$::Service, $Request$, $Response$>(\n" "$ns$$Service$::Service, $Request$, $Response$>(\n"
" std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
} else if (ServerOnlyStreaming(method.get())) { } else if (ServerOnlyStreaming(method.get())) {
printer->Print( printer->Print(
*vars, *vars,
"AddMethod(new ::grpc::RpcServiceMethod(\n" "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
" $prefix$$Service$_method_names[$Idx$],\n" " $prefix$$Service$_method_names[$Idx$],\n"
" ::grpc::RpcMethod::SERVER_STREAMING,\n" " ::grpc::internal::RpcMethod::SERVER_STREAMING,\n"
" new ::grpc::ServerStreamingHandler< " " new ::grpc::internal::ServerStreamingHandler< "
"$ns$$Service$::Service, $Request$, $Response$>(\n" "$ns$$Service$::Service, $Request$, $Response$>(\n"
" std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
} else if (method->BidiStreaming()) { } else if (method->BidiStreaming()) {
printer->Print( printer->Print(
*vars, *vars,
"AddMethod(new ::grpc::RpcServiceMethod(\n" "AddMethod(new ::grpc::internal::RpcServiceMethod(\n"
" $prefix$$Service$_method_names[$Idx$],\n" " $prefix$$Service$_method_names[$Idx$],\n"
" ::grpc::RpcMethod::BIDI_STREAMING,\n" " ::grpc::internal::RpcMethod::BIDI_STREAMING,\n"
" new ::grpc::BidiStreamingHandler< " " new ::grpc::internal::BidiStreamingHandler< "
"$ns$$Service$::Service, $Request$, $Response$>(\n" "$ns$$Service$::Service, $Request$, $Response$>(\n"
" std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n");
} }
@ -1474,8 +1481,8 @@ void PrintSourceService(grpc_generator::Printer *printer,
} }
} }
grpc::string GetSourceServices(grpc_generator::File *file, grpc::string GetSourceServices(grpc_generator::File* file,
const Parameters &params) { const Parameters& params) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -1503,8 +1510,8 @@ grpc::string GetSourceServices(grpc_generator::File *file,
return output; return output;
} }
grpc::string GetSourceEpilogue(grpc_generator::File *file, grpc::string GetSourceEpilogue(grpc_generator::File* file,
const Parameters & /*params*/) { const Parameters& /*params*/) {
grpc::string temp; grpc::string temp;
if (!file->package().empty()) { if (!file->package().empty()) {
@ -1522,8 +1529,8 @@ grpc::string GetSourceEpilogue(grpc_generator::File *file,
} }
// TODO(mmukhi): Make sure we need parameters or not. // TODO(mmukhi): Make sure we need parameters or not.
grpc::string GetMockPrologue(grpc_generator::File *file, grpc::string GetMockPrologue(grpc_generator::File* file,
const Parameters & /*params*/) { const Parameters& /*params*/) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -1549,17 +1556,18 @@ grpc::string GetMockPrologue(grpc_generator::File *file,
} }
// TODO(mmukhi): Add client-stream and completion-queue headers. // TODO(mmukhi): Add client-stream and completion-queue headers.
grpc::string GetMockIncludes(grpc_generator::File *file, grpc::string GetMockIncludes(grpc_generator::File* file,
const Parameters &params) { const Parameters& params) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
auto printer = file->CreatePrinter(&output); auto printer = file->CreatePrinter(&output);
std::map<grpc::string, grpc::string> vars; std::map<grpc::string, grpc::string> vars;
static const char *headers_strs[] = { static const char* headers_strs[] = {
"grpc++/impl/codegen/async_stream.h", "grpc++/impl/codegen/async_stream.h",
"grpc++/impl/codegen/sync_stream.h", "gmock/gmock.h", "grpc++/impl/codegen/sync_stream.h",
"gmock/gmock.h",
}; };
std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); std::vector<grpc::string> headers(headers_strs, array_end(headers_strs));
PrintIncludes(printer.get(), headers, params); PrintIncludes(printer.get(), headers, params);
@ -1578,9 +1586,9 @@ grpc::string GetMockIncludes(grpc_generator::File *file,
return output; return output;
} }
void PrintMockClientMethods(grpc_generator::Printer *printer, void PrintMockClientMethods(grpc_generator::Printer* printer,
const grpc_generator::Method *method, const grpc_generator::Method* method,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Method"] = method->name(); (*vars)["Method"] = method->name();
(*vars)["Request"] = method->input_type_name(); (*vars)["Request"] = method->input_type_name();
(*vars)["Response"] = method->output_type_name(); (*vars)["Response"] = method->output_type_name();
@ -1661,9 +1669,9 @@ void PrintMockClientMethods(grpc_generator::Printer *printer,
} }
} }
void PrintMockService(grpc_generator::Printer *printer, void PrintMockService(grpc_generator::Printer* printer,
const grpc_generator::Service *service, const grpc_generator::Service* service,
std::map<grpc::string, grpc::string> *vars) { std::map<grpc::string, grpc::string>* vars) {
(*vars)["Service"] = service->name(); (*vars)["Service"] = service->name();
printer->Print(*vars, printer->Print(*vars,
@ -1677,8 +1685,8 @@ void PrintMockService(grpc_generator::Printer *printer,
printer->Print("};\n"); printer->Print("};\n");
} }
grpc::string GetMockServices(grpc_generator::File *file, grpc::string GetMockServices(grpc_generator::File* file,
const Parameters &params) { const Parameters& params) {
grpc::string output; grpc::string output;
{ {
// Scope the output stream so it closes and finalizes output to the string. // Scope the output stream so it closes and finalizes output to the string.
@ -1708,8 +1716,8 @@ grpc::string GetMockServices(grpc_generator::File *file,
return output; return output;
} }
grpc::string GetMockEpilogue(grpc_generator::File *file, grpc::string GetMockEpilogue(grpc_generator::File* file,
const Parameters & /*params*/) { const Parameters& /*params*/) {
grpc::string temp; grpc::string temp;
if (!file->package().empty()) { if (!file->package().empty()) {

@ -55,68 +55,68 @@ struct Parameters {
}; };
// Return the prologue of the generated header file. // Return the prologue of the generated header file.
grpc::string GetHeaderPrologue(grpc_generator::File *file, grpc::string GetHeaderPrologue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the includes needed for generated header file. // Return the includes needed for generated header file.
grpc::string GetHeaderIncludes(grpc_generator::File *file, grpc::string GetHeaderIncludes(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the includes needed for generated source file. // Return the includes needed for generated source file.
grpc::string GetSourceIncludes(grpc_generator::File *file, grpc::string GetSourceIncludes(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the epilogue of the generated header file. // Return the epilogue of the generated header file.
grpc::string GetHeaderEpilogue(grpc_generator::File *file, grpc::string GetHeaderEpilogue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the prologue of the generated source file. // Return the prologue of the generated source file.
grpc::string GetSourcePrologue(grpc_generator::File *file, grpc::string GetSourcePrologue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the services for generated header file. // Return the services for generated header file.
grpc::string GetHeaderServices(grpc_generator::File *file, grpc::string GetHeaderServices(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the services for generated source file. // Return the services for generated source file.
grpc::string GetSourceServices(grpc_generator::File *file, grpc::string GetSourceServices(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the epilogue of the generated source file. // Return the epilogue of the generated source file.
grpc::string GetSourceEpilogue(grpc_generator::File *file, grpc::string GetSourceEpilogue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the prologue of the generated mock file. // Return the prologue of the generated mock file.
grpc::string GetMockPrologue(grpc_generator::File *file, grpc::string GetMockPrologue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the includes needed for generated mock file. // Return the includes needed for generated mock file.
grpc::string GetMockIncludes(grpc_generator::File *file, grpc::string GetMockIncludes(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the services for generated mock file. // Return the services for generated mock file.
grpc::string GetMockServices(grpc_generator::File *file, grpc::string GetMockServices(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the epilogue of generated mock file. // Return the epilogue of generated mock file.
grpc::string GetMockEpilogue(grpc_generator::File *file, grpc::string GetMockEpilogue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the prologue of the generated mock file. // Return the prologue of the generated mock file.
grpc::string GetMockPrologue(grpc_generator::File *file, grpc::string GetMockPrologue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the includes needed for generated mock file. // Return the includes needed for generated mock file.
grpc::string GetMockIncludes(grpc_generator::File *file, grpc::string GetMockIncludes(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the services for generated mock file. // Return the services for generated mock file.
grpc::string GetMockServices(grpc_generator::File *file, grpc::string GetMockServices(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
// Return the epilogue of generated mock file. // Return the epilogue of generated mock file.
grpc::string GetMockEpilogue(grpc_generator::File *file, grpc::string GetMockEpilogue(grpc_generator::File* file,
const Parameters &params); const Parameters& params);
} // namespace grpc_cpp_generator } // namespace grpc_cpp_generator

@ -26,22 +26,22 @@
namespace grpc_cpp_generator { namespace grpc_cpp_generator {
inline grpc::string DotsToColons(const grpc::string &name) { inline grpc::string DotsToColons(const grpc::string& name) {
return grpc_generator::StringReplace(name, ".", "::"); return grpc_generator::StringReplace(name, ".", "::");
} }
inline grpc::string DotsToUnderscores(const grpc::string &name) { inline grpc::string DotsToUnderscores(const grpc::string& name) {
return grpc_generator::StringReplace(name, ".", "_"); return grpc_generator::StringReplace(name, ".", "_");
} }
inline grpc::string ClassName(const grpc::protobuf::Descriptor *descriptor, inline grpc::string ClassName(const grpc::protobuf::Descriptor* descriptor,
bool qualified) { bool qualified) {
// Find "outer", the descriptor of the top-level message in which // Find "outer", the descriptor of the top-level message in which
// "descriptor" is embedded. // "descriptor" is embedded.
const grpc::protobuf::Descriptor *outer = descriptor; const grpc::protobuf::Descriptor* outer = descriptor;
while (outer->containing_type() != NULL) outer = outer->containing_type(); while (outer->containing_type() != NULL) outer = outer->containing_type();
const grpc::string &outer_name = outer->full_name(); const grpc::string& outer_name = outer->full_name();
grpc::string inner_name = descriptor->full_name().substr(outer_name.size()); grpc::string inner_name = descriptor->full_name().substr(outer_name.size());
if (qualified) { if (qualified) {
@ -54,7 +54,7 @@ inline grpc::string ClassName(const grpc::protobuf::Descriptor *descriptor,
// Get leading or trailing comments in a string. Comment lines start with "// ". // Get leading or trailing comments in a string. Comment lines start with "// ".
// Leading detached comments are put in in front of leading comments. // Leading detached comments are put in in front of leading comments.
template <typename DescriptorType> template <typename DescriptorType>
inline grpc::string GetCppComments(const DescriptorType *desc, bool leading) { inline grpc::string GetCppComments(const DescriptorType* desc, bool leading) {
return grpc_generator::GetPrefixedComments(desc, leading, "//"); return grpc_generator::GetPrefixedComments(desc, leading, "//");
} }

@ -33,10 +33,10 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
CppGrpcGenerator() {} CppGrpcGenerator() {}
virtual ~CppGrpcGenerator() {} virtual ~CppGrpcGenerator() {}
virtual bool Generate(const grpc::protobuf::FileDescriptor *file, virtual bool Generate(const grpc::protobuf::FileDescriptor* file,
const grpc::string &parameter, const grpc::string& parameter,
grpc::protobuf::compiler::GeneratorContext *context, grpc::protobuf::compiler::GeneratorContext* context,
grpc::string *error) const { grpc::string* error) const {
if (file->options().cc_generic_services()) { if (file->options().cc_generic_services()) {
*error = *error =
"cpp grpc proto compiler plugin does not work with generic " "cpp grpc proto compiler plugin does not work with generic "
@ -125,9 +125,9 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
private: private:
// Insert the given code into the given file at the given insertion point. // Insert the given code into the given file at the given insertion point.
void Insert(grpc::protobuf::compiler::GeneratorContext *context, void Insert(grpc::protobuf::compiler::GeneratorContext* context,
const grpc::string &filename, const grpc::string &insertion_point, const grpc::string& filename, const grpc::string& insertion_point,
const grpc::string &code) const { const grpc::string& code) const {
std::unique_ptr<grpc::protobuf::io::ZeroCopyOutputStream> output( std::unique_ptr<grpc::protobuf::io::ZeroCopyOutputStream> output(
context->OpenForInsert(filename, insertion_point)); context->OpenForInsert(filename, insertion_point));
grpc::protobuf::io::CodedOutputStream coded_out(output.get()); grpc::protobuf::io::CodedOutputStream coded_out(output.get());
@ -135,7 +135,7 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
} }
}; };
int main(int argc, char *argv[]) { int main(int argc, char* argv[]) {
CppGrpcGenerator generator; CppGrpcGenerator generator;
return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); return grpc::protobuf::compiler::PluginMain(argc, argv, &generator);
} }

@ -23,24 +23,23 @@
#include "src/compiler/config.h" #include "src/compiler/config.h"
#include "src/compiler/csharp_generator.h" #include "src/compiler/csharp_generator.h"
#include "src/compiler/csharp_generator.h"
#include "src/compiler/csharp_generator_helpers.h" #include "src/compiler/csharp_generator_helpers.h"
using google::protobuf::compiler::csharp::GetFileNamespace;
using google::protobuf::compiler::csharp::GetClassName; using google::protobuf::compiler::csharp::GetClassName;
using google::protobuf::compiler::csharp::GetFileNamespace;
using google::protobuf::compiler::csharp::GetReflectionClassName; using google::protobuf::compiler::csharp::GetReflectionClassName;
using grpc::protobuf::FileDescriptor;
using grpc::protobuf::Descriptor; using grpc::protobuf::Descriptor;
using grpc::protobuf::ServiceDescriptor; using grpc::protobuf::FileDescriptor;
using grpc::protobuf::MethodDescriptor; using grpc::protobuf::MethodDescriptor;
using grpc::protobuf::ServiceDescriptor;
using grpc::protobuf::io::Printer; using grpc::protobuf::io::Printer;
using grpc::protobuf::io::StringOutputStream; using grpc::protobuf::io::StringOutputStream;
using grpc_generator::MethodType;
using grpc_generator::GetMethodType; using grpc_generator::GetMethodType;
using grpc_generator::METHODTYPE_NO_STREAMING; using grpc_generator::METHODTYPE_BIDI_STREAMING;
using grpc_generator::METHODTYPE_CLIENT_STREAMING; using grpc_generator::METHODTYPE_CLIENT_STREAMING;
using grpc_generator::METHODTYPE_NO_STREAMING;
using grpc_generator::METHODTYPE_SERVER_STREAMING; using grpc_generator::METHODTYPE_SERVER_STREAMING;
using grpc_generator::METHODTYPE_BIDI_STREAMING; using grpc_generator::MethodType;
using grpc_generator::StringReplace; using grpc_generator::StringReplace;
using std::map; using std::map;
using std::vector; using std::vector;
@ -53,7 +52,7 @@ namespace {
// Currently, we cannot easily reuse the functionality as // Currently, we cannot easily reuse the functionality as
// google/protobuf/compiler/csharp/csharp_doc_comment.h is not a public header. // google/protobuf/compiler/csharp/csharp_doc_comment.h is not a public header.
// TODO(jtattermusch): reuse the functionality from google/protobuf. // TODO(jtattermusch): reuse the functionality from google/protobuf.
bool GenerateDocCommentBodyImpl(grpc::protobuf::io::Printer *printer, bool GenerateDocCommentBodyImpl(grpc::protobuf::io::Printer* printer,
grpc::protobuf::SourceLocation location) { grpc::protobuf::SourceLocation location) {
grpc::string comments = location.leading_comments.empty() grpc::string comments = location.leading_comments.empty()
? location.trailing_comments ? location.trailing_comments
@ -100,8 +99,8 @@ bool GenerateDocCommentBodyImpl(grpc::protobuf::io::Printer *printer,
} }
template <typename DescriptorType> template <typename DescriptorType>
bool GenerateDocCommentBody(grpc::protobuf::io::Printer *printer, bool GenerateDocCommentBody(grpc::protobuf::io::Printer* printer,
const DescriptorType *descriptor) { const DescriptorType* descriptor) {
grpc::protobuf::SourceLocation location; grpc::protobuf::SourceLocation location;
if (!descriptor->GetSourceLocation(&location)) { if (!descriptor->GetSourceLocation(&location)) {
return false; return false;
@ -109,8 +108,8 @@ bool GenerateDocCommentBody(grpc::protobuf::io::Printer *printer,
return GenerateDocCommentBodyImpl(printer, location); return GenerateDocCommentBodyImpl(printer, location);
} }
void GenerateDocCommentServerMethod(grpc::protobuf::io::Printer *printer, void GenerateDocCommentServerMethod(grpc::protobuf::io::Printer* printer,
const MethodDescriptor *method) { const MethodDescriptor* method) {
if (GenerateDocCommentBody(printer, method)) { if (GenerateDocCommentBody(printer, method)) {
if (method->client_streaming()) { if (method->client_streaming()) {
printer->Print( printer->Print(
@ -141,8 +140,8 @@ void GenerateDocCommentServerMethod(grpc::protobuf::io::Printer *printer,
} }
} }
void GenerateDocCommentClientMethod(grpc::protobuf::io::Printer *printer, void GenerateDocCommentClientMethod(grpc::protobuf::io::Printer* printer,
const MethodDescriptor *method, const MethodDescriptor* method,
bool is_sync, bool use_call_options) { bool is_sync, bool use_call_options) {
if (GenerateDocCommentBody(printer, method)) { if (GenerateDocCommentBody(printer, method)) {
if (!method->client_streaming()) { if (!method->client_streaming()) {
@ -173,15 +172,15 @@ void GenerateDocCommentClientMethod(grpc::protobuf::io::Printer *printer,
} }
} }
std::string GetServiceClassName(const ServiceDescriptor *service) { std::string GetServiceClassName(const ServiceDescriptor* service) {
return service->name(); return service->name();
} }
std::string GetClientClassName(const ServiceDescriptor *service) { std::string GetClientClassName(const ServiceDescriptor* service) {
return service->name() + "Client"; return service->name() + "Client";
} }
std::string GetServerClassName(const ServiceDescriptor *service) { std::string GetServerClassName(const ServiceDescriptor* service) {
return service->name() + "Base"; return service->name() + "Base";
} }
@ -202,15 +201,15 @@ std::string GetCSharpMethodType(MethodType method_type) {
std::string GetServiceNameFieldName() { return "__ServiceName"; } std::string GetServiceNameFieldName() { return "__ServiceName"; }
std::string GetMarshallerFieldName(const Descriptor *message) { std::string GetMarshallerFieldName(const Descriptor* message) {
return "__Marshaller_" + message->name(); return "__Marshaller_" + message->name();
} }
std::string GetMethodFieldName(const MethodDescriptor *method) { std::string GetMethodFieldName(const MethodDescriptor* method) {
return "__Method_" + method->name(); return "__Method_" + method->name();
} }
std::string GetMethodRequestParamMaybe(const MethodDescriptor *method, std::string GetMethodRequestParamMaybe(const MethodDescriptor* method,
bool invocation_param = false) { bool invocation_param = false) {
if (method->client_streaming()) { if (method->client_streaming()) {
return ""; return "";
@ -225,7 +224,7 @@ std::string GetAccessLevel(bool internal_access) {
return internal_access ? "internal" : "public"; return internal_access ? "internal" : "public";
} }
std::string GetMethodReturnTypeClient(const MethodDescriptor *method) { std::string GetMethodReturnTypeClient(const MethodDescriptor* method) {
switch (GetMethodType(method)) { switch (GetMethodType(method)) {
case METHODTYPE_NO_STREAMING: case METHODTYPE_NO_STREAMING:
return "grpc::AsyncUnaryCall<" + GetClassName(method->output_type()) + return "grpc::AsyncUnaryCall<" + GetClassName(method->output_type()) +
@ -246,7 +245,7 @@ std::string GetMethodReturnTypeClient(const MethodDescriptor *method) {
return ""; return "";
} }
std::string GetMethodRequestParamServer(const MethodDescriptor *method) { std::string GetMethodRequestParamServer(const MethodDescriptor* method) {
switch (GetMethodType(method)) { switch (GetMethodType(method)) {
case METHODTYPE_NO_STREAMING: case METHODTYPE_NO_STREAMING:
case METHODTYPE_SERVER_STREAMING: case METHODTYPE_SERVER_STREAMING:
@ -260,7 +259,7 @@ std::string GetMethodRequestParamServer(const MethodDescriptor *method) {
return ""; return "";
} }
std::string GetMethodReturnTypeServer(const MethodDescriptor *method) { std::string GetMethodReturnTypeServer(const MethodDescriptor* method) {
switch (GetMethodType(method)) { switch (GetMethodType(method)) {
case METHODTYPE_NO_STREAMING: case METHODTYPE_NO_STREAMING:
case METHODTYPE_CLIENT_STREAMING: case METHODTYPE_CLIENT_STREAMING:
@ -274,7 +273,7 @@ std::string GetMethodReturnTypeServer(const MethodDescriptor *method) {
return ""; return "";
} }
std::string GetMethodResponseStreamMaybe(const MethodDescriptor *method) { std::string GetMethodResponseStreamMaybe(const MethodDescriptor* method) {
switch (GetMethodType(method)) { switch (GetMethodType(method)) {
case METHODTYPE_NO_STREAMING: case METHODTYPE_NO_STREAMING:
case METHODTYPE_CLIENT_STREAMING: case METHODTYPE_CLIENT_STREAMING:
@ -289,13 +288,13 @@ std::string GetMethodResponseStreamMaybe(const MethodDescriptor *method) {
} }
// Gets vector of all messages used as input or output types. // Gets vector of all messages used as input or output types.
std::vector<const Descriptor *> GetUsedMessages( std::vector<const Descriptor*> GetUsedMessages(
const ServiceDescriptor *service) { const ServiceDescriptor* service) {
std::set<const Descriptor *> descriptor_set; std::set<const Descriptor*> descriptor_set;
std::vector<const Descriptor *> std::vector<const Descriptor*>
result; // vector is to maintain stable ordering result; // vector is to maintain stable ordering
for (int i = 0; i < service->method_count(); i++) { for (int i = 0; i < service->method_count(); i++) {
const MethodDescriptor *method = service->method(i); const MethodDescriptor* method = service->method(i);
if (descriptor_set.find(method->input_type()) == descriptor_set.end()) { if (descriptor_set.find(method->input_type()) == descriptor_set.end()) {
descriptor_set.insert(method->input_type()); descriptor_set.insert(method->input_type());
result.push_back(method->input_type()); result.push_back(method->input_type());
@ -308,10 +307,10 @@ std::vector<const Descriptor *> GetUsedMessages(
return result; return result;
} }
void GenerateMarshallerFields(Printer *out, const ServiceDescriptor *service) { void GenerateMarshallerFields(Printer* out, const ServiceDescriptor* service) {
std::vector<const Descriptor *> used_messages = GetUsedMessages(service); std::vector<const Descriptor*> used_messages = GetUsedMessages(service);
for (size_t i = 0; i < used_messages.size(); i++) { for (size_t i = 0; i < used_messages.size(); i++) {
const Descriptor *message = used_messages[i]; const Descriptor* message = used_messages[i];
out->Print( out->Print(
"static readonly grpc::Marshaller<$type$> $fieldname$ = " "static readonly grpc::Marshaller<$type$> $fieldname$ = "
"grpc::Marshallers.Create((arg) => " "grpc::Marshallers.Create((arg) => "
@ -323,7 +322,7 @@ void GenerateMarshallerFields(Printer *out, const ServiceDescriptor *service) {
out->Print("\n"); out->Print("\n");
} }
void GenerateStaticMethodField(Printer *out, const MethodDescriptor *method) { void GenerateStaticMethodField(Printer* out, const MethodDescriptor* method) {
out->Print( out->Print(
"static readonly grpc::Method<$request$, $response$> $fieldname$ = new " "static readonly grpc::Method<$request$, $response$> $fieldname$ = new "
"grpc::Method<$request$, $response$>(\n", "grpc::Method<$request$, $response$>(\n",
@ -346,8 +345,8 @@ void GenerateStaticMethodField(Printer *out, const MethodDescriptor *method) {
out->Outdent(); out->Outdent();
} }
void GenerateServiceDescriptorProperty(Printer *out, void GenerateServiceDescriptorProperty(Printer* out,
const ServiceDescriptor *service) { const ServiceDescriptor* service) {
std::ostringstream index; std::ostringstream index;
index << service->index(); index << service->index();
out->Print("/// <summary>Service descriptor</summary>\n"); out->Print("/// <summary>Service descriptor</summary>\n");
@ -362,7 +361,7 @@ void GenerateServiceDescriptorProperty(Printer *out,
out->Print("\n"); out->Print("\n");
} }
void GenerateServerClass(Printer *out, const ServiceDescriptor *service) { void GenerateServerClass(Printer* out, const ServiceDescriptor* service) {
out->Print( out->Print(
"/// <summary>Base class for server-side implementations of " "/// <summary>Base class for server-side implementations of "
"$servicename$</summary>\n", "$servicename$</summary>\n",
@ -372,7 +371,7 @@ void GenerateServerClass(Printer *out, const ServiceDescriptor *service) {
out->Print("{\n"); out->Print("{\n");
out->Indent(); out->Indent();
for (int i = 0; i < service->method_count(); i++) { for (int i = 0; i < service->method_count(); i++) {
const MethodDescriptor *method = service->method(i); const MethodDescriptor* method = service->method(i);
GenerateDocCommentServerMethod(out, method); GenerateDocCommentServerMethod(out, method);
out->Print( out->Print(
"public virtual $returntype$ " "public virtual $returntype$ "
@ -395,7 +394,7 @@ void GenerateServerClass(Printer *out, const ServiceDescriptor *service) {
out->Print("\n"); out->Print("\n");
} }
void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { void GenerateClientStub(Printer* out, const ServiceDescriptor* service) {
out->Print("/// <summary>Client for $servicename$</summary>\n", "servicename", out->Print("/// <summary>Client for $servicename$</summary>\n", "servicename",
GetServiceClassName(service)); GetServiceClassName(service));
out->Print("public partial class $name$ : grpc::ClientBase<$name$>\n", "name", out->Print("public partial class $name$ : grpc::ClientBase<$name$>\n", "name",
@ -443,7 +442,7 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) {
out->Print("}\n\n"); out->Print("}\n\n");
for (int i = 0; i < service->method_count(); i++) { for (int i = 0; i < service->method_count(); i++) {
const MethodDescriptor *method = service->method(i); const MethodDescriptor* method = service->method(i);
MethodType method_type = GetMethodType(method); MethodType method_type = GetMethodType(method);
if (method_type == METHODTYPE_NO_STREAMING) { if (method_type == METHODTYPE_NO_STREAMING) {
@ -573,7 +572,7 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) {
out->Print("\n"); out->Print("\n");
} }
void GenerateBindServiceMethod(Printer *out, const ServiceDescriptor *service) { void GenerateBindServiceMethod(Printer* out, const ServiceDescriptor* service) {
out->Print( out->Print(
"/// <summary>Creates service definition that can be registered with a " "/// <summary>Creates service definition that can be registered with a "
"server</summary>\n"); "server</summary>\n");
@ -591,7 +590,7 @@ void GenerateBindServiceMethod(Printer *out, const ServiceDescriptor *service) {
out->Indent(); out->Indent();
out->Indent(); out->Indent();
for (int i = 0; i < service->method_count(); i++) { for (int i = 0; i < service->method_count(); i++) {
const MethodDescriptor *method = service->method(i); const MethodDescriptor* method = service->method(i);
out->Print(".AddMethod($methodfield$, serviceImpl.$methodname$)", out->Print(".AddMethod($methodfield$, serviceImpl.$methodname$)",
"methodfield", GetMethodFieldName(method), "methodname", "methodfield", GetMethodFieldName(method), "methodname",
method->name()); method->name());
@ -608,7 +607,7 @@ void GenerateBindServiceMethod(Printer *out, const ServiceDescriptor *service) {
out->Print("\n"); out->Print("\n");
} }
void GenerateService(Printer *out, const ServiceDescriptor *service, void GenerateService(Printer* out, const ServiceDescriptor* service,
bool generate_client, bool generate_server, bool generate_client, bool generate_server,
bool internal_access) { bool internal_access) {
GenerateDocCommentBody(out, service); GenerateDocCommentBody(out, service);
@ -644,7 +643,7 @@ void GenerateService(Printer *out, const ServiceDescriptor *service,
} // anonymous namespace } // anonymous namespace
grpc::string GetServices(const FileDescriptor *file, bool generate_client, grpc::string GetServices(const FileDescriptor* file, bool generate_client,
bool generate_server, bool internal_access) { bool generate_server, bool internal_access) {
grpc::string output; grpc::string output;
{ {

@ -25,7 +25,7 @@
namespace grpc_csharp_generator { namespace grpc_csharp_generator {
grpc::string GetServices(const grpc::protobuf::FileDescriptor *file, grpc::string GetServices(const grpc::protobuf::FileDescriptor* file,
bool generate_client, bool generate_server, bool generate_client, bool generate_server,
bool internal_access); bool internal_access);

@ -24,8 +24,8 @@
namespace grpc_csharp_generator { namespace grpc_csharp_generator {
inline bool ServicesFilename(const grpc::protobuf::FileDescriptor *file, inline bool ServicesFilename(const grpc::protobuf::FileDescriptor* file,
grpc::string *file_name_or_error) { grpc::string* file_name_or_error) {
*file_name_or_error = *file_name_or_error =
grpc_generator::FileNameInUpperCamel(file, false) + "Grpc.cs"; grpc_generator::FileNameInUpperCamel(file, false) + "Grpc.cs";
return true; return true;
@ -34,7 +34,7 @@ inline bool ServicesFilename(const grpc::protobuf::FileDescriptor *file,
// Get leading or trailing comments in a string. Comment lines start with "// ". // Get leading or trailing comments in a string. Comment lines start with "// ".
// Leading detached comments are put in in front of leading comments. // Leading detached comments are put in in front of leading comments.
template <typename DescriptorType> template <typename DescriptorType>
inline grpc::string GetCsharpComments(const DescriptorType *desc, inline grpc::string GetCsharpComments(const DescriptorType* desc,
bool leading) { bool leading) {
return grpc_generator::GetPrefixedComments(desc, leading, "//"); return grpc_generator::GetPrefixedComments(desc, leading, "//");
} }

@ -29,10 +29,10 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
CSharpGrpcGenerator() {} CSharpGrpcGenerator() {}
~CSharpGrpcGenerator() {} ~CSharpGrpcGenerator() {}
bool Generate(const grpc::protobuf::FileDescriptor *file, bool Generate(const grpc::protobuf::FileDescriptor* file,
const grpc::string &parameter, const grpc::string& parameter,
grpc::protobuf::compiler::GeneratorContext *context, grpc::protobuf::compiler::GeneratorContext* context,
grpc::string *error) const { grpc::string* error) const {
std::vector<std::pair<grpc::string, grpc::string> > options; std::vector<std::pair<grpc::string, grpc::string> > options;
grpc::protobuf::compiler::ParseGeneratorParameter(parameter, &options); grpc::protobuf::compiler::ParseGeneratorParameter(parameter, &options);
@ -71,7 +71,7 @@ class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
} }
}; };
int main(int argc, char *argv[]) { int main(int argc, char* argv[]) {
CSharpGrpcGenerator generator; CSharpGrpcGenerator generator;
return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); return grpc::protobuf::compiler::PluginMain(argc, argv, &generator);
} }

@ -29,7 +29,7 @@
namespace grpc_generator { namespace grpc_generator {
inline bool StripSuffix(grpc::string *filename, const grpc::string &suffix) { inline bool StripSuffix(grpc::string* filename, const grpc::string& suffix) {
if (filename->length() >= suffix.length()) { if (filename->length() >= suffix.length()) {
size_t suffix_pos = filename->length() - suffix.length(); size_t suffix_pos = filename->length() - suffix.length();
if (filename->compare(suffix_pos, grpc::string::npos, suffix) == 0) { if (filename->compare(suffix_pos, grpc::string::npos, suffix) == 0) {
@ -41,7 +41,7 @@ inline bool StripSuffix(grpc::string *filename, const grpc::string &suffix) {
return false; return false;
} }
inline bool StripPrefix(grpc::string *name, const grpc::string &prefix) { inline bool StripPrefix(grpc::string* name, const grpc::string& prefix) {
if (name->length() >= prefix.length()) { if (name->length() >= prefix.length()) {
if (name->substr(0, prefix.size()) == prefix) { if (name->substr(0, prefix.size()) == prefix) {
*name = name->substr(prefix.size()); *name = name->substr(prefix.size());
@ -58,8 +58,8 @@ inline grpc::string StripProto(grpc::string filename) {
return filename; return filename;
} }
inline grpc::string StringReplace(grpc::string str, const grpc::string &from, inline grpc::string StringReplace(grpc::string str, const grpc::string& from,
const grpc::string &to, bool replace_all) { const grpc::string& to, bool replace_all) {
size_t pos = 0; size_t pos = 0;
do { do {
@ -74,13 +74,13 @@ inline grpc::string StringReplace(grpc::string str, const grpc::string &from,
return str; return str;
} }
inline grpc::string StringReplace(grpc::string str, const grpc::string &from, inline grpc::string StringReplace(grpc::string str, const grpc::string& from,
const grpc::string &to) { const grpc::string& to) {
return StringReplace(str, from, to, true); return StringReplace(str, from, to, true);
} }
inline std::vector<grpc::string> tokenize(const grpc::string &input, inline std::vector<grpc::string> tokenize(const grpc::string& input,
const grpc::string &delimiters) { const grpc::string& delimiters) {
std::vector<grpc::string> tokens; std::vector<grpc::string> tokens;
size_t pos, last_pos = 0; size_t pos, last_pos = 0;
@ -125,7 +125,7 @@ inline grpc::string LowerUnderscoreToUpperCamel(grpc::string str) {
} }
inline grpc::string FileNameInUpperCamel( inline grpc::string FileNameInUpperCamel(
const grpc::protobuf::FileDescriptor *file, bool include_package_path) { const grpc::protobuf::FileDescriptor* file, bool include_package_path) {
std::vector<grpc::string> tokens = tokenize(StripProto(file->name()), "/"); std::vector<grpc::string> tokens = tokenize(StripProto(file->name()), "/");
grpc::string result = ""; grpc::string result = "";
if (include_package_path) { if (include_package_path) {
@ -138,7 +138,7 @@ inline grpc::string FileNameInUpperCamel(
} }
inline grpc::string FileNameInUpperCamel( inline grpc::string FileNameInUpperCamel(
const grpc::protobuf::FileDescriptor *file) { const grpc::protobuf::FileDescriptor* file) {
return FileNameInUpperCamel(file, true); return FileNameInUpperCamel(file, true);
} }
@ -150,7 +150,7 @@ enum MethodType {
}; };
inline MethodType GetMethodType( inline MethodType GetMethodType(
const grpc::protobuf::MethodDescriptor *method) { const grpc::protobuf::MethodDescriptor* method) {
if (method->client_streaming()) { if (method->client_streaming()) {
if (method->server_streaming()) { if (method->server_streaming()) {
return METHODTYPE_BIDI_STREAMING; return METHODTYPE_BIDI_STREAMING;
@ -166,8 +166,8 @@ inline MethodType GetMethodType(
} }
} }
inline void Split(const grpc::string &s, char delim, inline void Split(const grpc::string& s, char delim,
std::vector<grpc::string> *append_to) { std::vector<grpc::string>* append_to) {
std::istringstream iss(s); std::istringstream iss(s);
grpc::string piece; grpc::string piece;
while (std::getline(iss, piece)) { while (std::getline(iss, piece)) {
@ -183,14 +183,14 @@ enum CommentType {
// Get all the raw comments and append each line without newline to out. // Get all the raw comments and append each line without newline to out.
template <typename DescriptorType> template <typename DescriptorType>
inline void GetComment(const DescriptorType *desc, CommentType type, inline void GetComment(const DescriptorType* desc, CommentType type,
std::vector<grpc::string> *out) { std::vector<grpc::string>* out) {
grpc::protobuf::SourceLocation location; grpc::protobuf::SourceLocation location;
if (!desc->GetSourceLocation(&location)) { if (!desc->GetSourceLocation(&location)) {
return; return;
} }
if (type == COMMENTTYPE_LEADING || type == COMMENTTYPE_TRAILING) { if (type == COMMENTTYPE_LEADING || type == COMMENTTYPE_TRAILING) {
const grpc::string &comments = type == COMMENTTYPE_LEADING const grpc::string& comments = type == COMMENTTYPE_LEADING
? location.leading_comments ? location.leading_comments
: location.trailing_comments; : location.trailing_comments;
Split(comments, '\n', out); Split(comments, '\n', out);
@ -210,8 +210,8 @@ inline void GetComment(const DescriptorType *desc, CommentType type,
// For file level leading and detached leading comments, we return comments // For file level leading and detached leading comments, we return comments
// above syntax line. Return nothing for trailing comments. // above syntax line. Return nothing for trailing comments.
template <> template <>
inline void GetComment(const grpc::protobuf::FileDescriptor *desc, inline void GetComment(const grpc::protobuf::FileDescriptor* desc,
CommentType type, std::vector<grpc::string> *out) { CommentType type, std::vector<grpc::string>* out) {
if (type == COMMENTTYPE_TRAILING) { if (type == COMMENTTYPE_TRAILING) {
return; return;
} }
@ -238,10 +238,10 @@ inline void GetComment(const grpc::protobuf::FileDescriptor *desc,
// Add prefix and newline to each comment line and concatenate them together. // Add prefix and newline to each comment line and concatenate them together.
// Make sure there is a space after the prefix unless the line is empty. // Make sure there is a space after the prefix unless the line is empty.
inline grpc::string GenerateCommentsWithPrefix( inline grpc::string GenerateCommentsWithPrefix(
const std::vector<grpc::string> &in, const grpc::string &prefix) { const std::vector<grpc::string>& in, const grpc::string& prefix) {
std::ostringstream oss; std::ostringstream oss;
for (auto it = in.begin(); it != in.end(); it++) { for (auto it = in.begin(); it != in.end(); it++) {
const grpc::string &elem = *it; const grpc::string& elem = *it;
if (elem.empty()) { if (elem.empty()) {
oss << prefix << "\n"; oss << prefix << "\n";
} else if (elem[0] == ' ') { } else if (elem[0] == ' ') {
@ -254,9 +254,9 @@ inline grpc::string GenerateCommentsWithPrefix(
} }
template <typename DescriptorType> template <typename DescriptorType>
inline grpc::string GetPrefixedComments(const DescriptorType *desc, inline grpc::string GetPrefixedComments(const DescriptorType* desc,
bool leading, bool leading,
const grpc::string &prefix) { const grpc::string& prefix) {
std::vector<grpc::string> out; std::vector<grpc::string> out;
if (leading) { if (leading) {
grpc_generator::GetComment( grpc_generator::GetComment(

@ -22,10 +22,10 @@
#include "src/compiler/generator_helpers.h" #include "src/compiler/generator_helpers.h"
#include "src/compiler/node_generator_helpers.h" #include "src/compiler/node_generator_helpers.h"
using grpc::protobuf::Descriptor;
using grpc::protobuf::FileDescriptor; using grpc::protobuf::FileDescriptor;
using grpc::protobuf::ServiceDescriptor;
using grpc::protobuf::MethodDescriptor; using grpc::protobuf::MethodDescriptor;
using grpc::protobuf::Descriptor; using grpc::protobuf::ServiceDescriptor;
using grpc::protobuf::io::Printer; using grpc::protobuf::io::Printer;
using grpc::protobuf::io::StringOutputStream; using grpc::protobuf::io::StringOutputStream;
using std::map; using std::map;
@ -53,15 +53,15 @@ grpc::string ModuleAlias(const grpc::string filename) {
// Given a filename like foo/bar/baz.proto, returns the corresponding JavaScript // Given a filename like foo/bar/baz.proto, returns the corresponding JavaScript
// message file foo/bar/baz.js // message file foo/bar/baz.js
grpc::string GetJSMessageFilename(const grpc::string &filename) { grpc::string GetJSMessageFilename(const grpc::string& filename) {
grpc::string name = filename; grpc::string name = filename;
return grpc_generator::StripProto(name) + "_pb.js"; return grpc_generator::StripProto(name) + "_pb.js";
} }
// Given a filename like foo/bar/baz.proto, returns the root directory // Given a filename like foo/bar/baz.proto, returns the root directory
// path ../../ // path ../../
grpc::string GetRootPath(const grpc::string &from_filename, grpc::string GetRootPath(const grpc::string& from_filename,
const grpc::string &to_filename) { const grpc::string& to_filename) {
if (to_filename.find("google/protobuf") == 0) { if (to_filename.find("google/protobuf") == 0) {
// Well-known types (.proto files in the google/protobuf directory) are // Well-known types (.proto files in the google/protobuf directory) are
// assumed to come from the 'google-protobuf' npm package. We may want to // assumed to come from the 'google-protobuf' npm package. We may want to
@ -82,24 +82,24 @@ grpc::string GetRootPath(const grpc::string &from_filename,
// Return the relative path to load to_file from the directory containing // Return the relative path to load to_file from the directory containing
// from_file, assuming that both paths are relative to the same directory // from_file, assuming that both paths are relative to the same directory
grpc::string GetRelativePath(const grpc::string &from_file, grpc::string GetRelativePath(const grpc::string& from_file,
const grpc::string &to_file) { const grpc::string& to_file) {
return GetRootPath(from_file, to_file) + to_file; return GetRootPath(from_file, to_file) + to_file;
} }
/* Finds all message types used in all services in the file, and returns them /* Finds all message types used in all services in the file, and returns them
* as a map of fully qualified message type name to message descriptor */ * as a map of fully qualified message type name to message descriptor */
map<grpc::string, const Descriptor *> GetAllMessages( map<grpc::string, const Descriptor*> GetAllMessages(
const FileDescriptor *file) { const FileDescriptor* file) {
map<grpc::string, const Descriptor *> message_types; map<grpc::string, const Descriptor*> message_types;
for (int service_num = 0; service_num < file->service_count(); for (int service_num = 0; service_num < file->service_count();
service_num++) { service_num++) {
const ServiceDescriptor *service = file->service(service_num); const ServiceDescriptor* service = file->service(service_num);
for (int method_num = 0; method_num < service->method_count(); for (int method_num = 0; method_num < service->method_count();
method_num++) { method_num++) {
const MethodDescriptor *method = service->method(method_num); const MethodDescriptor* method = service->method(method_num);
const Descriptor *input_type = method->input_type(); const Descriptor* input_type = method->input_type();
const Descriptor *output_type = method->output_type(); const Descriptor* output_type = method->output_type();
message_types[input_type->full_name()] = input_type; message_types[input_type->full_name()] = input_type;
message_types[output_type->full_name()] = output_type; message_types[output_type->full_name()] = output_type;
} }
@ -107,11 +107,11 @@ map<grpc::string, const Descriptor *> GetAllMessages(
return message_types; return message_types;
} }
grpc::string MessageIdentifierName(const grpc::string &name) { grpc::string MessageIdentifierName(const grpc::string& name) {
return grpc_generator::StringReplace(name, ".", "_"); return grpc_generator::StringReplace(name, ".", "_");
} }
grpc::string NodeObjectPath(const Descriptor *descriptor) { grpc::string NodeObjectPath(const Descriptor* descriptor) {
grpc::string module_alias = ModuleAlias(descriptor->file()->name()); grpc::string module_alias = ModuleAlias(descriptor->file()->name());
grpc::string name = descriptor->full_name(); grpc::string name = descriptor->full_name();
grpc_generator::StripPrefix(&name, descriptor->file()->package() + "."); grpc_generator::StripPrefix(&name, descriptor->file()->package() + ".");
@ -119,7 +119,7 @@ grpc::string NodeObjectPath(const Descriptor *descriptor) {
} }
// Prints out the message serializer and deserializer functions // Prints out the message serializer and deserializer functions
void PrintMessageTransformer(const Descriptor *descriptor, Printer *out) { void PrintMessageTransformer(const Descriptor* descriptor, Printer* out) {
map<grpc::string, grpc::string> template_vars; map<grpc::string, grpc::string> template_vars;
grpc::string full_name = descriptor->full_name(); grpc::string full_name = descriptor->full_name();
template_vars["identifier_name"] = MessageIdentifierName(full_name); template_vars["identifier_name"] = MessageIdentifierName(full_name);
@ -149,9 +149,9 @@ void PrintMessageTransformer(const Descriptor *descriptor, Printer *out) {
out->Print("}\n\n"); out->Print("}\n\n");
} }
void PrintMethod(const MethodDescriptor *method, Printer *out) { void PrintMethod(const MethodDescriptor* method, Printer* out) {
const Descriptor *input_type = method->input_type(); const Descriptor* input_type = method->input_type();
const Descriptor *output_type = method->output_type(); const Descriptor* output_type = method->output_type();
map<grpc::string, grpc::string> vars; map<grpc::string, grpc::string> vars;
vars["service_name"] = method->service()->full_name(); vars["service_name"] = method->service()->full_name();
vars["name"] = method->name(); vars["name"] = method->name();
@ -177,7 +177,7 @@ void PrintMethod(const MethodDescriptor *method, Printer *out) {
} }
// Prints out the service descriptor object // Prints out the service descriptor object
void PrintService(const ServiceDescriptor *service, Printer *out) { void PrintService(const ServiceDescriptor* service, Printer* out) {
map<grpc::string, grpc::string> template_vars; map<grpc::string, grpc::string> template_vars;
out->Print(GetNodeComments(service, true).c_str()); out->Print(GetNodeComments(service, true).c_str());
template_vars["name"] = service->name(); template_vars["name"] = service->name();
@ -200,7 +200,7 @@ void PrintService(const ServiceDescriptor *service, Printer *out) {
out->Print(GetNodeComments(service, false).c_str()); out->Print(GetNodeComments(service, false).c_str());
} }
void PrintImports(const FileDescriptor *file, Printer *out) { void PrintImports(const FileDescriptor* file, Printer* out) {
out->Print("var grpc = require('grpc');\n"); out->Print("var grpc = require('grpc');\n");
if (file->message_type_count() > 0) { if (file->message_type_count() > 0) {
grpc::string file_path = grpc::string file_path =
@ -219,9 +219,9 @@ void PrintImports(const FileDescriptor *file, Printer *out) {
out->Print("\n"); out->Print("\n");
} }
void PrintTransformers(const FileDescriptor *file, Printer *out) { void PrintTransformers(const FileDescriptor* file, Printer* out) {
map<grpc::string, const Descriptor *> messages = GetAllMessages(file); map<grpc::string, const Descriptor*> messages = GetAllMessages(file);
for (std::map<grpc::string, const Descriptor *>::iterator it = for (std::map<grpc::string, const Descriptor*>::iterator it =
messages.begin(); messages.begin();
it != messages.end(); it++) { it != messages.end(); it++) {
PrintMessageTransformer(it->second, out); PrintMessageTransformer(it->second, out);
@ -229,14 +229,14 @@ void PrintTransformers(const FileDescriptor *file, Printer *out) {
out->Print("\n"); out->Print("\n");
} }
void PrintServices(const FileDescriptor *file, Printer *out) { void PrintServices(const FileDescriptor* file, Printer* out) {
for (int i = 0; i < file->service_count(); i++) { for (int i = 0; i < file->service_count(); i++) {
PrintService(file->service(i), out); PrintService(file->service(i), out);
} }
} }
} } // namespace
grpc::string GenerateFile(const FileDescriptor *file) { grpc::string GenerateFile(const FileDescriptor* file) {
grpc::string output; grpc::string output;
{ {
StringOutputStream output_stream(&output); StringOutputStream output_stream(&output);

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

Loading…
Cancel
Save