aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/grpc++/server.h5
-rw-r--r--src/cpp/server/server.cc25
2 files changed, 20 insertions, 10 deletions
diff --git a/include/grpc++/server.h b/include/grpc++/server.h
index 26d18d1bbe..429c0ff3cf 100644
--- a/include/grpc++/server.h
+++ b/include/grpc++/server.h
@@ -69,6 +69,11 @@ class Server final : private CallHook,
// Shutdown the server, block until all rpc processing finishes.
void Shutdown();
+ // Block waiting for all work to complete (the server must either
+ // be shutting down or some other thread must call Shutdown for this
+ // function to ever return)
+ void Wait();
+
private:
friend class ServerBuilder;
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index f565d3aa5d..178fa1a716 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -265,21 +265,26 @@ bool Server::Start() {
}
void Server::Shutdown() {
- {
- std::unique_lock<std::mutex> lock(mu_);
- if (started_ && !shutdown_) {
- shutdown_ = true;
- grpc_server_shutdown(server_);
- cq_.Shutdown();
+ std::unique_lock<std::mutex> lock(mu_);
+ if (started_ && !shutdown_) {
+ shutdown_ = true;
+ grpc_server_shutdown(server_);
+ cq_.Shutdown();
- // Wait for running callbacks to finish.
- while (num_running_cb_ != 0) {
- callback_cv_.wait(lock);
- }
+ // Wait for running callbacks to finish.
+ while (num_running_cb_ != 0) {
+ callback_cv_.wait(lock);
}
}
}
+void Server::Wait() {
+ std::unique_lock<std::mutex> lock(mu_);
+ while (num_running_cb_ != 0) {
+ callback_cv_.wait(lock);
+ }
+}
+
void Server::PerformOpsOnCall(CallOpBuffer* buf, Call* call) {
static const size_t MAX_OPS = 8;
size_t nops = MAX_OPS;