diff options
author | 2016-03-04 14:52:06 -0800 | |
---|---|---|
committer | 2016-03-04 14:52:06 -0800 | |
commit | b3320fc7c387c0105aeb13911288ec33e9f9470e (patch) | |
tree | 362510822e5f2aff50a82b8489875bcad953a1b3 /src/core/iomgr/pollset_multipoller_with_poll_posix.c | |
parent | a8712e01fc73e00e1aef84ce690b00fda6a759c0 (diff) |
Fix race in poll() based pollset
It was possible for entries in watchers[] to be deleted by another thread before we called begin_poll.
I'd like to do something nicer than this eventually... but that'll be easier once we've got the polling loop cleaned up (which is currently WIP)
Diffstat (limited to 'src/core/iomgr/pollset_multipoller_with_poll_posix.c')
-rw-r--r-- | src/core/iomgr/pollset_multipoller_with_poll_posix.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/core/iomgr/pollset_multipoller_with_poll_posix.c b/src/core/iomgr/pollset_multipoller_with_poll_posix.c index 4dddfff230..0a447ba96c 100644 --- a/src/core/iomgr/pollset_multipoller_with_poll_posix.c +++ b/src/core/iomgr/pollset_multipoller_with_poll_posix.c @@ -122,6 +122,7 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock( } else { h->fds[fd_count++] = h->fds[i]; watchers[pfd_count].fd = h->fds[i]; + GRPC_FD_REF(watchers[pfd_count].fd, "multipoller_start"); pfds[pfd_count].fd = h->fds[i]->fd; pfds[pfd_count].revents = 0; pfd_count++; @@ -135,8 +136,10 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock( gpr_mu_unlock(&pollset->mu); for (i = 2; i < pfd_count; i++) { - pfds[i].events = (short)grpc_fd_begin_poll(watchers[i].fd, pollset, worker, + grpc_fd *fd = watchers[i].fd; + pfds[i].events = (short)grpc_fd_begin_poll(fd, pollset, worker, POLLIN, POLLOUT, &watchers[i]); + GRPC_FD_UNREF(fd, "multipoller_start"); } /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid |