diff options
author | Craig Tiller <ctiller@google.com> | 2015-05-26 08:43:09 -0700 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2015-05-26 08:43:09 -0700 |
commit | 0b877cecf76fa35c4aba9154aaf9cc468cd51fca (patch) | |
tree | 8b88937e016904db1a8f267ead4d1d59d8b5ff80 /src | |
parent | b04f072e6aa038a017d39623f5afd0f743948611 (diff) |
Allow destroy to be delayed instead of stalling
Diffstat (limited to 'src')
-rw-r--r-- | src/core/surface/server.c | 13 |
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) { |