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,
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_);
@ -86,16 +86,18 @@ class RpcMethodHandler : public MethodHandler {
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;
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);
buf.Release();
if (status->ok()) {
return request;
}
delete request;
request->~RequestType();
return nullptr;
}
@ -170,7 +172,7 @@ class ServerStreamingHandler : public MethodHandler {
return func_(service_, param.server_context,
static_cast<RequestType*>(param.request), &writer);
});
delete static_cast<RequestType*>(param.request);
static_cast<RequestType*>(param.request)->~RequestType();
}
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops;
@ -189,16 +191,18 @@ class ServerStreamingHandler : public MethodHandler {
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;
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);
buf.Release();
if (status->ok()) {
return request;
}
delete request;
request->~RequestType();
return nullptr;
}
@ -323,7 +327,8 @@ class ErrorMethodHandler : public MethodHandler {
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
if (req != nullptr) {
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
pointer after calling RunHandler. Ownership of the deserialized request is
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);
return nullptr;
}

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

Loading…
Cancel
Save