diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2018-06-09 14:29:41 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2018-06-12 21:19:58 +0300 |
commit | 2bb0cfbf8137e02cc32aae3b36f85ef7300e8936 (patch) | |
tree | 42899dbeb32459722d27606bd79848a25a8c5e16 /events.c | |
parent | df21a9349a256fd2bea1f8701af198b312682d39 (diff) |
Split UVC gadget into a library and test application
Split the project into a UVC gadget library and a test application. To
avoid rolling out a custom build system, switch to CMake.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'events.c')
-rw-r--r-- | events.c | 183 |
1 files changed, 0 insertions, 183 deletions
diff --git a/events.c b/events.c deleted file mode 100644 index 6840c19..0000000 --- a/events.c +++ /dev/null @@ -1,183 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Generic Event Handling - * - * Copyright (C) 2018 Laurent Pinchart - * - * This file comes from the omap3-isp-live project - * (git://git.ideasonboard.org/omap3-isp-live.git) - * - * Copyright (C) 2010-2011 Ideas on board SPRL - * - * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com> - */ - -#define _DEFAULT_SOURCE -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <sys/select.h> - -#include "events.h" -#include "list.h" -#include "tools.h" - -#define SELECT_TIMEOUT 2000 /* in milliseconds */ - -struct event_fd { - struct list_entry list; - - int fd; - enum event_type type; - void (*callback)(void *priv); - void *priv; -}; - -void events_watch_fd(struct events *events, int fd, enum event_type type, - void(*callback)(void *), void *priv) -{ - struct event_fd *event; - - event = malloc(sizeof *event); - if (event == NULL) - return; - - event->fd = fd; - event->type = type; - event->callback = callback; - event->priv = priv; - - switch (event->type) { - case EVENT_READ: - FD_SET(fd, &events->rfds); - break; - case EVENT_WRITE: - FD_SET(fd, &events->wfds); - break; - case EVENT_EXCEPTION: - FD_SET(fd, &events->efds); - break; - } - - events->maxfd = max(events->maxfd, fd); - - list_append(&event->list, &events->events); -} - -void events_unwatch_fd(struct events *events, int fd, enum event_type type) -{ - struct event_fd *event = NULL; - struct event_fd *entry; - int maxfd = 0; - - list_for_each_entry(entry, &events->events, list) { - if (entry->fd == fd && entry->type == type) - event = entry; - else - maxfd = max(maxfd, entry->fd); - } - - if (event == NULL) - return; - - switch (event->type) { - case EVENT_READ: - FD_CLR(fd, &events->rfds); - break; - case EVENT_WRITE: - FD_CLR(fd, &events->wfds); - break; - case EVENT_EXCEPTION: - FD_CLR(fd, &events->efds); - break; - } - - events->maxfd = maxfd; - - list_remove(&event->list); - free(event); -} - -static void events_dispatch(struct events *events, const fd_set *rfds, - const fd_set *wfds, const fd_set *efds) -{ - struct event_fd *event; - struct event_fd *next; - - list_for_each_entry_safe(event, next, &events->events, list) { - if (event->type == EVENT_READ && - FD_ISSET(event->fd, rfds)) - event->callback(event->priv); - else if (event->type == EVENT_WRITE && - FD_ISSET(event->fd, wfds)) - event->callback(event->priv); - else if (event->type == EVENT_EXCEPTION && - FD_ISSET(event->fd, efds)) - event->callback(event->priv); - - /* If the callback stopped events processing, we're done. */ - if (events->done) - break; - } -} - -bool events_loop(struct events *events) -{ - events->done = false; - - while (!events->done) { - fd_set rfds; - fd_set wfds; - fd_set efds; - int ret; - - rfds = events->rfds; - wfds = events->wfds; - efds = events->efds; - - ret = select(events->maxfd + 1, &rfds, &wfds, &efds, NULL); - if (ret < 0) { - /* EINTR means that a signal has been received, continue - * to the next iteration in that case. - */ - if (errno == EINTR) - continue; - - printf("error: select failed with %d\n", errno); - break; - } - - events_dispatch(events, &rfds, &wfds, &efds); - } - - return !events->done; -} - -void events_stop(struct events *events) -{ - events->done = true; -} - -void events_init(struct events *events) -{ - memset(events, 0, sizeof *events); - - FD_ZERO(&events->rfds); - FD_ZERO(&events->wfds); - FD_ZERO(&events->efds); - events->maxfd = 0; - list_init(&events->events); -} - -void events_cleanup(struct events *events) -{ - while (!list_empty(&events->events)) { - struct event_fd *event; - - event = list_first_entry(&events->events, typeof(*event), list); - list_remove(&event->list); - free(event); - } -} |