diff --git a/basis/io/backend/unix/multiplexers/epoll/epoll.factor b/basis/io/backend/unix/multiplexers/epoll/epoll.factor index 6ec8caaad8..e2a7cda826 100644 --- a/basis/io/backend/unix/multiplexers/epoll/epoll.factor +++ b/basis/io/backend/unix/multiplexers/epoll/epoll.factor @@ -23,7 +23,7 @@ M: epoll-mx dispose* fd>> close-file ; : make-event ( fd events -- event ) epoll-event swap >>events - swap >>fd ; + swap over data>> fd<< ; :: do-epoll-ctl ( fd mx what events -- ) mx fd>> what fd fd events make-event epoll_ctl io-error ; @@ -55,7 +55,7 @@ M: epoll-mx remove-output-callbacks ( fd mx -- seq ) epoll_wait multiplexer-error ; : handle-event ( event mx -- ) - [ fd>> ] dip + [ data>> fd>> ] dip [ EPOLLIN EPOLLOUT bitor do-epoll-del ] [ input-available ] [ output-available ] 2tri ; diff --git a/basis/unix/linux/epoll/epoll.factor b/basis/unix/linux/epoll/epoll.factor index e613b042f2..6609612baa 100644 --- a/basis/unix/linux/epoll/epoll.factor +++ b/basis/unix/linux/epoll/epoll.factor @@ -1,14 +1,19 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: unix.linux.epoll -USING: alien.c-types alien.syntax classes.struct math ; +USING: alien.c-types alien.syntax classes.struct math unix.types ; FUNCTION: int epoll_create ( int size ) ; +UNION-STRUCT: epoll-data + { ptr void* } + { fd int } + { u32 uint32_t } + { u64 uint64_t } ; + STRUCT: epoll-event -{ events uint } -{ fd uint } -{ padding uint } ; + { events uint32_t } + { data epoll-data } ; FUNCTION: int epoll_ctl ( int epfd, int op, int fd, epoll-event* event ) ; @@ -28,5 +33,6 @@ CONSTANT: EPOLLWRBAND HEX: 200 CONSTANT: EPOLLMSG HEX: 400 CONSTANT: EPOLLERR HEX: 008 CONSTANT: EPOLLHUP HEX: 010 +CONSTANT: EPOLLRDHUP HEX: 2000 : EPOLLONESHOT ( -- n ) 30 2^ ; inline : EPOLLET ( -- n ) 31 2^ ; inline