@@ -104,6 +104,63 @@ var SyscallsLibrary = {
104104 } ,
105105 } ,
106106
107+ $parseSelectFDSet__internal : true ,
108+ $parseSelectFDSet : ( readfds , writefds , exceptfds ) => {
109+ var total = 0 ;
110+
111+ var srcReadLow = ( readfds ? { { { makeGetValue ( 'readfds' , 0 , 'i32' ) } } } : 0 ) ,
112+ srcReadHigh = ( readfds ? { { { makeGetValue ( 'readfds' , 4 , 'i32' ) } } } : 0 ) ;
113+ var srcWriteLow = ( writefds ? { { { makeGetValue ( 'writefds' , 0 , 'i32' ) } } } : 0 ) ,
114+ srcWriteHigh = ( writefds ? { { { makeGetValue ( 'writefds' , 4 , 'i32' ) } } } : 0 ) ;
115+ var srcExceptLow = ( exceptfds ? { { { makeGetValue ( 'exceptfds' , 0 , 'i32' ) } } } : 0 ) ,
116+ srcExceptHigh = ( exceptfds ? { { { makeGetValue ( 'exceptfds' , 4 , 'i32' ) } } } : 0 ) ;
117+
118+ var dstReadLow = 0 ,
119+ dstReadHigh = 0 ;
120+ var dstWriteLow = 0 ,
121+ dstWriteHigh = 0 ;
122+ var dstExceptLow = 0 ,
123+ dstExceptHigh = 0 ;
124+
125+ var check = ( fd , low , high , val ) => fd < 32 ? ( low & val ) : ( high & val ) ;
126+
127+ return {
128+ allLow : srcReadLow | srcWriteLow | srcExceptLow ,
129+ allHigh : srcReadHigh | srcWriteHigh | srcExceptHigh ,
130+ getTotal : ( ) => total ,
131+ setFlags : ( fd , flags ) => {
132+ var mask = 1 << ( fd % 32 ) ;
133+
134+ if ( ( flags & { { { cDefs . POLLIN } } } ) && check ( fd , srcReadLow , srcReadHigh , mask ) ) {
135+ fd < 32 ? ( dstReadLow = dstReadLow | mask ) : ( dstReadHigh = dstReadHigh | mask ) ;
136+ total ++ ;
137+ }
138+ if ( ( flags & { { { cDefs . POLLOUT } } } ) && check ( fd , srcWriteLow , srcWriteHigh , mask ) ) {
139+ fd < 32 ? ( dstWriteLow = dstWriteLow | mask ) : ( dstWriteHigh = dstWriteHigh | mask ) ;
140+ total ++ ;
141+ }
142+ if ( ( flags & { { { cDefs . POLLPRI } } } ) && check ( fd , srcExceptLow , srcExceptHigh , mask ) ) {
143+ fd < 32 ? ( dstExceptLow = dstExceptLow | mask ) : ( dstExceptHigh = dstExceptHigh | mask ) ;
144+ total ++ ;
145+ }
146+ } ,
147+ commit : ( ) => {
148+ if ( readfds ) {
149+ { { { makeSetValue ( 'readfds' , '0' , 'dstReadLow' , 'i32' ) } } } ;
150+ { { { makeSetValue ( 'readfds' , '4' , 'dstReadHigh' , 'i32' ) } } } ;
151+ }
152+ if ( writefds ) {
153+ { { { makeSetValue ( 'writefds' , '0' , 'dstWriteLow' , 'i32' ) } } } ;
154+ { { { makeSetValue ( 'writefds' , '4' , 'dstWriteHigh' , 'i32' ) } } } ;
155+ }
156+ if ( exceptfds ) {
157+ { { { makeSetValue ( 'exceptfds' , '0' , 'dstExceptLow' , 'i32' ) } } } ;
158+ { { { makeSetValue ( 'exceptfds' , '4' , 'dstExceptHigh' , 'i32' ) } } } ;
159+ }
160+ }
161+ } ;
162+ } ,
163+
107164 $syscallGetVarargI__internal : true ,
108165 $syscallGetVarargI : ( ) = > {
109166#if ASSERTIONS
@@ -543,6 +600,7 @@ var SyscallsLibrary = {
543600 return 0 ;
544601 } ,
545602 __syscall__newselect__i53abi : true ,
603+ __syscall__newselect__deps : [ '$parseSelectFDSet' ] ,
546604 __syscall__newselect : ( nfds , readfds , writefds , exceptfds , timeoutInMillis ) = > {
547605 // readfds are supported,
548606 // writefds checks socket open status
@@ -553,24 +611,10 @@ var SyscallsLibrary = {
553611 assert ( nfds <= 64 , 'nfds must be less than or equal to 64' ) ; // fd sets have 64 bits // TODO: this could be 1024 based on current musl headers
554612#endif
555613
556- var total = 0 ;
614+ var fdSet = parseSelectFDSet ( readfds , writefds , exceptfds ) ;
557615
558- var srcReadLow = ( readfds ? { { { makeGetValue ( 'readfds' , 0 , 'i32' ) } } } : 0 ) ,
559- srcReadHigh = ( readfds ? { { { makeGetValue ( 'readfds' , 4 , 'i32' ) } } } : 0 ) ;
560- var srcWriteLow = ( writefds ? { { { makeGetValue ( 'writefds' , 0 , 'i32' ) } } } : 0 ) ,
561- srcWriteHigh = ( writefds ? { { { makeGetValue ( 'writefds' , 4 , 'i32' ) } } } : 0 ) ;
562- var srcExceptLow = ( exceptfds ? { { { makeGetValue ( 'exceptfds' , 0 , 'i32' ) } } } : 0 ) ,
563- srcExceptHigh = ( exceptfds ? { { { makeGetValue ( 'exceptfds' , 4 , 'i32' ) } } } : 0 ) ;
564-
565- var dstReadLow = 0 ,
566- dstReadHigh = 0 ;
567- var dstWriteLow = 0 ,
568- dstWriteHigh = 0 ;
569- var dstExceptLow = 0 ,
570- dstExceptHigh = 0 ;
571-
572- var allLow = srcReadLow | srcWriteLow | srcExceptLow ;
573- var allHigh = srcReadHigh | srcWriteHigh | srcExceptHigh ;
616+ var allLow = fdSet . allLow ;
617+ var allHigh = fdSet . allHigh ;
574618
575619 var check = ( fd , low , high , val ) => fd < 32 ? ( low & val ) : ( high & val ) ;
576620
@@ -592,34 +636,13 @@ var SyscallsLibrary = {
592636#endif
593637 }
594638
595- if ( ( flags & { { { cDefs . POLLIN } } } ) && check ( fd , srcReadLow , srcReadHigh , mask ) ) {
596- fd < 32 ? ( dstReadLow = dstReadLow | mask ) : ( dstReadHigh = dstReadHigh | mask ) ;
597- total ++ ;
598- }
599- if ( ( flags & { { { cDefs . POLLOUT } } } ) && check ( fd , srcWriteLow , srcWriteHigh , mask ) ) {
600- fd < 32 ? ( dstWriteLow = dstWriteLow | mask ) : ( dstWriteHigh = dstWriteHigh | mask ) ;
601- total ++ ;
602- }
603- if ( ( flags & { { { cDefs . POLLPRI } } } ) && check ( fd , srcExceptLow , srcExceptHigh , mask ) ) {
604- fd < 32 ? ( dstExceptLow = dstExceptLow | mask ) : ( dstExceptHigh = dstExceptHigh | mask ) ;
605- total ++ ;
606- }
639+ fdSet . setFlags ( fd , flags ) ;
607640 }
608641
609- if ( readfds ) {
610- { { { makeSetValue ( 'readfds' , '0' , 'dstReadLow' , 'i32' ) } } } ;
611- { { { makeSetValue ( 'readfds' , '4' , 'dstReadHigh' , 'i32' ) } } } ;
612- }
613- if ( writefds ) {
614- { { { makeSetValue ( 'writefds' , '0' , 'dstWriteLow' , 'i32' ) } } } ;
615- { { { makeSetValue ( 'writefds' , '4' , 'dstWriteHigh' , 'i32' ) } } } ;
616- }
617- if ( exceptfds ) {
618- { { { makeSetValue ( 'exceptfds' , '0' , 'dstExceptLow' , 'i32' ) } } } ;
619- { { { makeSetValue ( 'exceptfds' , '4' , 'dstExceptHigh' , 'i32' ) } } } ;
620- }
621642
622- return total ;
643+ fdSet . commit ( ) ;
644+
645+ return fdSet . getTotal ( ) ;
623646 } ,
624647 _msync_js__i53abi : true ,
625648 _msync_js : ( addr , len , prot , flags , fd , offset ) => {
0 commit comments