]> gitweb.factorcode.org Git - factor.git/commitdiff
More efficient io.unix.select
authorsheeple <sheeple@joy.internal.stack-effects.com>
Fri, 15 Feb 2008 20:16:28 +0000 (14:16 -0600)
committersheeple <sheeple@joy.internal.stack-effects.com>
Fri, 15 Feb 2008 20:16:28 +0000 (14:16 -0600)
extra/io/unix/select/select.factor

index 06e257a610497f704e01b0cfcdf01db1e6a5a859..9827d4d54fece52a7a120fe0223bb42524a525fd 100755 (executable)
@@ -17,14 +17,18 @@ TUPLE: select-mx read-fdset write-fdset ;
     FD_SETSIZE 8 * <bit-array> over set-select-mx-read-fdset
     FD_SETSIZE 8 * <bit-array> over set-select-mx-write-fdset ;
 
+: clear-nth ( n seq -- ? )
+    [ nth ] 2keep f -rot set-nth ;
+
 : handle-fd ( fd task fdset mx -- )
-    roll munge rot nth [ swap handle-io-task ] [ 2drop ] if ;
+    roll munge rot clear-nth
+    [ swap handle-io-task ] [ 2drop ] if ;
 
 : handle-fdset ( tasks fdset mx -- )
     [ handle-fd ] 2curry assoc-each ;
 
 : init-fdset ( tasks fdset -- )
-    dup clear-bits
+    dup clear-bits
     [ >r drop t swap munge r> set-nth ] curry assoc-each ;
 
 : read-fdset/tasks
@@ -33,13 +37,19 @@ TUPLE: select-mx read-fdset write-fdset ;
 : write-fdset/tasks
     { mx-writes select-mx-write-fdset } get-slots ;
 
-: init-fdsets ( mx -- read write except )
+: max-fd dup assoc-empty? [ drop 0 ] [ keys supremum ] if ;
+
+: num-fds ( mx -- n )
+    dup mx-reads max-fd swap mx-writes max-fd max 1+ ;
+
+: init-fdsets ( mx -- nfds read write except )
+    [ num-fds ] keep
     [ read-fdset/tasks tuck init-fdset ] keep
     write-fdset/tasks tuck init-fdset
     f ;
 
 M: select-mx wait-for-events ( ms mx -- )
-    swap >r FD_SETSIZE over init-fdsets r> make-timeval
+    swap >r dup init-fdsets r> make-timeval
     select multiplexer-error
     dup read-fdset/tasks pick handle-fdset
     dup write-fdset/tasks rot handle-fdset ;