mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 01:49:36 +00:00
![Hans Verkuil](/assets/img/avatar_default.png)
The driver had to decide how many events to allocate when the v4l2_fh struct was created. It was possible to add more events afterwards, but there was no way to ensure that you wouldn't miss important events if the event queue would fill up for that filehandle. In addition, once there were no more free events, any new events were simply dropped on the floor. For the control event in particular this made life very difficult since control status/value changes could just be missed if the number of allocated events and the speed at which the application read events was too low to keep up with the number of generated events. The application would have no idea what the latest state was for a control since it could have missed the latest control change. So this patch makes some major changes in how events are allocated. Instead of allocating events per-filehandle they are now allocated when subscribing an event. So for that particular event type N events (determined by the driver) are allocated. Those events are reserved for that particular event type. This ensures that you will not miss events for a particular type altogether. In addition, if there are N events in use and a new event is raised, then the oldest event is dropped and the new one is added. So the latest event is always available. This can be further improved by adding the ability to merge the state of two events together, ensuring that no data is lost at all. This will be added in the next patch. This also makes it possible to allow the user to determine the number of events that will be allocated. This is not implemented at the moment, but would be trivial. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
101 lines
3.2 KiB
C
101 lines
3.2 KiB
C
/*
|
|
* v4l2-fh.h
|
|
*
|
|
* V4L2 file handle. Store per file handle data for the V4L2
|
|
* framework. Using file handles is optional for the drivers.
|
|
*
|
|
* Copyright (C) 2009--2010 Nokia Corporation.
|
|
*
|
|
* Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef V4L2_FH_H
|
|
#define V4L2_FH_H
|
|
|
|
#include <linux/list.h>
|
|
|
|
struct video_device;
|
|
struct v4l2_ctrl_handler;
|
|
|
|
struct v4l2_fh {
|
|
struct list_head list;
|
|
struct video_device *vdev;
|
|
struct v4l2_ctrl_handler *ctrl_handler;
|
|
enum v4l2_priority prio;
|
|
|
|
/* Events */
|
|
wait_queue_head_t wait;
|
|
struct list_head subscribed; /* Subscribed events */
|
|
struct list_head available; /* Dequeueable event */
|
|
unsigned int navailable;
|
|
u32 sequence;
|
|
};
|
|
|
|
/*
|
|
* Initialise the file handle. Parts of the V4L2 framework using the
|
|
* file handles should be initialised in this function. Must be called
|
|
* from driver's v4l2_file_operations->open() handler if the driver
|
|
* uses v4l2_fh.
|
|
*/
|
|
void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
|
|
/*
|
|
* Add the fh to the list of file handles on a video_device. The file
|
|
* handle must be initialised first.
|
|
*/
|
|
void v4l2_fh_add(struct v4l2_fh *fh);
|
|
/*
|
|
* Can be used as the open() op of v4l2_file_operations.
|
|
* It allocates a v4l2_fh and inits and adds it to the video_device associated
|
|
* with the file pointer.
|
|
*/
|
|
int v4l2_fh_open(struct file *filp);
|
|
/*
|
|
* Remove file handle from the list of file handles. Must be called in
|
|
* v4l2_file_operations->release() handler if the driver uses v4l2_fh.
|
|
* On error filp->private_data will be NULL, otherwise it will point to
|
|
* the v4l2_fh struct.
|
|
*/
|
|
void v4l2_fh_del(struct v4l2_fh *fh);
|
|
/*
|
|
* Release resources related to a file handle. Parts of the V4L2
|
|
* framework using the v4l2_fh must release their resources here, too.
|
|
* Must be called in v4l2_file_operations->release() handler if the
|
|
* driver uses v4l2_fh.
|
|
*/
|
|
void v4l2_fh_exit(struct v4l2_fh *fh);
|
|
/*
|
|
* Can be used as the release() op of v4l2_file_operations.
|
|
* It deletes and exits the v4l2_fh associated with the file pointer and
|
|
* frees it. It will do nothing if filp->private_data (the pointer to the
|
|
* v4l2_fh struct) is NULL. This function always returns 0.
|
|
*/
|
|
int v4l2_fh_release(struct file *filp);
|
|
/*
|
|
* Returns 1 if this filehandle is the only filehandle opened for the
|
|
* associated video_device. If fh is NULL, then it returns 0.
|
|
*/
|
|
int v4l2_fh_is_singular(struct v4l2_fh *fh);
|
|
/*
|
|
* Helper function with struct file as argument. If filp->private_data is
|
|
* NULL, then it will return 0.
|
|
*/
|
|
static inline int v4l2_fh_is_singular_file(struct file *filp)
|
|
{
|
|
return v4l2_fh_is_singular(filp->private_data);
|
|
}
|
|
|
|
#endif /* V4L2_EVENT_H */
|