View Single Post
tz1's Avatar
Posts: 716 | Thanked: 236 times | Joined on Dec 2007
#19
I'm not sure how stable this is, but I did get the loopback device to block. The problem seems to be that this flag is easily set, but not always reset when the read endpoint opens or closes.

Code:
diff -Bburw  /home/tz/sbnok/t/flashcam-1.1/vloopback-1.1.2/vloopback.c vloopback.c--- /home/tz/sbnok/t/flashcam-1.1/vloopback-1.1.2/vloopback.c   2008-03-27 04:30:34.000000000 -0500
+++ vloopback.c 2008-05-12 14:11:47.000000000 -0500
@@ -156,7 +156,7 @@
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
 #include <media/v4l2-common.h>
 #endif
-
+#define CONFIG_VIDEO_V4L1_COMPAT 1
 #include <linux/videodev.h>
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
@@ -349,6 +349,7 @@
        } else {
                if (loops[nr]->ropen || loops[nr]->wopen) 
                        return -EBUSY;
+               loops[nr]->pendingread=0;
                loops[nr]->framesdumped=0;
                loops[nr]->frameswrite=0;
                loops[nr]->wopen=1;
@@ -390,6 +391,7 @@
                        wake_up(&loops[nr]->wait);
                }
 
+               loops[nr]->pendingread=0;
                loops[nr]->width=0;
                loops[nr]->height=0;
                loops[nr]->palette=0;
@@ -406,6 +408,7 @@
                if (waitqueue_active(&loops[nr]->wait)) {
                        loops[nr]->pendingread = 1;
                        wake_up(&loops[nr]->wait);
+                       loops[nr]->pendingread = 0;
                }
                loops[nr]->ropen=0;
                if (loops[nr]->zerocopy && loops[nr]->buffer) {