mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: fix tiny allocator
When a new tiny block is allocated because we're allocating an object that won't fit into the current block, mallocgc saves the new block if it has more space leftover than the old block. However, the logic for this was subtly broken in golang.org/cl/2814, resulting in never saving (or consequently reusing) a tiny block. Change-Id: Ib5f6769451fb82877ddeefe75dfe79ed4a04fd40 Reviewed-on: https://go-review.googlesource.com/16330 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
e6ccfc1ad1
commit
d18167fefe
2 changed files with 18 additions and 1 deletions
|
|
@ -82,6 +82,23 @@ func TestStringConcatenationAllocs(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestTinyAlloc(t *testing.T) {
|
||||
const N = 16
|
||||
var v [N]unsafe.Pointer
|
||||
for i := range v {
|
||||
v[i] = unsafe.Pointer(new(byte))
|
||||
}
|
||||
|
||||
chunks := make(map[uintptr]bool, N)
|
||||
for _, p := range v {
|
||||
chunks[uintptr(p)&^7] = true
|
||||
}
|
||||
|
||||
if len(chunks) == N {
|
||||
t.Fatal("no bytes allocated within the same 8-byte chunk")
|
||||
}
|
||||
}
|
||||
|
||||
var mallocSink uintptr
|
||||
|
||||
func BenchmarkMalloc8(b *testing.B) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue