Merge branch 'master' of git://factorcode.org/git/factor
						commit
						5c10f390c7
					
				| 
						 | 
				
			
			@ -2,28 +2,28 @@
 | 
			
		|||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors alien.c-types combinators destructors
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
TUPLE: kqueue-mx < mx events ;
 | 
			
		||||
 | 
			
		||||
: max-events ( -- n )
 | 
			
		||||
    #! We read up to 256 events at a time. This is an arbitrary
 | 
			
		||||
    #! constant...
 | 
			
		||||
    256 ; inline
 | 
			
		||||
! We read up to 256 events at a time. This is an arbitrary
 | 
			
		||||
! constant...
 | 
			
		||||
CONSTANT: max-events 256
 | 
			
		||||
 | 
			
		||||
: <kqueue-mx> ( -- mx )
 | 
			
		||||
    kqueue-mx new-mx
 | 
			
		||||
        kqueue dup io-error >>fd
 | 
			
		||||
        max-events "kevent" <struct-array> >>events ;
 | 
			
		||||
        max-events \ kevent <struct-array> >>events ;
 | 
			
		||||
 | 
			
		||||
M: kqueue-mx dispose* fd>> close-file ;
 | 
			
		||||
 | 
			
		||||
: make-kevent ( fd filter flags -- event )
 | 
			
		||||
    "kevent" <c-object>
 | 
			
		||||
    [ set-kevent-flags ] keep
 | 
			
		||||
    [ set-kevent-filter ] keep
 | 
			
		||||
    [ set-kevent-ident ] keep ;
 | 
			
		||||
    \ kevent <struct>
 | 
			
		||||
        swap >>flags
 | 
			
		||||
        swap >>filter
 | 
			
		||||
        swap >>ident ;
 | 
			
		||||
 | 
			
		||||
: register-kevent ( kevent mx -- )
 | 
			
		||||
    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 ;
 | 
			
		||||
 | 
			
		||||
: handle-kevent ( mx kevent -- )
 | 
			
		||||
    [ kevent-ident swap ] [ kevent-filter ] bi {
 | 
			
		||||
    [ ident>> swap ] [ filter>> ] bi {
 | 
			
		||||
        { EVFILT_READ [ input-available ] }
 | 
			
		||||
        { EVFILT_WRITE [ output-available ] }
 | 
			
		||||
    } case ;
 | 
			
		||||
 | 
			
		||||
: 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 -- )
 | 
			
		||||
    swap dup [ make-timespec ] when
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,6 @@ M: openbsd statvfs>file-system-info ( file-system-info statvfs -- file-system-in
 | 
			
		|||
 | 
			
		||||
M: openbsd file-systems ( -- seq )
 | 
			
		||||
    f 0 0 getfsstat dup io-error
 | 
			
		||||
    statfs <c-type-array> dup dup length 0 getfsstat io-error 
 | 
			
		||||
    statfs heap-size group 
 | 
			
		||||
    \ statfs <c-type-array> dup dup length 0 getfsstat io-error 
 | 
			
		||||
    \ statfs heap-size group 
 | 
			
		||||
    [ f_mntonname>> alien>native-string file-system-info ] map ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,13 @@
 | 
			
		|||
USING: alien.syntax ;
 | 
			
		||||
USING: alien.syntax classes.struct ;
 | 
			
		||||
IN: unix.kqueue
 | 
			
		||||
 | 
			
		||||
C-STRUCT: kevent
 | 
			
		||||
    { "ulong"  "ident"  } ! identifier for this event
 | 
			
		||||
    { "short"  "filter" } ! filter for event
 | 
			
		||||
    { "ushort" "flags"  } ! action flags for kqueue
 | 
			
		||||
    { "uint"   "fflags" } ! filter flag value
 | 
			
		||||
    { "long"   "data"   } ! filter data value
 | 
			
		||||
    { "void*"  "udata"  } ! opaque user data identifier
 | 
			
		||||
;
 | 
			
		||||
STRUCT: kevent
 | 
			
		||||
    { ident  ulong }
 | 
			
		||||
    { filter short }
 | 
			
		||||
    { flags  ushort }
 | 
			
		||||
    { fflags uint }
 | 
			
		||||
    { data   long }
 | 
			
		||||
    { udata  void* } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,13 @@
 | 
			
		|||
USING: alien.syntax ;
 | 
			
		||||
USING: alien.syntax classes.struct ;
 | 
			
		||||
IN: unix.kqueue
 | 
			
		||||
 | 
			
		||||
C-STRUCT: kevent
 | 
			
		||||
    { "ulong"  "ident"  } ! identifier for this event
 | 
			
		||||
    { "short"  "filter" } ! filter for event
 | 
			
		||||
    { "ushort" "flags"  } ! action flags for kqueue
 | 
			
		||||
    { "uint"   "fflags" } ! filter flag value
 | 
			
		||||
    { "long"   "data"   } ! filter data value
 | 
			
		||||
    { "void*"  "udata"  } ! opaque user data identifier
 | 
			
		||||
;
 | 
			
		||||
STRUCT: kevent
 | 
			
		||||
    { ident  ulong }
 | 
			
		||||
    { filter short }
 | 
			
		||||
    { flags  ushort }
 | 
			
		||||
    { fflags uint }
 | 
			
		||||
    { data   long }
 | 
			
		||||
    { udata  void* } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,13 @@
 | 
			
		|||
USING: alien.syntax ;
 | 
			
		||||
USING: alien.syntax classes.struct ;
 | 
			
		||||
IN: unix.kqueue
 | 
			
		||||
 | 
			
		||||
C-STRUCT: kevent
 | 
			
		||||
    { "ulong"    "ident"  } ! identifier for this event
 | 
			
		||||
    { "uint"     "filter" } ! filter for event
 | 
			
		||||
    { "uint"     "flags"  } ! action flags for kqueue
 | 
			
		||||
    { "uint"     "fflags" } ! filter flag value
 | 
			
		||||
    { "longlong" "data"   } ! filter data value
 | 
			
		||||
    { "void*"    "udata"  } ! opaque user data identifier
 | 
			
		||||
;
 | 
			
		||||
STRUCT: kevent
 | 
			
		||||
    { ident  ulong }
 | 
			
		||||
    { filter uint }
 | 
			
		||||
    { flags  uint }
 | 
			
		||||
    { fflags uint }
 | 
			
		||||
    { data   longlong }
 | 
			
		||||
    { udata  void* } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: int kevent ( int kq, kevent* changelist, size_t nchanges, kevent* eventlist, size_t nevents, timespec* timeout ) ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,13 @@
 | 
			
		|||
USING: alien.syntax ;
 | 
			
		||||
USING: alien.syntax classes.struct ;
 | 
			
		||||
IN: unix.kqueue
 | 
			
		||||
 | 
			
		||||
C-STRUCT: kevent
 | 
			
		||||
    { "uint"   "ident"  } ! identifier for this event
 | 
			
		||||
    { "short"  "filter" } ! filter for event
 | 
			
		||||
    { "ushort" "flags"  } ! action flags for kqueue
 | 
			
		||||
    { "uint"   "fflags" } ! filter flag value
 | 
			
		||||
    { "int"    "data"   } ! filter data value
 | 
			
		||||
    { "void*"  "udata"  } ! opaque user data identifier
 | 
			
		||||
;
 | 
			
		||||
STRUCT: kevent
 | 
			
		||||
    { ident  uint }
 | 
			
		||||
    { filter short }
 | 
			
		||||
    { flags  ushort }
 | 
			
		||||
    { fflags uint }
 | 
			
		||||
    { data   int }
 | 
			
		||||
    { udata  void* } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,10 @@ STRUCT: stat
 | 
			
		|||
    { st_blocks blkcnt_t }
 | 
			
		||||
    { st_blksize blksize_t }
 | 
			
		||||
    { st_flags fflags_t }
 | 
			
		||||
    { st_gen _uint32_t }
 | 
			
		||||
    { st_gen __uint32_t }
 | 
			
		||||
    { st_lspare __int32_t }
 | 
			
		||||
    { st_birthtimespec timespec }
 | 
			
		||||
    { pad0 __int32_t[2] }
 | 
			
		||||
    { pad0 __int32_t[2] } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: int stat  ( char* pathname, stat* buf ) ;
 | 
			
		||||
FUNCTION: int lstat ( char* pathname, stat* buf ) ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue