[commit: ghc] master: Event Manager: Make one-shot a per-registration property (0234399)
git at git.haskell.org
git at git.haskell.org
Mon Jan 12 23:38:46 UTC 2015
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/023439980f6ef6ec051f676279ed2be5f031efe6/ghc
>---------------------------------------------------------------
commit 023439980f6ef6ec051f676279ed2be5f031efe6
Author: Ben Gamari <bgamari.foss at gmail.com>
Date: Mon Jan 12 18:36:23 2015 -0500
Event Manager: Make one-shot a per-registration property
Summary:
Currently the event manager has a global flag for whether to create
epoll-like notifications as one-shot (e.g. EPOLLONESHOT, where an fd
will be deactivated after its first event) or standard multi-shot
notifications.
Unfortunately this means that the event manager may export either
one-shot or multi-shot semantics to the user. Even worse, the user has
no way of knowing which semantics are being delivered. This resulted in
breakage in the usb[1] library which deadlocks after notifications on
its fd are disabled after the first event is delivered. This patch
reworks one-shot event support to allow the user to choose whether
one-shot or multi-shot semantics are desired on a per-registration
basis. The event manager can then decide whether to use a one-shot or
multi-shot epoll.
A registration is now defined by a set of Events (as before) as well as
a Lifetime (either one-shot or multi-shot). We lend monoidal structure
to Lifetime choosing OneShot as the identity. This allows us to combine
Lifetime/Event pairs of an fd to give the longest desired lifetime of
the registration and the full set of Events for which we want
notification.
[1] https://github.com/basvandijk/usb/issues/7
Test Plan: Add more test cases and validate
Reviewers: tibbe, AndreasVoellmy, hvr, austin
Reviewed By: austin
Subscribers: thomie, carter, simonmar
Differential Revision: https://phabricator.haskell.org/D347
>---------------------------------------------------------------
023439980f6ef6ec051f676279ed2be5f031efe6
libraries/base/GHC/Event.hs | 1 -
libraries/base/GHC/Event/IntTable.hs | 4 +
libraries/base/GHC/Event/Internal.hs | 48 ++++++++
libraries/base/GHC/Event/Manager.hs | 224 +++++++++++++++++++----------------
libraries/base/GHC/Event/Thread.hs | 6 +-
5 files changed, 175 insertions(+), 108 deletions(-)
Diff suppressed because of size. To see it, use:
git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc 023439980f6ef6ec051f676279ed2be5f031efe6
More information about the ghc-commits
mailing list