diff options
author | 2015-08-04 14:42:06 -0700 | |
---|---|---|
committer | 2015-08-04 14:42:06 -0700 | |
commit | b335256444349361cf406b14bc846611b7249056 (patch) | |
tree | 699eb467dd77a9ad368df9794c64086ba2f7dd27 /src/cpp | |
parent | 8956e606fbf30846ff07ac732cfb02d8d85b5e25 (diff) |
Add AsyncNotifyWhenDone
Diffstat (limited to 'src/cpp')
-rw-r--r-- | src/cpp/server/server_context.cc | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/cpp/server/server_context.cc b/src/cpp/server/server_context.cc index cf19556e7a..0d09519b28 100644 --- a/src/cpp/server/server_context.cc +++ b/src/cpp/server/server_context.cc @@ -57,9 +57,12 @@ class ServerContext::CompletionOp GRPC_FINAL : public CallOpSetInterface { bool CheckCancelled(CompletionQueue* cq); + void set_tag(void* tag) { tag_ = tag; } + void Unref(); private: + void* tag_; grpc::mutex mu_; int refs_; bool finalized_; @@ -90,18 +93,24 @@ void ServerContext::CompletionOp::FillOps(grpc_op* ops, size_t* nops) { bool ServerContext::CompletionOp::FinalizeResult(void** tag, bool* status) { grpc::unique_lock<grpc::mutex> lock(mu_); finalized_ = true; + bool ret = false; + if (tag_) { + *tag = tag_; + ret = true; + } if (!*status) cancelled_ = 1; if (--refs_ == 0) { lock.unlock(); delete this; } - return false; + return ret; } // ServerContext body ServerContext::ServerContext() : completion_op_(nullptr), + async_notify_when_done_tag_(nullptr), call_(nullptr), cq_(nullptr), sent_initial_metadata_(false) {} @@ -109,6 +118,7 @@ ServerContext::ServerContext() ServerContext::ServerContext(gpr_timespec deadline, grpc_metadata* metadata, size_t metadata_count) : completion_op_(nullptr), + async_notify_when_done_tag_(nullptr), deadline_(deadline), call_(nullptr), cq_(nullptr), @@ -133,6 +143,7 @@ ServerContext::~ServerContext() { void ServerContext::BeginCompletionOp(Call* call) { GPR_ASSERT(!completion_op_); completion_op_ = new CompletionOp(); + completion_op_->set_tag(async_notify_when_done_tag_); call->PerformOps(completion_op_); } |