Quellcode durchsuchen

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 vor 1 Monat
Ursprung
Commit
c2de2891bb
1 geänderte Dateien mit 9 neuen und 3 gelöschten Zeilen
  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) {
 		defer close(sigChan)
 		var fdsRead sys.FdSet
-		fdsRead.Set(int(fd))
-		tv := sys.Timeval{Sec: 2, Usec: 0}
 		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 {
 				continue
 			}
 
+			if n == 0 {
+				// timeout, no data available
+				continue
+			}
+
 			sigChan <- struct{}{}
 		}
 	}(dev.Fd())