| 
									
										
										
										
											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 | 
					
						
							|  |  |  | bit-arrays sequences assocs unix math namespaces structs ;
 | 
					
						
							|  |  |  | IN: io.unix.select | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: select-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 construct-mx | 
					
						
							|  |  |  |     FD_SETSIZE 8 * <bit-array> over set-select-mx-read-fdset | 
					
						
							|  |  |  |     FD_SETSIZE 8 * <bit-array> over set-select-mx-write-fdset ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-15 15:16:28 -05:00
										 |  |  | : clear-nth ( n seq -- ? )
 | 
					
						
							|  |  |  |     [ nth ] 2keep f -rot set-nth ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 -- )
 | 
					
						
							| 
									
										
										
										
											2008-02-15 15:16:28 -05:00
										 |  |  |     ! dup clear-bits | 
					
						
							| 
									
										
										
										
											2008-01-20 17:07:18 -05:00
										 |  |  |     [ >r drop t swap munge r> set-nth ] curry assoc-each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : read-fdset/tasks | 
					
						
							|  |  |  |     { mx-reads select-mx-read-fdset } get-slots ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : write-fdset/tasks | 
					
						
							|  |  |  |     { mx-writes select-mx-write-fdset } get-slots ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-15 15:16:28 -05:00
										 |  |  | : 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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 17:07:18 -05:00
										 |  |  |     [ read-fdset/tasks tuck init-fdset ] keep
 | 
					
						
							|  |  |  |     write-fdset/tasks tuck init-fdset | 
					
						
							|  |  |  |     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 ;
 |