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