From 47a573602a27e718a7f13d5a9cceed7519e42234 Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Wed, 11 Feb 2015 16:31:45 -0800
Subject: [PATCH] Fix ownership

---
 include/grpc++/impl/call.h | 10 +++-------
 src/cpp/common/call.cc     |  4 ----
 src/cpp/server/server.cc   |  4 ++++
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h
index 5922e2581a..9ac92a00dd 100644
--- a/include/grpc++/impl/call.h
+++ b/include/grpc++/impl/call.h
@@ -112,11 +112,6 @@ class CallOpBuffer final : public CompletionQueueTag {
   grpc_metadata *trailing_metadata_ = nullptr;
 };
 
-class CCallDeleter {
- public:
-  void operator()(grpc_call *c);
-};
-
 // Channel and Server implement this to allow them to hook performing ops
 class CallHook {
  public:
@@ -127,17 +122,18 @@ class CallHook {
 // Straightforward wrapping of the C call object
 class Call final {
  public:
+  /* call is owned by the caller */
   Call(grpc_call *call, CallHook *call_hook_, CompletionQueue *cq);
 
   void PerformOps(CallOpBuffer *buffer);
 
-  grpc_call *call() { return call_.get(); }
+  grpc_call *call() { return call_; }
   CompletionQueue *cq() { return cq_; }
 
  private:
   CallHook *call_hook_;
   CompletionQueue *cq_;
-  std::unique_ptr<grpc_call, CCallDeleter> call_;
+  grpc_call* call_;
 };
 
 }  // namespace grpc
diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc
index 6148855337..84791aa0a4 100644
--- a/src/cpp/common/call.cc
+++ b/src/cpp/common/call.cc
@@ -243,10 +243,6 @@ void CallOpBuffer::FinalizeResult(void **tag, bool *status) {
   }
 }
 
-void CCallDeleter::operator()(grpc_call* c) {
-  grpc_call_destroy(c);
-}
-
 Call::Call(grpc_call* call, CallHook *call_hook, CompletionQueue* cq)
     : call_hook_(call_hook), cq_(cq), call_(call) {}
 
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index 4392739367..2ee8581548 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -157,6 +157,10 @@ class Server::MethodRequestData final : public CompletionQueueTag {
       mrd->request_metadata_.count = 0;
     }
 
+    ~CallData() {
+      grpc_call_destroy(call_.call());
+    }
+
     void Run() {
       std::unique_ptr<google::protobuf::Message> req;
       std::unique_ptr<google::protobuf::Message> res;
-- 
GitLab