瀏覽代碼

Merge pull request #64 from ericbalsa/main

timeout and fdSet need to be set on each loop iteration as select() can modify them on linux
Vladimir Vivien 1 月之前
父節點
當前提交
c2de2891bb
共有 1 個文件被更改,包括 9 次插入3 次删除
  1. 9 3
      v4l2/syscalls.go

+ 9 - 3
v4l2/syscalls.go

@@ -94,14 +94,20 @@ func WaitForRead(dev Device) <-chan struct{} {
 	go func(fd uintptr) {
 	go func(fd uintptr) {
 		defer close(sigChan)
 		defer close(sigChan)
 		var fdsRead sys.FdSet
 		var fdsRead sys.FdSet
-		fdsRead.Set(int(fd))
-		tv := sys.Timeval{Sec: 2, Usec: 0}
 		for {
 		for {
-			_, errno := sys.Select(int(fd+1), &fdsRead, nil, nil, &tv)
+			fdsRead.Zero()
+			fdsRead.Set(int(fd))
+			tv := sys.Timeval{Sec: 2, Usec: 0}
+			n, errno := sys.Select(int(fd+1), &fdsRead, nil, nil, &tv)
 			if errno == sys.EINTR {
 			if errno == sys.EINTR {
 				continue
 				continue
 			}
 			}
 
 
+			if n == 0 {
+				// timeout, no data available
+				continue
+			}
+
 			sigChan <- struct{}{}
 			sigChan <- struct{}{}
 		}
 		}
 	}(dev.Fd())
 	}(dev.Fd())