| // run |
| |
| // Copyright 2014 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. |
| |
| // Test that s[len(s):] - which can point past the end of the allocated block - |
| // does not confuse the garbage collector. |
| |
| package main |
| |
| import ( |
| "runtime" |
| "time" |
| ) |
| |
| type T struct { |
| ptr **int |
| pad [120]byte |
| } |
| |
| var things []interface{} |
| |
| func main() { |
| setup() |
| runtime.GC() |
| runtime.GC() |
| time.Sleep(10*time.Millisecond) |
| runtime.GC() |
| runtime.GC() |
| time.Sleep(10*time.Millisecond) |
| } |
| |
| func setup() { |
| var Ts []interface{} |
| buf := make([]byte, 128) |
| |
| for i := 0; i < 10000; i++ { |
| s := string(buf) |
| t := &T{ptr: new(*int)} |
| runtime.SetFinalizer(t.ptr, func(**int) { panic("*int freed too early") }) |
| Ts = append(Ts, t) |
| things = append(things, s[len(s):]) |
| } |
| |
| things = append(things, Ts...) |
| } |
| |