Example #1
0
// ---------------------------------------------------------------------
UInt32 FskNetInterfaceEnumerate() {
	return FskListMutexCount(gNetworkInterfaceList);
}
Example #2
0
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);
}