More kqueue work
parent
40a48aefe3
commit
1302a8055d
|
@ -9,8 +9,6 @@ TUPLE: unix-kqueue-io ;
|
||||||
|
|
||||||
! Global variables
|
! Global variables
|
||||||
SYMBOL: kqueue-fd
|
SYMBOL: kqueue-fd
|
||||||
SYMBOL: kqueue-added
|
|
||||||
SYMBOL: kqueue-deleted
|
|
||||||
SYMBOL: kqueue-events
|
SYMBOL: kqueue-events
|
||||||
|
|
||||||
: max-events ( -- n )
|
: max-events ( -- n )
|
||||||
|
@ -19,29 +17,9 @@ SYMBOL: kqueue-events
|
||||||
256 ; inline
|
256 ; inline
|
||||||
|
|
||||||
M: unix-kqueue-io init-unix-io ( -- )
|
M: unix-kqueue-io init-unix-io ( -- )
|
||||||
H{ } clone kqueue-added set-global
|
|
||||||
H{ } clone kqueue-deleted set-global
|
|
||||||
max-events "kevent" <c-array> kqueue-events set-global
|
max-events "kevent" <c-array> kqueue-events set-global
|
||||||
kqueue dup io-error kqueue-fd 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 )
|
: io-task-filter ( task -- n )
|
||||||
class {
|
class {
|
||||||
{ read-task [ EVFILT_READ ] }
|
{ read-task [ EVFILT_READ ] }
|
||||||
|
@ -57,6 +35,10 @@ M: unix-kqueue-io unregister-io-task ( task -- )
|
||||||
over io-task-fd over set-kevent-ident
|
over io-task-fd over set-kevent-ident
|
||||||
swap io-task-filter over set-kevent-filter ;
|
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-add-kevent ( task -- event )
|
||||||
make-kevent
|
make-kevent
|
||||||
EV_ADD over set-kevent-flags ;
|
EV_ADD over set-kevent-flags ;
|
||||||
|
@ -65,28 +47,16 @@ M: unix-kqueue-io unregister-io-task ( task -- )
|
||||||
make-kevent
|
make-kevent
|
||||||
EV_DELETE over set-kevent-flags ;
|
EV_DELETE over set-kevent-flags ;
|
||||||
|
|
||||||
: kqueue-additions ( -- kevents )
|
M: unix-kqueue-io register-io-task ( task -- )
|
||||||
kqueue-added get-global
|
EV_ADD EV_ENABLE bitor register-kevent ;
|
||||||
dup clear-assoc values
|
|
||||||
[ make-add-kevent ] map ;
|
|
||||||
|
|
||||||
: kqueue-deletions ( -- kevents )
|
M: unix-kqueue-io unregister-io-task ( task -- )
|
||||||
kqueue-deleted get-global
|
EV_DELETE EV_DISABLE bitor register-kevent ;
|
||||||
dup clear-assoc values
|
|
||||||
[ make-delete-kevent ] map ;
|
|
||||||
|
|
||||||
: kqueue-changelist ( -- byte-array n )
|
: wait-kevent ( timespec -- 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 )
|
|
||||||
>r
|
>r
|
||||||
kqueue-fd get-global
|
kqueue-fd get-global
|
||||||
kqueue-changelist
|
f 0 kqueue-events get-global max-events
|
||||||
kqueue-eventlist
|
|
||||||
r> kevent dup multiplexer-error ;
|
r> kevent dup multiplexer-error ;
|
||||||
|
|
||||||
: kevent-task ( kevent -- task )
|
: kevent-task ( kevent -- task )
|
||||||
|
@ -100,7 +70,7 @@ M: unix-kqueue-io unregister-io-task ( task -- )
|
||||||
|
|
||||||
M: unix-kqueue-io unix-io-multiplex ( ms -- )
|
M: unix-kqueue-io unix-io-multiplex ( ms -- )
|
||||||
make-timespec
|
make-timespec
|
||||||
do-kevent
|
wait-kevent
|
||||||
kqueue-events get-global handle-kevents ;
|
kqueue-events get-global handle-kevents ;
|
||||||
|
|
||||||
T{ unix-kqueue-io } unix-io-backend set-global
|
T{ unix-kqueue-io } unix-io-backend set-global
|
||||||
|
|
|
@ -3,9 +3,8 @@ io.unix.launcher io.unix.mmap io.backend combinators namespaces
|
||||||
system vocabs.loader ;
|
system vocabs.loader ;
|
||||||
|
|
||||||
{
|
{
|
||||||
! kqueue is a work in progress
|
{ [ macosx? ] [ "io.unix.backend.kqueue" ] }
|
||||||
! { [ macosx? ] [ "io.unix.backend.kqueue" ] }
|
{ [ bsd? ] [ "io.unix.backend.kqueue" ] }
|
||||||
! { [ bsd? ] [ "io.unix.backend.kqueue" ] }
|
|
||||||
{ [ unix? ] [ "io.unix.backend.select" ] }
|
{ [ unix? ] [ "io.unix.backend.select" ] }
|
||||||
} cond require
|
} cond require
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue