Browse Source

Fixes syscall.Select call.

The timeval needs to be reset for each call.
See man select for details on using select.
Steve Thielemann 2 years ago
parent
commit
9b36853d23
1 changed files with 10 additions and 3 deletions
  1. 10 3
      door/input_linux.go

+ 10 - 3
door/input_linux.go

@@ -12,7 +12,7 @@ import (
 )
 
 var ReaderInterval = time.Duration(200) * time.Millisecond
-var ReaderTimeval syscall.Timeval = syscall.Timeval{Sec: 0, Usec: 200}
+var ReaderTimeval syscall.Timeval = syscall.NsecToTimeval(int64(ReaderInterval))
 
 // Output a nice string representation of the rune buffer.
 func extended_output(buffer []rune) string {
@@ -384,6 +384,12 @@ func process(d *Door, newRune bool) {
 // This "times out" every ReaderTimeval
 func Reader(d *Door) {
 	// I need non-blocking reads here.
+	/*
+		ReaderTimeval = syscall.Timeval{Sec: int64(ReaderInterval.Seconds()),
+			Usec: ReaderInterval.Microseconds() % time.Second.Microseconds()}
+	*/
+
+	log.Println(ReaderInterval, ReaderTimeval)
 
 	readerBuffer = make([]rune, 0, READ_SIZE*2)
 
@@ -403,12 +409,13 @@ func Reader(d *Door) {
 	var readbuffer [READ_SIZE]byte
 	var runebuffer bytes.Buffer
 	var runeread = bufio.NewReaderSize(&runebuffer, 1)
+	var selectTimeval syscall.Timeval
 
 	for {
 		clearAll(&fdset)
 		set(&fdset, d.READFD)
-
-		v, err := syscall.Select(d.READFD+1, &fdset, nil, nil, &ReaderTimeval)
+		selectTimeval = ReaderTimeval
+		v, err := syscall.Select(d.READFD+1, &fdset, nil, nil, &selectTimeval)
 
 		if err == syscall.EINTR {
 			continue