aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/cpp/common
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2015-02-11 20:34:33 -0800
committerGravatar Craig Tiller <craig.tiller@gmail.com>2015-02-11 20:34:33 -0800
commit504bd331aba5817c2753c4f447f40cc83fa4d907 (patch)
treea109bb943793a758f505041508c2d06864856f10 /src/cpp/common
parent4dd70173bdf0754a039ddf634080e2fbf29d86e7 (diff)
Make sure we get a close before stopping the server
Diffstat (limited to 'src/cpp/common')
-rw-r--r--src/cpp/common/call.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc
index 6b1d99f739..d90ef0311e 100644
--- a/src/cpp/common/call.cc
+++ b/src/cpp/common/call.cc
@@ -78,6 +78,8 @@ void CallOpBuffer::Reset(void* next_return_tag) {
send_status_ = nullptr;
trailing_metadata_count_ = 0;
trailing_metadata_ = nullptr;
+
+ recv_closed_ = nullptr;
}
namespace {
@@ -134,6 +136,10 @@ void CallOpBuffer::AddClientSendClose() {
client_send_close_ = true;
}
+void CallOpBuffer::AddServerRecvClose(bool* cancelled) {
+ recv_closed_ = cancelled;
+}
+
void CallOpBuffer::AddClientRecvStatus(
std::multimap<grpc::string, grpc::string>* metadata, Status *status) {
recv_trailing_metadata_ = metadata;
@@ -205,6 +211,11 @@ void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) {
send_status_->details().c_str();
(*nops)++;
}
+ if (recv_closed_) {
+ ops[*nops].op = GRPC_OP_RECV_CLOSE_ON_SERVER;
+ ops[*nops].data.recv_close_on_server.cancelled = &cancelled_buf_;
+ (*nops)++;
+ }
}
void CallOpBuffer::FinalizeResult(void **tag, bool *status) {
@@ -241,6 +252,9 @@ void CallOpBuffer::FinalizeResult(void **tag, bool *status) {
status_details_ ? grpc::string(status_details_)
: grpc::string());
}
+ if (recv_closed_) {
+ *recv_closed_ = cancelled_buf_ != 0;
+ }
}
Call::Call(grpc_call* call, CallHook *call_hook, CompletionQueue* cq)