Add ServerStartedCondition to hold the mutex, condition variable and condition. Changes allow callers to correctly handle spurious wakeups.

pull/13329/head
Dan Wittmer 7 years ago
parent 728f1d2c44
commit 6d18fcd3ab
  1. 8
      test/cpp/interop/interop_server.cc
  2. 12
      test/cpp/interop/server_helper.h

@ -323,7 +323,7 @@ void grpc::testing::interop::RunServer(
void grpc::testing::interop::RunServer( void grpc::testing::interop::RunServer(
std::shared_ptr<ServerCredentials> creds, std::shared_ptr<ServerCredentials> creds,
const int port, const int port,
std::condition_variable *server_started_condition) { ServerStartedCondition *server_started_condition) {
GPR_ASSERT(port != 0); GPR_ASSERT(port != 0);
std::ostringstream server_address; std::ostringstream server_address;
server_address << "0.0.0.0:" << port; server_address << "0.0.0.0:" << port;
@ -342,7 +342,11 @@ void grpc::testing::interop::RunServer(
gpr_log(GPR_INFO, "Server listening on %s", server_address.str().c_str()); gpr_log(GPR_INFO, "Server listening on %s", server_address.str().c_str());
// Signal that the server has started. // Signal that the server has started.
if (server_started_condition) server_started_condition->notify_all(); if (server_started_condition) {
std::unique_lock<std::mutex> lock(server_started_condition->mutex);
server_started_condition->server_started = true;
server_started_condition->condition.notify_all();
}
while (!gpr_atm_no_barrier_load(&g_got_sigint)) { while (!gpr_atm_no_barrier_load(&g_got_sigint)) {
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),

@ -52,6 +52,12 @@ namespace interop {
extern gpr_atm g_got_sigint; extern gpr_atm g_got_sigint;
struct ServerStartedCondition {
std::mutex mutex;
std::condition_variable condition;
bool server_started = false;
};
/// Run gRPC interop server using port FLAGS_port. /// Run gRPC interop server using port FLAGS_port.
/// ///
/// \param creds The credentials associated with the server. /// \param creds The credentials associated with the server.
@ -61,11 +67,11 @@ void RunServer(std::shared_ptr<ServerCredentials> creds);
/// ///
/// \param creds The credentials associated with the server. /// \param creds The credentials associated with the server.
/// \param port Port to use for the server. /// \param port Port to use for the server.
/// \param server_started_condition (optional) Condition variable used to notify /// \param server_started_condition (optional) Struct holding mutex, condition
/// when the server has started. /// variable, and condition used to notify when the server has started.
void RunServer(std::shared_ptr<ServerCredentials> creds, void RunServer(std::shared_ptr<ServerCredentials> creds,
int port, int port,
std::condition_variable *server_started_condition); ServerStartedCondition *server_started_condition);
} // namespace interop } // namespace interop
} // namespace testing } // namespace testing

Loading…
Cancel
Save