Abraham vd Merwe wrote:
Hi!
1. user does select() to wait for a frame to be ready.
2. select polls until it finds a frame that's done and return POLLIN
3. interrupt handler goes and unmark that frame as ready and start capturing
a new frame into that same buffer.
4. user does VIDIOC_DQBUF ioctl which fails because that buffer is not ready
anymore.
There's no way with the current API to avoid above scenario unless the
driver already dequeues the buffer in select() and then just confirms it in
the DQBUF ioctl. (Or if VIDIOC_DQBUF blocked).
How am I supposed to avoid the race without resorting to the methods
mentioned above?
This shouldn't be a problem. The driver isn't supposed to capture
another image into the buffer until it is queued again. The buffer
should have the following states:
1) Unused
2) Waiting to capture
3) Capturing
4) Capture completed
5) Dequeued (go back to 1)
There is no way to go from state 4 back to state 3 withou program
intervention. If the driver handles it differently, then there is
probably a problem with the driver.
-justin