unix: fix Select to return number of ready fds on Solaris

Make Select's signature on Solaris match the one on Linux and return the number
of ready file descriptors.

Updates golang/go#34458

Change-Id: I118c4c35cbc83dba015ef357ce9bef44c9165ec1
Reviewed-on: https://go-review.googlesource.com/c/sys/+/196807
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Tobias Klauser
2019-09-24 15:45:09 +00:00
committed by Tobias Klauser
parent 2f72d4f062
commit e2fefa8ec2
5 changed files with 40 additions and 6 deletions
+33 -2
View File
@@ -7,6 +7,7 @@
package unix_test
import (
"os"
"os/exec"
"testing"
"time"
@@ -15,23 +16,53 @@ import (
)
func TestSelect(t *testing.T) {
err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0})
n, err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0})
if err != nil {
t.Fatalf("Select: %v", err)
}
if n != 0 {
t.Fatalf("Select: expected 0 ready file descriptors, got %v", n)
}
dur := 150 * time.Millisecond
tv := unix.NsecToTimeval(int64(dur))
start := time.Now()
err = unix.Select(0, nil, nil, nil, &tv)
n, err = unix.Select(0, nil, nil, nil, &tv)
took := time.Since(start)
if err != nil {
t.Fatalf("Select: %v", err)
}
if n != 0 {
t.Fatalf("Select: expected 0 ready file descriptors, got %v", n)
}
if took < dur {
t.Errorf("Select: timeout should have been at least %v, got %v", dur, took)
}
rr, ww, err := os.Pipe()
if err != nil {
t.Fatal(err)
}
defer rr.Close()
defer ww.Close()
if _, err := ww.Write([]byte("HELLO GOPHER")); err != nil {
t.Fatal(err)
}
rFdSet := &unix.FdSet{}
fd := rr.Fd()
// FD_SET(fd, rFdSet)
rFdSet.Bits[fd/unix.NFDBITS] |= (1 << (fd % unix.NFDBITS))
n, err = unix.Select(int(fd+1), rFdSet, nil, nil, nil)
if err != nil {
t.Fatalf("Select: %v", err)
}
if n != 1 {
t.Fatalf("Select: expected 1 ready file descriptors, got %v", n)
}
}
func TestStatvfs(t *testing.T) {