diff options
author | 2016-10-17 15:00:20 -0700 | |
---|---|---|
committer | 2016-10-17 15:00:20 -0700 | |
commit | d9b763ba6d1e0294c0c1e2b2c5cd8f29bb4aeb6f (patch) | |
tree | fca143e80b8280aaa43e3ba27646ee672bda03ed /src/core/lib/iomgr/tcp_server_posix.c | |
parent | 4e826be32ee6d67f3e71971e3475fdd8d2f6176c (diff) | |
parent | bb4c5f3d3fd5217c680bbdf3c429b73d7662bbab (diff) |
Merge branch 'master' into server_port_index
Diffstat (limited to 'src/core/lib/iomgr/tcp_server_posix.c')
-rw-r--r-- | src/core/lib/iomgr/tcp_server_posix.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 596f8280d4..4f49dad815 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -191,6 +191,9 @@ grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete, } static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { + gpr_mu_lock(&s->mu); + GPR_ASSERT(s->shutdown); + gpr_mu_unlock(&s->mu); if (s->shutdown_complete != NULL) { grpc_exec_ctx_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE, NULL); } @@ -648,7 +651,7 @@ done: } } -/* Return listener at port_index or NULL. */ +/* Return listener at port_index or NULL. Should only be called with s->mu locked. */ static grpc_tcp_listener *get_port_index(grpc_tcp_server *s, unsigned port_index) { unsigned num_ports = 0; @@ -666,21 +669,26 @@ static grpc_tcp_listener *get_port_index(grpc_tcp_server *s, unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s, unsigned port_index) { unsigned num_fds = 0; + gpr_mu_lock(&s->mu); grpc_tcp_listener *sp = get_port_index(s, port_index); for (; sp; sp = sp->sibling) { ++num_fds; } + gpr_mu_unlock(&s->mu); return num_fds; } int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index, unsigned fd_index) { + gpr_mu_lock(&s->mu); grpc_tcp_listener *sp = get_port_index(s, port_index); for (; sp; sp = sp->sibling, --fd_index) { if (fd_index == 0) { + gpr_mu_unlock(&s->mu); return sp->fd; } } + gpr_mu_unlock(&s->mu); return -1; } @@ -727,7 +735,7 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s, } grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) { - gpr_ref(&s->refs); + gpr_ref_non_zero(&s->refs); return s; } @@ -741,19 +749,11 @@ void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s, void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { if (gpr_unref(&s->refs)) { - /* Complete shutdown_starting work before destroying. */ - grpc_exec_ctx local_exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_tcp_server_shutdown_listeners(exec_ctx, s); gpr_mu_lock(&s->mu); - grpc_exec_ctx_enqueue_list(&local_exec_ctx, &s->shutdown_starting, NULL); + grpc_exec_ctx_enqueue_list(exec_ctx, &s->shutdown_starting, NULL); gpr_mu_unlock(&s->mu); - if (exec_ctx == NULL) { - grpc_exec_ctx_flush(&local_exec_ctx); - tcp_server_destroy(&local_exec_ctx, s); - grpc_exec_ctx_finish(&local_exec_ctx); - } else { - grpc_exec_ctx_finish(&local_exec_ctx); - tcp_server_destroy(exec_ctx, s); - } + tcp_server_destroy(exec_ctx, s); } } |