py: Switch to non-blocking eventfd

Blocking wait can be easily implemented on top in Python, so rather than
supporting only blocking reads, or supporting both non-blocking and
blocking reads, let's support only non-blocking reads.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Tomi Valkeinen 2022-08-19 14:16:15 +03:00 committed by Laurent Pinchart
parent de7f1aa591
commit bf3dbaece9
6 changed files with 41 additions and 12 deletions

View file

@ -14,6 +14,7 @@
import argparse
import libcamera as libcam
import selectors
import sys
# Number of frames to capture
@ -107,11 +108,18 @@ def main():
# The main loop. Wait for the queued Requests to complete, process them,
# and re-queue them again.
sel = selectors.DefaultSelector()
sel.register(cm.event_fd, selectors.EVENT_READ)
while frames_done < TOTAL_FRAMES:
# cm.get_ready_requests() blocks until there is an event and returns
# all the ready requests. Here we should almost always get a single
# cm.get_ready_requests() does not block, so we use a Selector to wait
# for a camera event. Here we should almost always get a single
# Request, but in some cases there could be multiple or none.
events = sel.select()
if not events:
continue
reqs = cm.get_ready_requests()
for req in reqs: