diff --git a/include/grpcpp/impl/codegen/method_handler_impl.h b/include/grpcpp/impl/codegen/method_handler_impl.h index 4f02e3e39b9..dd53f975f68 100644 --- a/include/grpcpp/impl/codegen/method_handler_impl.h +++ b/include/grpcpp/impl/codegen/method_handler_impl.h @@ -66,7 +66,7 @@ class RpcMethodHandler : public MethodHandler { return func_(service_, param.server_context, static_cast(param.request), &rsp); }); - delete static_cast(param.request); + static_cast(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::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(param.request), &writer); }); - delete static_cast(param.request); + static_cast(param.request)->~RequestType(); } CallOpSet 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::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); diff --git a/include/grpcpp/impl/codegen/rpc_service_method.h b/include/grpcpp/impl/codegen/rpc_service_method.h index 44da2bd7689..e77f4046a3f 100644 --- a/include/grpcpp/impl/codegen/rpc_service_method.h +++ b/include/grpcpp/impl/codegen/rpc_service_method.h @@ -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; } diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc index 59a531e2725..82a9d719faa 100644 --- a/src/cpp/server/server_cc.cc +++ b/src/cpp/server/server_cc.cc @@ -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(