Merge branch 'master' of git://factorcode.org/git/factor

db4
Slava Pestov 2009-08-30 21:12:23 -05:00
commit 5c10f390c7
7 changed files with 49 additions and 52 deletions

View File

@ -2,28 +2,28 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types combinators destructors USING: accessors alien.c-types combinators destructors
io.backend.unix kernel math.bitwise sequences struct-arrays unix io.backend.unix kernel math.bitwise sequences struct-arrays unix
unix.kqueue unix.time assocs io.backend.unix.multiplexers ; unix.kqueue unix.time assocs io.backend.unix.multiplexers
classes.struct ;
IN: io.backend.unix.multiplexers.kqueue IN: io.backend.unix.multiplexers.kqueue
TUPLE: kqueue-mx < mx events ; TUPLE: kqueue-mx < mx events ;
: max-events ( -- n ) ! We read up to 256 events at a time. This is an arbitrary
#! We read up to 256 events at a time. This is an arbitrary ! constant...
#! constant... CONSTANT: max-events 256
256 ; inline
: <kqueue-mx> ( -- mx ) : <kqueue-mx> ( -- mx )
kqueue-mx new-mx kqueue-mx new-mx
kqueue dup io-error >>fd kqueue dup io-error >>fd
max-events "kevent" <struct-array> >>events ; max-events \ kevent <struct-array> >>events ;
M: kqueue-mx dispose* fd>> close-file ; M: kqueue-mx dispose* fd>> close-file ;
: make-kevent ( fd filter flags -- event ) : make-kevent ( fd filter flags -- event )
"kevent" <c-object> \ kevent <struct>
[ set-kevent-flags ] keep swap >>flags
[ set-kevent-filter ] keep swap >>filter
[ set-kevent-ident ] keep ; swap >>ident ;
: register-kevent ( kevent mx -- ) : register-kevent ( kevent mx -- )
fd>> swap 1 f 0 f kevent io-error ; fd>> swap 1 f 0 f kevent io-error ;
@ -63,13 +63,14 @@ M: kqueue-mx remove-output-callbacks ( fd mx -- seq )
] dip kevent multiplexer-error ; ] dip kevent multiplexer-error ;
: handle-kevent ( mx kevent -- ) : handle-kevent ( mx kevent -- )
[ kevent-ident swap ] [ kevent-filter ] bi { [ ident>> swap ] [ filter>> ] bi {
{ EVFILT_READ [ input-available ] } { EVFILT_READ [ input-available ] }
{ EVFILT_WRITE [ output-available ] } { EVFILT_WRITE [ output-available ] }
} case ; } case ;
: handle-kevents ( mx n -- ) : handle-kevents ( mx n -- )
[ dup events>> ] dip head-slice [ handle-kevent ] with each ; [ dup events>> ] dip head-slice
[ \ kevent memory>struct handle-kevent ] with each ;
M: kqueue-mx wait-for-events ( us mx -- ) M: kqueue-mx wait-for-events ( us mx -- )
swap dup [ make-timespec ] when swap dup [ make-timespec ] when

View File

@ -47,6 +47,6 @@ M: openbsd statvfs>file-system-info ( file-system-info statvfs -- file-system-in
M: openbsd file-systems ( -- seq ) M: openbsd file-systems ( -- seq )
f 0 0 getfsstat dup io-error f 0 0 getfsstat dup io-error
statfs <c-type-array> dup dup length 0 getfsstat io-error \ statfs <c-type-array> dup dup length 0 getfsstat io-error
statfs heap-size group \ statfs heap-size group
[ f_mntonname>> alien>native-string file-system-info ] map ; [ f_mntonname>> alien>native-string file-system-info ] map ;

View File

@ -1,14 +1,13 @@
USING: alien.syntax ; USING: alien.syntax classes.struct ;
IN: unix.kqueue IN: unix.kqueue
C-STRUCT: kevent STRUCT: kevent
{ "ulong" "ident" } ! identifier for this event { ident ulong }
{ "short" "filter" } ! filter for event { filter short }
{ "ushort" "flags" } ! action flags for kqueue { flags ushort }
{ "uint" "fflags" } ! filter flag value { fflags uint }
{ "long" "data" } ! filter data value { data long }
{ "void*" "udata" } ! opaque user data identifier { udata void* } ;
;
FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ; FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ;

View File

@ -1,14 +1,13 @@
USING: alien.syntax ; USING: alien.syntax classes.struct ;
IN: unix.kqueue IN: unix.kqueue
C-STRUCT: kevent STRUCT: kevent
{ "ulong" "ident" } ! identifier for this event { ident ulong }
{ "short" "filter" } ! filter for event { filter short }
{ "ushort" "flags" } ! action flags for kqueue { flags ushort }
{ "uint" "fflags" } ! filter flag value { fflags uint }
{ "long" "data" } ! filter data value { data long }
{ "void*" "udata" } ! opaque user data identifier { udata void* } ;
;
FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ; FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ;

View File

@ -1,14 +1,13 @@
USING: alien.syntax ; USING: alien.syntax classes.struct ;
IN: unix.kqueue IN: unix.kqueue
C-STRUCT: kevent STRUCT: kevent
{ "ulong" "ident" } ! identifier for this event { ident ulong }
{ "uint" "filter" } ! filter for event { filter uint }
{ "uint" "flags" } ! action flags for kqueue { flags uint }
{ "uint" "fflags" } ! filter flag value { fflags uint }
{ "longlong" "data" } ! filter data value { data longlong }
{ "void*" "udata" } ! opaque user data identifier { udata void* } ;
;
FUNCTION: int kevent ( int kq, kevent* changelist, size_t nchanges, kevent* eventlist, size_t nevents, timespec* timeout ) ; FUNCTION: int kevent ( int kq, kevent* changelist, size_t nchanges, kevent* eventlist, size_t nevents, timespec* timeout ) ;

View File

@ -1,14 +1,13 @@
USING: alien.syntax ; USING: alien.syntax classes.struct ;
IN: unix.kqueue IN: unix.kqueue
C-STRUCT: kevent STRUCT: kevent
{ "uint" "ident" } ! identifier for this event { ident uint }
{ "short" "filter" } ! filter for event { filter short }
{ "ushort" "flags" } ! action flags for kqueue { flags ushort }
{ "uint" "fflags" } ! filter flag value { fflags uint }
{ "int" "data" } ! filter data value { data int }
{ "void*" "udata" } ! opaque user data identifier { udata void* } ;
;
FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ; FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ;

View File

@ -18,10 +18,10 @@ STRUCT: stat
{ st_blocks blkcnt_t } { st_blocks blkcnt_t }
{ st_blksize blksize_t } { st_blksize blksize_t }
{ st_flags fflags_t } { st_flags fflags_t }
{ st_gen _uint32_t } { st_gen __uint32_t }
{ st_lspare __int32_t } { st_lspare __int32_t }
{ st_birthtimespec timespec } { st_birthtimespec timespec }
{ pad0 __int32_t[2] } { pad0 __int32_t[2] } ;
FUNCTION: int stat ( char* pathname, stat* buf ) ; FUNCTION: int stat ( char* pathname, stat* buf ) ;
FUNCTION: int lstat ( char* pathname, stat* buf ) ; FUNCTION: int lstat ( char* pathname, stat* buf ) ;