primitiveAioSuspend(void) { sqInt exceptionWatch; sqInt fd; sqInt flags; sqInt readWatch; sqInt writeWatch; if ((nilObject()) == (stackValue(3))) { return primitiveFail(); } fd = stackIntegerValue(3); if (fd < 0) { return primitiveFail(); } exceptionWatch = stackObjectValue(2); readWatch = stackObjectValue(1); writeWatch = stackObjectValue(0); flags = 0; if (exceptionWatch == (trueObject())) { flags = flags | (AIO_X); } if (readWatch == (trueObject())) { flags = flags | (AIO_R); } if (writeWatch == (trueObject())) { flags = flags | (AIO_W); } aioSuspend(fd, flags); pop(5); pushInteger(flags); return 0; }
void aioDisable(int fd) { if (fd < 0) { FPRINTF((stderr, "aioDisable(%d): IGNORED\n", fd)); return; } FPRINTF((stderr, "aioDisable(%d)\n", fd)); aioSuspend(fd, AIO_RWX); FD_CLR(fd, &xdMask); FD_CLR(fd, &fdMask); rdHandler[fd]= wrHandler[fd]= exHandler[fd]= 0; clientData[fd]= 0; /* keep maxFd accurate (drops to zero if no more sockets) */ while (maxFd && !FD_ISSET(maxFd - 1, &fdMask)) --maxFd; }