Add call as param to MethodHandler::Deserialize to allow arena use

pull/17036/head
Vijay Pai 6 years ago
parent 01313976e1
commit 371b1d99d5
  1. 23
      include/grpcpp/impl/codegen/method_handler_impl.h
  2. 3
      include/grpcpp/impl/codegen/rpc_service_method.h
  3. 3
      src/cpp/server/server_cc.cc

@ -66,7 +66,7 @@ class RpcMethodHandler : public MethodHandler {
return func_(service_, param.server_context, return func_(service_, param.server_context,
static_cast<RequestType*>(param.request), &rsp); static_cast<RequestType*>(param.request), &rsp);
}); });
delete static_cast<RequestType*>(param.request); static_cast<RequestType*>(param.request)->~RequestType();
} }
GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_); GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_);
@ -86,16 +86,18 @@ class RpcMethodHandler : public MethodHandler {
param.call->cq()->Pluck(&ops); param.call->cq()->Pluck(&ops);
} }
void* Deserialize(grpc_byte_buffer* req, Status* status) final { void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
Status* status) final {
ByteBuffer buf; ByteBuffer buf;
buf.set_buffer(req); buf.set_buffer(req);
auto* request = new RequestType(); auto* request = new (g_core_codegen_interface->grpc_call_arena_alloc(
call, sizeof(RequestType))) RequestType();
*status = SerializationTraits<RequestType>::Deserialize(&buf, request); *status = SerializationTraits<RequestType>::Deserialize(&buf, request);
buf.Release(); buf.Release();
if (status->ok()) { if (status->ok()) {
return request; return request;
} }
delete request; request->~RequestType();
return nullptr; return nullptr;
} }
@ -170,7 +172,7 @@ class ServerStreamingHandler : public MethodHandler {
return func_(service_, param.server_context, return func_(service_, param.server_context,
static_cast<RequestType*>(param.request), &writer); static_cast<RequestType*>(param.request), &writer);
}); });
delete static_cast<RequestType*>(param.request); static_cast<RequestType*>(param.request)->~RequestType();
} }
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops; CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops;
@ -189,16 +191,18 @@ class ServerStreamingHandler : public MethodHandler {
param.call->cq()->Pluck(&ops); param.call->cq()->Pluck(&ops);
} }
void* Deserialize(grpc_byte_buffer* req, Status* status) final { void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
Status* status) final {
ByteBuffer buf; ByteBuffer buf;
buf.set_buffer(req); buf.set_buffer(req);
auto* request = new RequestType(); auto* request = new (g_core_codegen_interface->grpc_call_arena_alloc(
call, sizeof(RequestType))) RequestType();
*status = SerializationTraits<RequestType>::Deserialize(&buf, request); *status = SerializationTraits<RequestType>::Deserialize(&buf, request);
buf.Release(); buf.Release();
if (status->ok()) { if (status->ok()) {
return request; return request;
} }
delete request; request->~RequestType();
return nullptr; return nullptr;
} }
@ -323,7 +327,8 @@ class ErrorMethodHandler : public MethodHandler {
param.call->cq()->Pluck(&ops); param.call->cq()->Pluck(&ops);
} }
void* Deserialize(grpc_byte_buffer* req, Status* status) final { void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
Status* status) final {
// We have to destroy any request payload // We have to destroy any request payload
if (req != nullptr) { if (req != nullptr) {
g_core_codegen_interface->grpc_byte_buffer_destroy(req); g_core_codegen_interface->grpc_byte_buffer_destroy(req);

@ -56,7 +56,8 @@ class MethodHandler {
a HandlerParameter and passed to RunHandler. It is illegal to access the a HandlerParameter and passed to RunHandler. It is illegal to access the
pointer after calling RunHandler. Ownership of the deserialized request is pointer after calling RunHandler. Ownership of the deserialized request is
retained by the handler. Returns nullptr if deserialization failed. */ retained by the handler. Returns nullptr if deserialization failed. */
virtual void* Deserialize(grpc_byte_buffer* req, Status* status) { virtual void* Deserialize(grpc_call* call, grpc_byte_buffer* req,
Status* status) {
GPR_CODEGEN_ASSERT(req == nullptr); GPR_CODEGEN_ASSERT(req == nullptr);
return nullptr; return nullptr;
} }

@ -256,7 +256,8 @@ class Server::SyncRequest final : public internal::CompletionQueueTag {
// Set interception point for RECV MESSAGE // Set interception point for RECV MESSAGE
auto* handler = resources_ ? method_->handler() auto* handler = resources_ ? method_->handler()
: server_->resource_exhausted_handler_.get(); : server_->resource_exhausted_handler_.get();
request_ = handler->Deserialize(request_payload_, &request_status_); request_ = handler->Deserialize(call_.call(), request_payload_,
&request_status_);
request_payload_ = nullptr; request_payload_ = nullptr;
interceptor_methods_.AddInterceptionHookPoint( interceptor_methods_.AddInterceptionHookPoint(

Loading…
Cancel
Save