diff options
author | 2017-04-15 00:07:25 +0000 | |
---|---|---|
committer | 2017-04-15 00:07:25 +0000 | |
commit | 26017de5d55f3ec5002afa0b97c7fe660d6144bf (patch) | |
tree | 24cd9937fdc57521ff2bac0afb387f3f60b2a411 /src/core/lib/iomgr/ev_epollex_linux.c | |
parent | 3d224e015e29a92690458865653bced97efe5b27 (diff) |
Fix leaked lock
Diffstat (limited to 'src/core/lib/iomgr/ev_epollex_linux.c')
-rw-r--r-- | src/core/lib/iomgr/ev_epollex_linux.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/core/lib/iomgr/ev_epollex_linux.c b/src/core/lib/iomgr/ev_epollex_linux.c index 0918b22e46..2c0fe42acc 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.c +++ b/src/core/lib/iomgr/ev_epollex_linux.c @@ -652,14 +652,7 @@ static grpc_error *pollset_kick_all(grpc_pollset *pollset) { return error; } -/* p->po.mu must be held before calling this function */ -static grpc_error *pollset_kick(grpc_pollset *pollset, - grpc_pollset_worker *specific_worker) { - pollable *p = pollset->current_pollable; - if (p != &pollset->pollable) { - gpr_mu_lock(&p->po.mu); - } - +static grpc_error *pollset_kick_inner(grpc_pollset *pollset, pollable *p, grpc_pollset_worker *specific_worker) { if (grpc_polling_trace) { gpr_log(GPR_DEBUG, "PS:%p kick %p tls_pollset=%p tls_worker=%p " @@ -710,6 +703,21 @@ static grpc_error *pollset_kick(grpc_pollset *pollset, gpr_cv_signal(&specific_worker->cv); return GRPC_ERROR_NONE; } + +} + +/* p->po.mu must be held before calling this function */ +static grpc_error *pollset_kick(grpc_pollset *pollset, + grpc_pollset_worker *specific_worker) { + pollable *p = pollset->current_pollable; + if (p != &pollset->pollable) { + gpr_mu_lock(&p->po.mu); + } + grpc_error *error = pollset_kick_inner(pollset, p, specific_worker); + if (p != &pollset->pollable) { + gpr_mu_unlock(&p->po.mu); + } + return error; } static grpc_error *kick_poller(void) { |