diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/pkg/runtime/mfinal_test.go | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-upstream/1.4.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/pkg/runtime/mfinal_test.go')
-rw-r--r-- | src/pkg/runtime/mfinal_test.go | 239 |
1 files changed, 0 insertions, 239 deletions
diff --git a/src/pkg/runtime/mfinal_test.go b/src/pkg/runtime/mfinal_test.go deleted file mode 100644 index 6b53888ab..000000000 --- a/src/pkg/runtime/mfinal_test.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package runtime_test - -import ( - "runtime" - "testing" - "time" - "unsafe" -) - -type Tintptr *int // assignable to *int -type Tint int // *Tint implements Tinter, interface{} - -func (t *Tint) m() {} - -type Tinter interface { - m() -} - -func TestFinalizerType(t *testing.T) { - if runtime.GOARCH != "amd64" { - t.Skipf("Skipping on non-amd64 machine") - } - - ch := make(chan bool, 10) - finalize := func(x *int) { - if *x != 97531 { - t.Errorf("finalizer %d, want %d", *x, 97531) - } - ch <- true - } - - var finalizerTests = []struct { - convert func(*int) interface{} - finalizer interface{} - }{ - {func(x *int) interface{} { return x }, func(v *int) { finalize(v) }}, - {func(x *int) interface{} { return Tintptr(x) }, func(v Tintptr) { finalize(v) }}, - {func(x *int) interface{} { return Tintptr(x) }, func(v *int) { finalize(v) }}, - {func(x *int) interface{} { return (*Tint)(x) }, func(v *Tint) { finalize((*int)(v)) }}, - {func(x *int) interface{} { return (*Tint)(x) }, func(v Tinter) { finalize((*int)(v.(*Tint))) }}, - } - - for _, tt := range finalizerTests { - done := make(chan bool, 1) - go func() { - v := new(int) - *v = 97531 - runtime.SetFinalizer(tt.convert(v), tt.finalizer) - v = nil - done <- true - }() - <-done - runtime.GC() - select { - case <-ch: - case <-time.After(time.Second * 4): - t.Errorf("finalizer for type %T didn't run", tt.finalizer) - } - } -} - -type bigValue struct { - fill uint64 - it bool - up string -} - -func TestFinalizerInterfaceBig(t *testing.T) { - if runtime.GOARCH != "amd64" { - t.Skipf("Skipping on non-amd64 machine") - } - ch := make(chan bool) - done := make(chan bool, 1) - go func() { - v := &bigValue{0xDEADBEEFDEADBEEF, true, "It matters not how strait the gate"} - old := *v - runtime.SetFinalizer(v, func(v interface{}) { - i, ok := v.(*bigValue) - if !ok { - t.Errorf("finalizer called with type %T, want *bigValue", v) - } - if *i != old { - t.Errorf("finalizer called with %+v, want %+v", *i, old) - } - close(ch) - }) - v = nil - done <- true - }() - <-done - runtime.GC() - select { - case <-ch: - case <-time.After(4 * time.Second): - t.Errorf("finalizer for type *bigValue didn't run") - } -} - -func fin(v *int) { -} - -// Verify we don't crash at least. golang.org/issue/6857 -func TestFinalizerZeroSizedStruct(t *testing.T) { - type Z struct{} - z := new(Z) - runtime.SetFinalizer(z, func(*Z) {}) -} - -func BenchmarkFinalizer(b *testing.B) { - const Batch = 1000 - b.RunParallel(func(pb *testing.PB) { - var data [Batch]*int - for i := 0; i < Batch; i++ { - data[i] = new(int) - } - for pb.Next() { - for i := 0; i < Batch; i++ { - runtime.SetFinalizer(data[i], fin) - } - for i := 0; i < Batch; i++ { - runtime.SetFinalizer(data[i], nil) - } - } - }) -} - -func BenchmarkFinalizerRun(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - v := new(int) - runtime.SetFinalizer(v, fin) - } - }) -} - -// One chunk must be exactly one sizeclass in size. -// It should be a sizeclass not used much by others, so we -// have a greater chance of finding adjacent ones. -// size class 19: 320 byte objects, 25 per page, 1 page alloc at a time -const objsize = 320 - -type objtype [objsize]byte - -func adjChunks() (*objtype, *objtype) { - var s []*objtype - - for { - c := new(objtype) - for _, d := range s { - if uintptr(unsafe.Pointer(c))+unsafe.Sizeof(*c) == uintptr(unsafe.Pointer(d)) { - return c, d - } - if uintptr(unsafe.Pointer(d))+unsafe.Sizeof(*c) == uintptr(unsafe.Pointer(c)) { - return d, c - } - } - s = append(s, c) - } -} - -// Make sure an empty slice on the stack doesn't pin the next object in memory. -func TestEmptySlice(t *testing.T) { - if true { // disable until bug 7564 is fixed. - return - } - x, y := adjChunks() - - // the pointer inside xs points to y. - xs := x[objsize:] // change objsize to objsize-1 and the test passes - - fin := make(chan bool, 1) - runtime.SetFinalizer(y, func(z *objtype) { fin <- true }) - runtime.GC() - select { - case <-fin: - case <-time.After(4 * time.Second): - t.Errorf("finalizer of next object in memory didn't run") - } - xsglobal = xs // keep empty slice alive until here -} - -var xsglobal []byte - -func adjStringChunk() (string, *objtype) { - b := make([]byte, objsize) - for { - s := string(b) - t := new(objtype) - p := *(*uintptr)(unsafe.Pointer(&s)) - q := uintptr(unsafe.Pointer(t)) - if p+objsize == q { - return s, t - } - } -} - -// Make sure an empty string on the stack doesn't pin the next object in memory. -func TestEmptyString(t *testing.T) { - x, y := adjStringChunk() - - ss := x[objsize:] // change objsize to objsize-1 and the test passes - fin := make(chan bool, 1) - // set finalizer on string contents of y - runtime.SetFinalizer(y, func(z *objtype) { fin <- true }) - runtime.GC() - select { - case <-fin: - case <-time.After(4 * time.Second): - t.Errorf("finalizer of next string in memory didn't run") - } - ssglobal = ss // keep 0-length string live until here -} - -var ssglobal string - -// Test for issue 7656. -func TestFinalizerOnGlobal(t *testing.T) { - runtime.SetFinalizer(Foo1, func(p *Object1) {}) - runtime.SetFinalizer(Foo2, func(p *Object2) {}) - runtime.SetFinalizer(Foo1, nil) - runtime.SetFinalizer(Foo2, nil) -} - -type Object1 struct { - Something []byte -} - -type Object2 struct { - Something byte -} - -var ( - Foo2 = &Object2{} - Foo1 = &Object1{} -) |