2008-01-20 17:07:18 -05:00
|
|
|
! Copyright (C) 2004, 2008 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: alien.c-types kernel io.nonblocking io.unix.backend
|
2008-03-29 01:59:05 -04:00
|
|
|
bit-arrays sequences assocs unix math namespaces structs
|
2008-04-26 00:17:08 -04:00
|
|
|
accessors math.order ;
|
2008-01-20 17:07:18 -05:00
|
|
|
IN: io.unix.select
|
|
|
|
|
2008-04-11 13:47:49 -04:00
|
|
|
TUPLE: select-mx < mx read-fdset write-fdset ;
|
2008-01-20 17:07:18 -05:00
|
|
|
|
|
|
|
! 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 )
|
2008-04-14 06:07:31 -04:00
|
|
|
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-01-20 17:07:18 -05:00
|
|
|
|
2008-02-15 15:16:28 -05:00
|
|
|
: clear-nth ( n seq -- ? )
|
2008-03-29 01:59:05 -04:00
|
|
|
[ nth ] [ f -rot set-nth ] 2bi ;
|
2008-02-15 15:16:28 -05:00
|
|
|
|
2008-01-20 17:07:18 -05:00
|
|
|
: handle-fd ( fd task fdset mx -- )
|
2008-02-15 15:16:28 -05:00
|
|
|
roll munge rot clear-nth
|
|
|
|
[ swap handle-io-task ] [ 2drop ] if ;
|
2008-01-20 17:07:18 -05:00
|
|
|
|
|
|
|
: handle-fdset ( tasks fdset mx -- )
|
|
|
|
[ handle-fd ] 2curry assoc-each ;
|
|
|
|
|
|
|
|
: init-fdset ( tasks fdset -- )
|
|
|
|
[ >r drop t swap munge r> set-nth ] curry assoc-each ;
|
|
|
|
|
|
|
|
: read-fdset/tasks
|
2008-03-29 01:59:05 -04:00
|
|
|
[ reads>> ] [ read-fdset>> ] bi ;
|
2008-01-20 17:07:18 -05:00
|
|
|
|
|
|
|
: write-fdset/tasks
|
2008-03-29 01:59:05 -04:00
|
|
|
[ writes>> ] [ write-fdset>> ] bi ;
|
2008-01-20 17:07:18 -05:00
|
|
|
|
2008-03-29 01:59:05 -04:00
|
|
|
: max-fd ( assoc -- n )
|
|
|
|
dup assoc-empty? [ drop 0 ] [ keys supremum ] if ;
|
2008-02-15 15:16:28 -05:00
|
|
|
|
|
|
|
: num-fds ( mx -- n )
|
2008-03-29 01:59:05 -04:00
|
|
|
[ 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 tuck init-fdset ]
|
|
|
|
[ write-fdset/tasks tuck init-fdset ] tri
|
2008-01-20 17:07:18 -05:00
|
|
|
f ;
|
|
|
|
|
2008-01-21 15:33:43 -05:00
|
|
|
M: select-mx wait-for-events ( ms mx -- )
|
2008-02-21 21:57:41 -05:00
|
|
|
swap >r dup init-fdsets r> dup [ make-timeval ] when
|
2008-01-20 17:07:18 -05:00
|
|
|
select multiplexer-error
|
|
|
|
dup read-fdset/tasks pick handle-fdset
|
|
|
|
dup write-fdset/tasks rot handle-fdset ;
|