diff --git a/extra/io/unix/backend/kqueue/kqueue.factor b/extra/io/unix/backend/kqueue/kqueue.factor index 287b88c1c3..226e6c2ec7 100644 --- a/extra/io/unix/backend/kqueue/kqueue.factor +++ b/extra/io/unix/backend/kqueue/kqueue.factor @@ -9,8 +9,6 @@ TUPLE: unix-kqueue-io ; ! Global variables SYMBOL: kqueue-fd -SYMBOL: kqueue-added -SYMBOL: kqueue-deleted SYMBOL: kqueue-events : max-events ( -- n ) @@ -19,29 +17,9 @@ SYMBOL: kqueue-events 256 ; inline M: unix-kqueue-io init-unix-io ( -- ) - H{ } clone kqueue-added set-global - H{ } clone kqueue-deleted set-global max-events "kevent" kqueue-events set-global kqueue dup io-error kqueue-fd set-global ; -M: unix-kqueue-io register-io-task ( task -- ) - dup io-task-fd kqueue-added get-global key? [ drop ] [ - dup io-task-fd kqueue-deleted get-global key? [ - io-task-fd kqueue-deleted get-global delete-at - ] [ - dup io-task-fd kqueue-added get-global set-at - ] if - ] if ; - -M: unix-kqueue-io unregister-io-task ( task -- ) - dup io-task-fd kqueue-deleted get-global key? [ drop ] [ - dup io-task-fd kqueue-added get-global key? [ - io-task-fd kqueue-added get-global delete-at - ] [ - dup io-task-fd kqueue-deleted get-global set-at - ] if - ] if ; - : io-task-filter ( task -- n ) class { { read-task [ EVFILT_READ ] } @@ -57,6 +35,10 @@ M: unix-kqueue-io unregister-io-task ( task -- ) over io-task-fd over set-kevent-ident swap io-task-filter over set-kevent-filter ; +: register-kevent ( task flags -- ) + >r make-kevent r> over set-kevent-flags + kqueue-fd get-global swap 1 f 0 f kevent io-error ; + : make-add-kevent ( task -- event ) make-kevent EV_ADD over set-kevent-flags ; @@ -65,28 +47,16 @@ M: unix-kqueue-io unregister-io-task ( task -- ) make-kevent EV_DELETE over set-kevent-flags ; -: kqueue-additions ( -- kevents ) - kqueue-added get-global - dup clear-assoc values - [ make-add-kevent ] map ; +M: unix-kqueue-io register-io-task ( task -- ) + EV_ADD EV_ENABLE bitor register-kevent ; -: kqueue-deletions ( -- kevents ) - kqueue-deleted get-global - dup clear-assoc values - [ make-delete-kevent ] map ; +M: unix-kqueue-io unregister-io-task ( task -- ) + EV_DELETE EV_DISABLE bitor register-kevent ; -: kqueue-changelist ( -- byte-array n ) - kqueue-additions kqueue-deletions append - dup concat f like swap length ; - -: kqueue-eventlist ( -- byte-array n ) - kqueue-events get-global max-events ; - -: do-kevent ( timespec -- n ) +: wait-kevent ( timespec -- n ) >r kqueue-fd get-global - kqueue-changelist - kqueue-eventlist + f 0 kqueue-events get-global max-events r> kevent dup multiplexer-error ; : kevent-task ( kevent -- task ) @@ -100,7 +70,7 @@ M: unix-kqueue-io unregister-io-task ( task -- ) M: unix-kqueue-io unix-io-multiplex ( ms -- ) make-timespec - do-kevent + wait-kevent kqueue-events get-global handle-kevents ; T{ unix-kqueue-io } unix-io-backend set-global diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index 3800008864..1c86224433 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -3,9 +3,8 @@ io.unix.launcher io.unix.mmap io.backend combinators namespaces system vocabs.loader ; { - ! kqueue is a work in progress - ! { [ macosx? ] [ "io.unix.backend.kqueue" ] } - ! { [ bsd? ] [ "io.unix.backend.kqueue" ] } + { [ macosx? ] [ "io.unix.backend.kqueue" ] } + { [ bsd? ] [ "io.unix.backend.kqueue" ] } { [ unix? ] [ "io.unix.backend.select" ] } } cond require