summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-05-21 16:29:33 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-05-21 16:33:38 +0300
commitd93ee5f7009bbd81631bd7f8493486051a732a23 (patch)
treefd17d3cf9476cf9f033df7c3c3b5130a9599913b
parent72ec206080350e75a87780895f246f5c4f52e790 (diff)
events: Extend the events_unwatch_fd() API with an event type
If a single file descriptor is being watch for multiple event types, it will be present in multiple entries in the watch list. The events_unwatch_fd() function will remove the first entry regardless of its type, not allowing removal of a particular event type. Fix this by extending the events_unwatch_fd() API to take an event type, and remove the corresponding entry. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--events.c4
-rw-r--r--events.h2
2 files changed, 3 insertions, 3 deletions
diff --git a/events.c b/events.c
index 6fcca7d..dba054a 100644
--- a/events.c
+++ b/events.c
@@ -66,14 +66,14 @@ void events_watch_fd(struct events *events, int fd, enum event_type type,
list_append(&event->list, &events->events);
}
-void events_unwatch_fd(struct events *events, int fd)
+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)
+ if (entry->fd == fd && entry->type == type)
event = entry;
else
maxfd = max(maxfd, entry->fd);
diff --git a/events.h b/events.h
index b80cd75..ef8dccc 100644
--- a/events.h
+++ b/events.h
@@ -38,7 +38,7 @@ enum event_type {
void events_watch_fd(struct events *events, int fd, enum event_type type,
void(*callback)(void *), void *priv);
-void events_unwatch_fd(struct events *events, int fd);
+void events_unwatch_fd(struct events *events, int fd, enum event_type type);
bool events_loop(struct events *events);
void events_stop(struct events *events);