@@ -108,6 +108,7 @@ int v4l2_event_init(struct v4l2_fh *fh, unsigned int n)
INIT_LIST_HEAD(&fh->events->subscribed);
atomic_set(&fh->events->navailable, 0);
+ atomic_set(&fh->events->sequence, -1);
ret = v4l2_event_alloc(fh, n);
if (ret < 0)
@@ -190,6 +191,7 @@ void v4l2_event_queue(struct video_device *vdev, struct v4l2_event *ev)
list_for_each_entry(fh, &vdev->fhs.list, list) {
struct v4l2_events *events = fh->events;
struct v4l2_kevent *kev;
+ u32 sequence;
/* Is it subscribed? */
if (!v4l2_event_subscribed(fh, ev->type))
@@ -209,6 +211,9 @@ void v4l2_event_queue(struct video_device *vdev, struct v4l2_event *ev)
}
put_me = fh;
+ /* Increase event sequence number on fh. */
+ sequence = atomic_inc_return(&events->sequence);
+
/* Do we have any free events? */
spin_lock_irqsave(&fh->lock, flags);
if (list_empty(&events->free)) {
@@ -223,6 +228,7 @@ void v4l2_event_queue(struct video_device *vdev, struct v4l2_event *ev)
spin_unlock_irqrestore(&fh->lock, flags);
kev->event = *ev;
+ kev->event.sequence = sequence;
/* And add to the available list. */
spin_lock_irqsave(&fh->lock, flags);
@@ -49,6 +49,7 @@ struct v4l2_events {
struct list_head available; /* Dequeueable event */
atomic_t navailable;
struct list_head free; /* Events ready for use */
+ atomic_t sequence;
};
int v4l2_event_alloc(struct v4l2_fh *fh, unsigned int n);