Make Server::Wait work for async only server.

pull/7390/head
yang-g 8 years ago
parent a529300053
commit 05573f1692
  1. 2
      include/grpc++/server.h
  2. 5
      src/cpp/server/server.cc
  3. 18
      test/cpp/end2end/async_end2end_test.cc

@ -183,6 +183,8 @@ class Server GRPC_FINAL : public ServerInterface, private GrpcLibraryCodegen {
int num_running_cb_;
grpc::condition_variable callback_cv_;
grpc::condition_variable shutdown_cv_;
std::shared_ptr<GlobalCallbacks> global_callbacks_;
std::list<SyncRequest>* sync_methods_;

@ -462,14 +462,13 @@ void Server::ShutdownInternal(gpr_timespec deadline) {
while (num_running_cb_ != 0) {
callback_cv_.wait(lock);
}
shutdown_cv_.notify_all();
}
}
void Server::Wait() {
grpc::unique_lock<grpc::mutex> lock(mu_);
while (num_running_cb_ != 0) {
callback_cv_.wait(lock);
}
shutdown_cv_.wait(lock);
}
void Server::PerformOpsOnCall(CallOpSetInterface* ops, Call* call) {

@ -345,6 +345,24 @@ TEST_P(AsyncEnd2endTest, SequentialRpcs) {
SendRpc(10);
}
// We do not need to protect notify because the use is synchronized.
void ServerWait(Server* server, int* notify) {
server->Wait();
*notify = 1;
}
TEST_P(AsyncEnd2endTest, WaitAndShutdownTest) {
int notify = 0;
std::thread* wait_thread =
new std::thread(&ServerWait, server_.get(), &notify);
ResetStub();
SendRpc(1);
EXPECT_EQ(0, notify);
server_->Shutdown();
wait_thread->join();
EXPECT_EQ(1, notify);
delete wait_thread;
}
// Test a simple RPC using the async version of Next
TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
ResetStub();

Loading…
Cancel
Save