diff options
author | Craig Tiller <ctiller@google.com> | 2017-10-18 11:57:25 -0700 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2017-10-18 11:57:25 -0700 |
commit | 7c8e59d0efc1b2502b3265d177df96e49c2fc4b7 (patch) | |
tree | 487a47cc03cc35eff9ecacbbbea8225ab708eeec /src/core/lib/iomgr | |
parent | 36636a5cd7e29f2546cba4c896d99d2625011212 (diff) |
Add an essay
Diffstat (limited to 'src/core/lib/iomgr')
-rw-r--r-- | src/core/lib/iomgr/ev_epollex_linux.cc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index bee464cab1..f151bff441 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -635,6 +635,21 @@ static grpc_error *pollset_kick(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, pollset->kicked_without_poller = true; return GRPC_ERROR_NONE; } else { + // We've been asked to kick a poller, but we haven't been told which one + // ... any will do + // We look at the pollset worker list because: + // 1. the pollable list may include workers from other pollers, so we'd + // need to do an O(N) search + // 2. we'd additionally need to take the pollable lock, which we've so + // far avoided + // Now, we would prefer to wake a poller in cv_wait, and not in + // epoll_wait (since the latter would imply the need to do an additional + // wakeup) + // We know that if a worker is at the root of a pollable, it's (likely) + // also the root of a pollset, and we know that if a worker is NOT at + // the root of a pollset, it's (likely) not at the root of a pollable, + // so we take our chances and choose the SECOND worker enqueued against + // the pollset as a worker that's likely to be in cv_wait return kick_one_worker( exec_ctx, pollset->root_worker->links[PWLINK_POLLSET].next); } |