aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/surface/server.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-05-27 15:59:23 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-05-27 15:59:23 -0700
commit29f79dcb089872f3dd271d37a03d357e23bd5c7e (patch)
treecc706d3b6883ab9464c8a0d5f5d66cbeedb4a5be /src/core/surface/server.c
parente511fdbd51765b42068bea669dddd2ef85e75838 (diff)
Make C/C++ tests pass
Diffstat (limited to 'src/core/surface/server.c')
-rw-r--r--src/core/surface/server.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index b44cd112f3..b1e3ec9876 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -144,6 +144,7 @@ struct grpc_server {
requested_call_array requested_calls;
gpr_uint8 shutdown;
+ gpr_uint8 shutdown_published;
size_t num_shutdown_tags;
shutdown_tag *shutdown_tags;
@@ -389,7 +390,8 @@ static int num_listeners(grpc_server *server) {
static void maybe_finish_shutdown(grpc_server *server) {
size_t i;
- if (server->shutdown && server->lists[ALL_CALLS] == NULL && server->listeners_destroyed == num_listeners(server)) {
+ if (server->shutdown && !server->shutdown_published && server->lists[ALL_CALLS] == NULL && server->listeners_destroyed == num_listeners(server)) {
+ server->shutdown_published = 1;
for (i = 0; i < server->num_shutdown_tags; i++) {
grpc_cq_end_op(server->shutdown_tags[i].cq, server->shutdown_tags[i].tag,
NULL, 1);
@@ -456,8 +458,9 @@ static void server_on_recv(void *ptr, int success) {
calld->state = ZOMBIED;
grpc_iomgr_add_callback(kill_zombie, elem);
}
- call_list_remove(calld, ALL_CALLS);
- maybe_finish_shutdown(chand->server);
+ if (call_list_remove(calld, ALL_CALLS)) {
+ maybe_finish_shutdown(chand->server);
+ }
gpr_mu_unlock(&chand->server->mu);
break;
}
@@ -822,9 +825,7 @@ void grpc_server_shutdown_and_notify(grpc_server *server,
/* lock, and gather up some stuff to do */
gpr_mu_lock(&server->mu);
- for (i = 0; i < server->cq_count; i++) {
- grpc_cq_begin_op(server->cqs[i], NULL);
- }
+ grpc_cq_begin_op(cq, NULL);
server->shutdown_tags =
gpr_realloc(server->shutdown_tags,
sizeof(void *) * (server->num_shutdown_tags + 1));