From be47d6eceffd2c5dbbc1566d5eea490527fb2bd4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 16 Jul 2013 06:54:42 +0000 Subject: libgo: Update to Go 1.1.1. From-SVN: r200974 --- libgo/go/runtime/gc_test.go | 104 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 6 deletions(-) (limited to 'libgo/go/runtime/gc_test.go') diff --git a/libgo/go/runtime/gc_test.go b/libgo/go/runtime/gc_test.go index 283a6812e95..05ee34869cc 100644 --- a/libgo/go/runtime/gc_test.go +++ b/libgo/go/runtime/gc_test.go @@ -5,12 +5,36 @@ package runtime_test import ( + // "os" "runtime" + "runtime/debug" "testing" ) func TestGcSys(t *testing.T) { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) + /* gccgo does not have a go command + if os.Getenv("GOGC") == "off" { + t.Skip("skipping test; GOGC=off in environment") + } + data := struct{ Short bool }{testing.Short()} + got := executeTest(t, testGCSysSource, &data) + want := "OK\n" + if got != want { + t.Fatalf("expected %q, but got %q", want, got) + } + */ +} + +const testGCSysSource = ` +package main + +import ( + "fmt" + "runtime" +) + +func main() { + runtime.GOMAXPROCS(1) memstats := new(runtime.MemStats) runtime.GC() runtime.ReadMemStats(memstats) @@ -19,9 +43,9 @@ func TestGcSys(t *testing.T) { runtime.MemProfileRate = 0 // disable profiler itercount := 1000000 - if testing.Short() { - itercount = 100000 - } +{{if .Short}} + itercount = 100000 +{{end}} for i := 0; i < itercount; i++ { workthegc() } @@ -34,15 +58,17 @@ func TestGcSys(t *testing.T) { } else { sys = memstats.Sys - sys } - t.Logf("used %d extra bytes", sys) if sys > 16<<20 { - t.Fatalf("using too much memory: %d bytes", sys) + fmt.Printf("using too much memory: %d bytes\n", sys) + return } + fmt.Printf("OK\n") } func workthegc() []byte { return make([]byte, 1029) } +` func TestGcDeepNesting(t *testing.T) { type T [2][2][2][2][2][2][2][2][2][2]*int @@ -59,3 +85,69 @@ func TestGcDeepNesting(t *testing.T) { t.Fail() } } + +func TestGcHashmapIndirection(t *testing.T) { + defer debug.SetGCPercent(debug.SetGCPercent(1)) + runtime.GC() + type T struct { + a [256]int + } + m := make(map[T]T) + for i := 0; i < 2000; i++ { + var a T + a.a[0] = i + m[a] = T{} + } +} + +func TestGcArraySlice(t *testing.T) { + type X struct { + buf [1]byte + nextbuf []byte + next *X + } + var head *X + for i := 0; i < 10; i++ { + p := &X{} + p.buf[0] = 42 + p.next = head + if head != nil { + p.nextbuf = head.buf[:] + } + head = p + runtime.GC() + } + for p := head; p != nil; p = p.next { + if p.buf[0] != 42 { + t.Fatal("corrupted heap") + } + } +} + +func TestGcRescan(t *testing.T) { + type X struct { + c chan error + nextx *X + } + type Y struct { + X + nexty *Y + p *int + } + var head *Y + for i := 0; i < 10; i++ { + p := &Y{} + p.c = make(chan error) + p.nextx = &head.X + p.nexty = head + p.p = new(int) + *p.p = 42 + head = p + runtime.GC() + } + for p := head; p != nil; p = p.nexty { + if *p.p != 42 { + t.Fatal("corrupted heap") + } + } +} -- cgit v1.2.3