]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix futexsleep test on freebsd/386
authorMikio Hara <mikioh.mikioh@gmail.com>
Fri, 7 Mar 2014 22:34:40 +0000 (07:34 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Fri, 7 Mar 2014 22:34:40 +0000 (07:34 +0900)
Fixes #7194.

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/72310043

src/pkg/runtime/futex_test.go

index f4054b7e78075fa7790661348cc9ac0a99f48d43..c70c10be2340d7d99a78deeb28a454089101243b 100644 (file)
@@ -2,33 +2,70 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Futex is only available on Dragonfly, FreeBSD and Linux.
-// The race detector emits calls to split stack functions so it breaks the test.
+// Futex is only available on DragonFly BSD, FreeBSD and Linux.
+// The race detector emits calls to split stack functions so it breaks
+// the test.
+
 // +build dragonfly freebsd linux
 // +build !race
 
 package runtime_test
 
 import (
-       "runtime"
+       "runtime"
        "testing"
        "time"
 )
 
+type futexsleepTest struct {
+       mtx uint32
+       ns  int64
+       msg string
+       ch  chan futexsleepTest
+}
+
+var futexsleepTests = []futexsleepTest{
+       beforeY2038: {mtx: 0, ns: 86400 * 1e9, msg: "before the year 2038", ch: make(chan futexsleepTest, 1)},
+       afterY2038:  {mtx: 0, ns: (1<<31 + 100) * 1e9, msg: "after the year 2038", ch: make(chan futexsleepTest, 1)},
+}
+
+const (
+       beforeY2038 = iota
+       afterY2038
+)
+
 func TestFutexsleep(t *testing.T) {
-       ch := make(chan bool, 1)
-       var dummy uint32
        start := time.Now()
-       go func() {
-               Entersyscall()
-               Futexsleep(&dummy, 0, (1<<31+100)*1e9)
-               Exitsyscall()
-               ch <- true
-       }()
-       select {
-       case <-ch:
-               t.Errorf("futexsleep finished early after %s!", time.Since(start))
-       case <-time.After(time.Second):
-               Futexwakeup(&dummy, 1)
+       for _, tt := range futexsleepTests {
+               go func(tt futexsleepTest) {
+                       runtime.Entersyscall()
+                       runtime.Futexsleep(&tt.mtx, tt.mtx, tt.ns)
+                       runtime.Exitsyscall()
+                       tt.ch <- tt
+               }(tt)
+       }
+loop:
+       for {
+               select {
+               case tt := <-futexsleepTests[beforeY2038].ch:
+                       t.Errorf("futexsleep test %q finished early after %s", tt.msg, time.Since(start))
+                       break loop
+               case tt := <-futexsleepTests[afterY2038].ch:
+                       // Looks like FreeBSD 10 kernel has changed
+                       // the semantics of timedwait on userspace
+                       // mutex to make broken stuff look broken.
+                       switch {
+                       case runtime.GOOS == "freebsd" && runtime.GOARCH == "386":
+                               t.Log("freebsd/386 may not work correctly after the year 2038, see golang.org/issue/7194")
+                       default:
+                               t.Errorf("futexsleep test %q finished early after %s", tt.msg, time.Since(start))
+                               break loop
+                       }
+               case <-time.After(time.Second):
+                       break loop
+               }
+       }
+       for _, tt := range futexsleepTests {
+               runtime.Futexwakeup(&tt.mtx, 1)
        }
 }