factor/extra/io/unix/select/select.factor

57 lines
1.8 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2008-05-13 19:24:46 -04:00
USING: alien.c-types kernel io.ports io.unix.backend
bit-arrays sequences assocs unix math namespaces structs
2008-05-13 19:24:46 -04:00
accessors math.order locals ;
IN: io.unix.select
2008-04-11 13:47:49 -04:00
TUPLE: select-mx < mx read-fdset write-fdset ;
! Factor's bit-arrays are an array of bytes, OS X expects
! FD_SET to be an array of cells, so we have to account for
! byte order differences on big endian platforms
: munge ( i -- i' )
little-endian? [ BIN: 11000 bitxor ] unless ; inline
: <select-mx> ( -- mx )
select-mx new-mx
2008-04-11 13:47:49 -04:00
FD_SETSIZE 8 * <bit-array> >>read-fdset
FD_SETSIZE 8 * <bit-array> >>write-fdset ;
2008-02-15 15:16:28 -05:00
: clear-nth ( n seq -- ? )
[ nth ] [ f -rot set-nth ] 2bi ;
2008-02-15 15:16:28 -05:00
2008-05-13 19:24:46 -04:00
:: check-fd ( fd fdset mx quot -- )
fd munge fdset clear-nth [ fd mx quot call ] when ; inline
2008-05-13 19:24:46 -04:00
: check-fdset ( fds fdset mx quot -- )
[ check-fd ] 3curry each ; inline
2008-05-13 19:24:46 -04:00
: init-fdset ( fds fdset -- )
[ >r t swap munge r> set-nth ] curry each ;
2008-06-08 16:32:55 -04:00
: read-fdset/tasks ( mx -- seq fdset )
2008-05-13 19:24:46 -04:00
[ reads>> keys ] [ read-fdset>> ] bi ;
2008-06-08 16:32:55 -04:00
: write-fdset/tasks ( mx -- seq fdset )
2008-05-13 19:24:46 -04:00
[ writes>> keys ] [ write-fdset>> ] bi ;
: max-fd ( assoc -- n )
dup assoc-empty? [ drop 0 ] [ keys supremum ] if ;
2008-02-15 15:16:28 -05:00
: num-fds ( mx -- n )
[ reads>> max-fd ] [ writes>> max-fd ] bi max 1+ ;
2008-02-15 15:16:28 -05:00
: init-fdsets ( mx -- nfds read write except )
2008-04-11 08:15:26 -04:00
[ num-fds ]
[ read-fdset/tasks [ init-fdset ] [ underlying>> ] bi ]
[ write-fdset/tasks [ init-fdset ] [ underlying>> ] bi ] tri
f ;
2008-05-13 19:24:46 -04:00
M:: select-mx wait-for-events ( ms mx -- )
mx
[ init-fdsets ms dup [ make-timeval ] when select multiplexer-error ]
[ [ read-fdset/tasks ] keep [ input-available ] check-fdset ]
[ [ write-fdset/tasks ] keep [ output-available ] check-fdset ]
tri ;