static void closeStream(int i) { int j; close(stream[i].fd); FD_CLR(stream[i].fd, &activeSet); FD_CLR(stream[i].fd, &readSet); FD_CLR(stream[i].fd, &writeSet); stream[i].fd = INVALID_SOCKET; /* Free for re-use */ if (i == socketIdxMax) { socketIdxMax = 0; socketFdMax = 0; for (j = i - 1; j >= 0; j--) { if (stream[j].fd != INVALID_SOCKET) { socketIdxMax = CB_MAX(socketIdxMax, j); socketFdMax = CB_MAX(socketFdMax, stream[j].fd); } } } logDebug("closeStream(%d) (%u..%u fdMax=%d)\n", i, socketIdxMin, socketIdxMax, socketFdMax); }
static void closeStream(int i) { logDebug("closeStream(%d)\n", i); close(stream[i].fd); FD_CLR(stream[i].fd, &activeSet); FD_CLR(stream[i].fd, &readSet); FD_CLR(stream[i].fd, &writeSet); stream[i].fd = -1; /* Free for re-use */ if (i == socketIdxMax) { socketIdxMax = -1; socketFdMax = -1; for (i--; i >= 0; i--) { if (stream[i].fd != -1) { socketIdxMax = CB_MAX(socketIdxMax, i); socketFdMax = CB_MAX(socketFdMax, stream[i].fd); } } } logDebug("closeStream(%d) IdMax=%u FdMax=%d\n", i, socketIdxMax, socketFdMax); }
int setFdUsed(SOCKET fd, StreamType ct) { int i; /* Find a free entry in socketFd(i) */ for (i = 0; i <= socketIdxMax; i++) { if (stream[i].fd == -1 || stream[i].fd == fd) { break; } } if (i == FD_SETSIZE) { logError("Already %d active streams, ignoring new one\n", FD_SETSIZE); close(fd); return -1; } stream[i].fd = fd; stream[i].timeout = epoch() + UPDATE_INTERVAL; stream[i].type = ct; stream[i].readHandler = readHandlers[ct]; FD_SET(fd, &activeSet); if (stream[i].readHandler) { logDebug("Enabling fd=%d in the readSet\n", fd); FD_SET(fd, &readSet); } else { logDebug("Disabling fd=%d in the readSet\n", fd); FD_CLR(fd, &readSet); } switch (stream[i].type) { case CLIENT_JSON: case CLIENT_JSON_STREAM: case CLIENT_NMEA0183_STREAM: case DATA_OUTPUT_STREAM: case DATA_OUTPUT_COPY: logDebug("Enabling fd=%d in the writeSet\n", fd); FD_SET(fd, &writeSet); break; default: logDebug("Clear fd=%d in the writeSet\n", fd); FD_CLR(fd, &writeSet); } socketIdxMax = CB_MAX(socketIdxMax, i); socketFdMax = CB_MAX(socketFdMax, fd); logDebug("New client %u type %d %u..%u fd=%d fdMax=%d\n", i, stream[i].type, socketIdxMin, socketIdxMax, fd, socketFdMax); return i; }
void setLogLevel(LogLevel level) { logLevel = CB_MIN(CB_MAX(level, LOGLEVEL_FATAL), LOGLEVEL_DEBUG); logDebug("Loglevel now %d\n", logLevel); }