aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/iomgr
diff options
context:
space:
mode:
authorGravatar David Klempner <klempner@google.com>2015-02-10 18:48:48 -0800
committerGravatar David Klempner <klempner@google.com>2015-02-10 18:48:48 -0800
commit49959ed9c1e06a8d5aa6e0bd077fd940dfc3741d (patch)
tree5c58d76bd602dd4e0012a4c4f6142380f81eeaf0 /src/core/iomgr
parenta81196c36198e45dda98413b3917094db1967ae1 (diff)
Have unary pollset check to see if the existing fd is orphaned
This avoids an unnecessary upgrade to multipoller if there was no do_work called between an orphan and a subsequent add. Additionally, it avoids the need for epoll based multipoller to check for this case in its upgrade code by ensuring all existing fds are valid at upgrade time.
Diffstat (limited to 'src/core/iomgr')
-rw-r--r--src/core/iomgr/pollset_posix.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c
index b0404b870b..2837a0dff3 100644
--- a/src/core/iomgr/pollset_posix.c
+++ b/src/core/iomgr/pollset_posix.c
@@ -202,8 +202,15 @@ static void unary_poll_pollset_add_fd(grpc_pollset *pollset, grpc_fd *fd) {
if (fd == pollset->data.ptr) return;
fds[0] = pollset->data.ptr;
fds[1] = fd;
- grpc_platform_become_multipoller(pollset, fds, GPR_ARRAY_SIZE(fds));
- grpc_fd_unref(fds[0]);
+ if (!grpc_fd_is_orphaned(fds[0])) {
+ grpc_platform_become_multipoller(pollset, fds, GPR_ARRAY_SIZE(fds));
+ grpc_fd_unref(fds[0]);
+ } else {
+ /* old fd is orphaned and we haven't cleaned it up until now, so remain a
+ * unary poller */
+ grpc_fd_unref(fds[0]);
+ pollset->data.ptr = fd;
+ }
}
static void unary_poll_pollset_del_fd(grpc_pollset *pollset, grpc_fd *fd) {