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(
std::shared_ptr<ServerCredentials> creds,
const int port,
std::condition_variable *server_started_condition) {
ServerStartedCondition *server_started_condition) {
GPR_ASSERT(port != 0);
std::ostringstream server_address;
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());
// 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)) {
gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),

@ -52,6 +52,12 @@ namespace interop {
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.
///
/// \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 port Port to use for the server.
/// \param server_started_condition (optional) Condition variable used to notify
/// when the server has started.
/// \param server_started_condition (optional) Struct holding mutex, condition
/// variable, and condition used to notify when the server has started.
void RunServer(std::shared_ptr<ServerCredentials> creds,
int port,
std::condition_variable *server_started_condition);
ServerStartedCondition *server_started_condition);
} // namespace interop
} // namespace testing

Loading…
Cancel
Save