aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-05-26 08:43:09 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-05-26 08:43:09 -0700
commit0b877cecf76fa35c4aba9154aaf9cc468cd51fca (patch)
tree8b88937e016904db1a8f267ead4d1d59d8b5ff80 /src
parentb04f072e6aa038a017d39623f5afd0f743948611 (diff)
Allow destroy to be delayed instead of stalling
Diffstat (limited to 'src')
-rw-r--r--src/core/surface/server.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index d75af7291b..5f963d2f8c 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -908,6 +908,10 @@ void grpc_server_listener_destroy_done(void *s) {
gpr_mu_unlock(&server->mu);
}
+static void continue_server_shutdown(void *server, int iomgr_success) {
+ grpc_server_destroy(server);
+}
+
void grpc_server_destroy(grpc_server *server) {
channel_data *c;
listener *l;
@@ -921,15 +925,14 @@ void grpc_server_destroy(grpc_server *server) {
gpr_mu_lock(&server->mu);
}
- while (server->listeners_destroyed != num_listeners(server)) {
+ if (server->listeners_destroyed != num_listeners(server)) {
+ gpr_mu_unlock(&server->mu);
for (i = 0; i < server->cq_count; i++) {
- gpr_mu_unlock(&server->mu);
grpc_cq_hack_spin_pollset(server->cqs[i]);
- gpr_mu_lock(&server->mu);
}
- gpr_cv_wait(&server->cv, &server->mu,
- gpr_time_add(gpr_now(), gpr_time_from_millis(100)));
+ grpc_iomgr_add_callback(continue_server_shutdown, server);
+ return;
}
while (server->listeners) {