It works on i386, but fails on amd64 and arm.
««« original CL description
runtime: prevent the GC from seeing the content of a frame in runfinq()
Fixes #5348.
R=golang-dev, dvyukov
CC=golang-dev
https://golang.org/cl/
8954044
»»»
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/
8695051
framesz = sizeof(uintptr) + f->nret;
if(framecap < framesz) {
runtime·free(frame);
- frame = runtime·mallocgc(framesz, FlagNoPointers, 0, 1);
+ frame = runtime·mal(framesz);
framecap = framesz;
}
*(void**)frame = f->arg;
+++ /dev/null
-// run
-
-// Copyright 2013 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.
-
-// Issue 5348: finalizers keep data live for a surprising amount of time
-
-package main
-
-import (
- "runtime"
-)
-
-type T struct {
- S *string
-}
-
-func newString(s string) *string {
- return &s
-}
-
-var c = make(chan int)
-
-func foo() {
- t := &T{S: newString("foo")}
- runtime.SetFinalizer(t, func(p *T) { c <- 0 })
- runtime.SetFinalizer(t.S, func(p *string) { c <- 0 })
-}
-
-func main() {
- foo()
- runtime.GC()
- <-c
- runtime.GC()
- <-c
-}