Skip to content

Commit

Permalink
reflect: use a bigger object when we need a finalizer to run
Browse files Browse the repository at this point in the history
If an object is allocated as part of a tinyalloc, then other live
objects in the same tinyalloc chunk keep the finalizer from being run,
even if the object that has the finalizer is dead.

Make sure the object we're setting the finalizer on is big enough
to not trigger tinyalloc allocation.

Fixes #26857
Update #21717

Change-Id: I56ad8679426283237ebff20a0da6c9cf64eb1c27
Reviewed-on: https://go-review.googlesource.com/128475
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
  • Loading branch information
randall77 committed Aug 24, 2018
1 parent 776298a commit 78ce3a0
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/reflect/all_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1693,9 +1693,9 @@ func TestCallReturnsEmpty(t *testing.T) {
// nonzero-sized frame and zero-sized return value.
runtime.GC()
var finalized uint32
f := func() (emptyStruct, *int) {
i := new(int)
runtime.SetFinalizer(i, func(*int) { atomic.StoreUint32(&finalized, 1) })
f := func() (emptyStruct, *[2]int64) {
i := new([2]int64) // big enough to not be tinyalloc'd, so finalizer always runs when i dies
runtime.SetFinalizer(i, func(*[2]int64) { atomic.StoreUint32(&finalized, 1) })
return emptyStruct{}, i
}
v := ValueOf(f).Call(nil)[0] // out[0] should not alias out[1]'s memory, so the finalizer should run.
Expand Down

0 comments on commit 78ce3a0

Please sign in to comment.