// --------------------------------------------------------------------- UInt32 FskNetInterfaceEnumerate() { return FskListMutexCount(gNetworkInterfaceList); }
void gpioThread(void *param) { int seed = -1; struct pollfd *fds = NULL; int fdsInUse = 0; int pollersCount = 0; while (!gGPIOThreadQuit) { int result; linuxDigital walker; FskMutexAcquire(gLinuxDigitalPins->mutex); if (seed != gGPIOPollersSeed) { FskErr err; pollersCount = (int)FskListMutexCount(gLinuxDigitalPins); err = FskMemPtrRealloc((pollersCount + 1) * sizeof(struct pollfd), &fds); if (err) { FskMutexRelease(gLinuxDigitalPins->mutex); break; } seed = gGPIOPollersSeed; fds[0].fd = gGPIOEventFD; fds[0].events = POLLIN | POLLERR | POLLHUP; fdsInUse = 1; for (walker = (linuxDigital)gLinuxDigitalPins->list; NULL != walker; walker = *(linuxDigital *)walker) { linuxDigital w = (linuxDigital)(((char *)walker) - offsetof(linuxDigitalRecord, next)); if (w->canInterrupt && w->triggeredCallback) { fds[fdsInUse].fd = w->file; fds[fdsInUse].events = POLLPRI; fdsInUse += 1; } } } FskMutexRelease(gLinuxDigitalPins->mutex); result = poll(fds, fdsInUse, -1); if (fds[0].revents & POLLIN) { uint64_t ignore; read(gGPIOEventFD, &ignore, sizeof(ignore)); } FskMutexAcquire(gLinuxDigitalPins->mutex); for (walker = (linuxDigital)gLinuxDigitalPins->list; NULL != walker; walker = *(linuxDigital *)walker) { linuxDigital w = (linuxDigital)(((char *)walker) - offsetof(linuxDigitalRecord, next)); int i; struct pollfd *fdp = &fds[1]; for (i = 1; i < fdsInUse; i++, fdp++) { if ((fdp->fd == w->file) && (fdp->revents & POLLPRI)) { char buffer[6]; lseek(w->file, 0, SEEK_SET); read(w->file, buffer, sizeof(buffer) - 1); if (w->triggeredCallback) (w->triggeredCallback)((FskPinDigital)w, w->triggeredRefCon); break; } } } FskMutexRelease(gLinuxDigitalPins->mutex); } FskMemPtrDispose(fds); }