diff options
-rw-r--r-- | BUILD | 2 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | build.yaml | 1 | ||||
-rw-r--r-- | include/grpc++/impl/codegen/proto_utils.h | 56 | ||||
-rw-r--r-- | src/cpp/proto/proto_serializer.cc | 41 | ||||
-rw-r--r-- | src/cpp/proto/proto_utils.cc | 10 | ||||
-rw-r--r-- | tools/doxygen/Doxyfile.c++.internal | 1 | ||||
-rw-r--r-- | tools/run_tests/sources_and_headers.json | 2 | ||||
-rw-r--r-- | vsprojects/vcxproj/grpc++/grpc++.vcxproj | 2 | ||||
-rw-r--r-- | vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters | 3 | ||||
-rw-r--r-- | vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj | 2 | ||||
-rw-r--r-- | vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters | 3 |
12 files changed, 110 insertions, 15 deletions
@@ -822,6 +822,7 @@ cc_library( "src/cpp/common/channel_arguments.cc", "src/cpp/common/completion_queue.cc", "src/cpp/common/rpc_method.cc", + "src/cpp/proto/proto_serializer.cc", "src/cpp/proto/proto_utils.cc", "src/cpp/server/async_generic_service.cc", "src/cpp/server/create_default_thread_pool.cc", @@ -945,6 +946,7 @@ cc_library( "src/cpp/common/channel_arguments.cc", "src/cpp/common/completion_queue.cc", "src/cpp/common/rpc_method.cc", + "src/cpp/proto/proto_serializer.cc", "src/cpp/proto/proto_utils.cc", "src/cpp/server/async_generic_service.cc", "src/cpp/server/create_default_thread_pool.cc", @@ -2994,6 +2994,7 @@ LIBGRPC++_SRC = \ src/cpp/common/channel_arguments.cc \ src/cpp/common/completion_queue.cc \ src/cpp/common/rpc_method.cc \ + src/cpp/proto/proto_serializer.cc \ src/cpp/proto/proto_utils.cc \ src/cpp/server/async_generic_service.cc \ src/cpp/server/create_default_thread_pool.cc \ @@ -3274,6 +3275,7 @@ LIBGRPC++_UNSECURE_SRC = \ src/cpp/common/channel_arguments.cc \ src/cpp/common/completion_queue.cc \ src/cpp/common/rpc_method.cc \ + src/cpp/proto/proto_serializer.cc \ src/cpp/proto/proto_utils.cc \ src/cpp/server/async_generic_service.cc \ src/cpp/server/create_default_thread_pool.cc \ diff --git a/build.yaml b/build.yaml index a277539a05..eb1031e315 100644 --- a/build.yaml +++ b/build.yaml @@ -188,6 +188,7 @@ filegroups: - src/cpp/common/channel_arguments.cc - src/cpp/common/completion_queue.cc - src/cpp/common/rpc_method.cc + - src/cpp/proto/proto_serializer.cc - src/cpp/proto/proto_utils.cc - src/cpp/server/async_generic_service.cc - src/cpp/server/create_default_thread_pool.cc diff --git a/include/grpc++/impl/codegen/proto_utils.h b/include/grpc++/impl/codegen/proto_utils.h index ce177104e0..489293d25b 100644 --- a/include/grpc++/impl/codegen/proto_utils.h +++ b/include/grpc++/impl/codegen/proto_utils.h @@ -37,21 +37,52 @@ #include <type_traits> #include <grpc/impl/codegen/byte_buffer.h> +#include <grpc/impl/codegen/log.h> #include <grpc++/impl/codegen/serialization_traits.h> #include <grpc++/impl/codegen/config_protobuf.h> #include <grpc++/impl/codegen/status.h> namespace grpc { -// Serialize the msg into a buffer created inside the function. The caller -// should destroy the returned buffer when done with it. If serialization fails, -// false is returned and buffer is left unchanged. -Status SerializeProto(const grpc::protobuf::Message& msg, - grpc_byte_buffer** buffer); +class ProtoSerializerInterface { + public: + // Serialize the msg into a buffer created inside the function. The caller + // should destroy the returned buffer when done with it. If serialization + // fails, + // false is returned and buffer is left unchanged. + virtual Status SerializeProto(const grpc::protobuf::Message& msg, + grpc_byte_buffer** buffer) = 0; + + // The caller keeps ownership of buffer and msg. + virtual Status DeserializeProto(grpc_byte_buffer* buffer, + grpc::protobuf::Message* msg, + int max_message_size) = 0; +}; + +// TODO(dgq): This is a temporary fix to work around codegen issues related to +// a certain sharp-sounding build system. Its purpose is to hold a polymorphic +// proto serializer/deserializer instance. It's initialized as part of +// src/cpp/proto/proto_serializer.cc. +// +// This global variable plus all related code (ProtoSerializerInteface, +// ProtoSerializer) will be removed in the future. +extern ProtoSerializerInterface* g_proto_serializer; + +class ProtoSerializer : public ProtoSerializerInterface { + public: + // Serialize the msg into a buffer created inside the function. The caller + // should destroy the returned buffer when done with it. If serialization + // fails, + // false is returned and buffer is left unchanged. + Status SerializeProto(const grpc::protobuf::Message& msg, + grpc_byte_buffer** buffer) override; + + // The caller keeps ownership of buffer and msg. + Status DeserializeProto(grpc_byte_buffer* buffer, + grpc::protobuf::Message* msg, + int max_message_size) override; +}; -// The caller keeps ownership of buffer and msg. -Status DeserializeProto(grpc_byte_buffer* buffer, grpc::protobuf::Message* msg, - int max_message_size); template <class T> class SerializationTraits<T, typename std::enable_if<std::is_base_of< @@ -60,12 +91,17 @@ class SerializationTraits<T, typename std::enable_if<std::is_base_of< static Status Serialize(const grpc::protobuf::Message& msg, grpc_byte_buffer** buffer, bool* own_buffer) { *own_buffer = true; - return SerializeProto(msg, buffer); + GPR_ASSERT(g_proto_serializer != nullptr && + "No ProtoSerializer instance registered. Make sure grpc++ is being initialized."); + return g_proto_serializer->SerializeProto(msg, buffer); } static Status Deserialize(grpc_byte_buffer* buffer, grpc::protobuf::Message* msg, int max_message_size) { - auto status = DeserializeProto(buffer, msg, max_message_size); + GPR_ASSERT(g_proto_serializer != nullptr && + "No ProtoSerializer instance registered. Make sure grpc++ is being initialized."); + auto status = + g_proto_serializer->DeserializeProto(buffer, msg, max_message_size); grpc_byte_buffer_destroy(buffer); return status; } diff --git a/src/cpp/proto/proto_serializer.cc b/src/cpp/proto/proto_serializer.cc new file mode 100644 index 0000000000..4e46e989aa --- /dev/null +++ b/src/cpp/proto/proto_serializer.cc @@ -0,0 +1,41 @@ +/* + * + * Copyright 2016, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// TODO(dgq): This file is part of a temporary fix to work around codegen issues related to +// a certain sharp-sounding build system. +// This whole file will be removed in the future. + +#include <grpc++/impl/proto_utils.h> + +static grpc::ProtoSerializer proto_serializer; +grpc::ProtoSerializerInterface* grpc::g_proto_serializer = &proto_serializer; diff --git a/src/cpp/proto/proto_utils.cc b/src/cpp/proto/proto_utils.cc index 79e7bf1801..aca646021f 100644 --- a/src/cpp/proto/proto_utils.cc +++ b/src/cpp/proto/proto_utils.cc @@ -38,7 +38,6 @@ #include <grpc/grpc.h> #include <grpc/byte_buffer.h> #include <grpc/byte_buffer_reader.h> -#include <grpc/support/log.h> #include <grpc/support/slice.h> #include <grpc/support/slice_buffer.h> #include <grpc/support/port_platform.h> @@ -164,8 +163,8 @@ class GrpcBufferReader GRPC_FINAL namespace grpc { -Status SerializeProto(const grpc::protobuf::Message& msg, - grpc_byte_buffer** bp) { +Status ProtoSerializer::SerializeProto(const grpc::protobuf::Message& msg, + grpc_byte_buffer** bp) { GPR_TIMER_SCOPE("SerializeProto", 0); int byte_size = msg.ByteSize(); if (byte_size <= kMaxBufferLength) { @@ -183,8 +182,9 @@ Status SerializeProto(const grpc::protobuf::Message& msg, } } -Status DeserializeProto(grpc_byte_buffer* buffer, grpc::protobuf::Message* msg, - int max_message_size) { +Status ProtoSerializer::DeserializeProto(grpc_byte_buffer* buffer, + grpc::protobuf::Message* msg, + int max_message_size) { GPR_TIMER_SCOPE("DeserializeProto", 0); if (!buffer) { return Status(StatusCode::INTERNAL, "No payload"); diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index a285310847..bb4058fae0 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -858,6 +858,7 @@ src/cpp/common/call.cc \ src/cpp/common/channel_arguments.cc \ src/cpp/common/completion_queue.cc \ src/cpp/common/rpc_method.cc \ +src/cpp/proto/proto_serializer.cc \ src/cpp/proto/proto_utils.cc \ src/cpp/server/async_generic_service.cc \ src/cpp/server/create_default_thread_pool.cc \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 0c7a6c7b5f..65666e33f1 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -5051,6 +5051,7 @@ "src/cpp/common/secure_auth_context.h", "src/cpp/common/secure_channel_arguments.cc", "src/cpp/common/secure_create_auth_context.cc", + "src/cpp/proto/proto_serializer.cc", "src/cpp/proto/proto_utils.cc", "src/cpp/server/async_generic_service.cc", "src/cpp/server/create_default_thread_pool.cc", @@ -5305,6 +5306,7 @@ "src/cpp/common/create_auth_context.h", "src/cpp/common/insecure_create_auth_context.cc", "src/cpp/common/rpc_method.cc", + "src/cpp/proto/proto_serializer.cc", "src/cpp/proto/proto_utils.cc", "src/cpp/server/async_generic_service.cc", "src/cpp/server/create_default_thread_pool.cc", diff --git a/vsprojects/vcxproj/grpc++/grpc++.vcxproj b/vsprojects/vcxproj/grpc++/grpc++.vcxproj index 0b8c345196..f55e94f120 100644 --- a/vsprojects/vcxproj/grpc++/grpc++.vcxproj +++ b/vsprojects/vcxproj/grpc++/grpc++.vcxproj @@ -377,6 +377,8 @@ </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\common\rpc_method.cc"> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_serializer.cc"> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_utils.cc"> </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\server\async_generic_service.cc"> diff --git a/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters b/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters index 0f3dccf17c..ca4bed0793 100644 --- a/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/vcxproj/grpc++/grpc++.vcxproj.filters @@ -52,6 +52,9 @@ <ClCompile Include="$(SolutionDir)\..\src\cpp\common\rpc_method.cc"> <Filter>src\cpp\common</Filter> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_serializer.cc"> + <Filter>src\cpp\proto</Filter> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_utils.cc"> <Filter>src\cpp\proto</Filter> </ClCompile> diff --git a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj index 2dcadbaec0..60af981479 100644 --- a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -364,6 +364,8 @@ </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\common\rpc_method.cc"> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_serializer.cc"> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_utils.cc"> </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\server\async_generic_service.cc"> diff --git a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index 3572c651b6..f2982e944d 100644 --- a/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -37,6 +37,9 @@ <ClCompile Include="$(SolutionDir)\..\src\cpp\common\rpc_method.cc"> <Filter>src\cpp\common</Filter> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_serializer.cc"> + <Filter>src\cpp\proto</Filter> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\cpp\proto\proto_utils.cc"> <Filter>src\cpp\proto</Filter> </ClCompile> |