summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-02-15 21:11:52 +0100
committerAndy Wingo <wingo@pobox.com>2017-02-15 21:11:52 +0100
commitf2ed2d7b32a2b1e1cf5e5e0e2bd92f3d66c3d264 (patch)
tree410d02f34da6580b962faf6fc9cd9d76c0124a81
parentfibers/config.scm is built source (diff)
downloadguile-fibers-f2ed2d7b32a2b1e1cf5e5e0e2bd92f3d66c3d264.tar.gz
Add epoll-add*!
* fibers/epoll.scm (epoll-add*!): New function, tries an epoll-modify! then falls back to epoll-add!.
-rw-r--r--fibers/epoll.scm9
1 files changed, 8 insertions, 1 deletions
diff --git a/fibers/epoll.scm b/fibers/epoll.scm
index 20d92ae..d4674a7 100644
--- a/fibers/epoll.scm
+++ b/fibers/epoll.scm
@@ -31,6 +31,7 @@
epoll?
epoll-add!
epoll-modify!
+ epoll-add*!
epoll-remove!
epoll-wake!
epoll
@@ -111,9 +112,15 @@
(define (epoll-add! epoll fd events)
(primitive-epoll-ctl (epoll-fd epoll) EPOLL_CTL_ADD fd events))
-(define* (epoll-modify! epoll fd events)
+(define (epoll-modify! epoll fd events)
(primitive-epoll-ctl (epoll-fd epoll) EPOLL_CTL_MOD fd events))
+(define (epoll-add*! epoll fd events)
+ (catch 'system-error
+ (lambda () (epoll-modify! epoll fd events))
+ (lambda _
+ (epoll-add! epoll fd events))))
+
(define (epoll-remove! epoll fd)
(primitive-epoll-ctl (epoll-fd epoll) EPOLL_CTL_DEL fd))