Skip to content

Commit 1bb9651

Browse files
committed
select: separate parsers to functions
Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com>
1 parent 1cd1c2e commit 1bb9651

File tree

1 file changed

+65
-42
lines changed

1 file changed

+65
-42
lines changed

src/lib/libsyscall.js

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)