]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: correctly account for allocated objects in allocfree trace
authorMichael Anthony Knyszek <mknyszek@google.com>
Mon, 20 May 2024 20:18:02 +0000 (20:18 +0000)
committerGopher Robot <gobot@golang.org>
Wed, 22 May 2024 19:18:09 +0000 (19:18 +0000)
The current implementation doesn't handle s.freeindex at all, which
means it'll skip a whole bunch of recently-made allocations, because the
span may have not been swept yet.

Change-Id: I8c5e360f5927ffe7e9abb448b352a59875e31b02
Reviewed-on: https://go-review.googlesource.com/c/go/+/586996
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/traceallocfree.go

index e1190394ed1a340571230448d574df12163634c6..3067e1667025b96f85edf7b3cec67a010d3f8d76 100644 (file)
@@ -45,11 +45,10 @@ func traceSnapshotMemory() {
                // Find all allocated objects.
                abits := s.allocBitsForIndex(0)
                for i := uintptr(0); i < uintptr(s.nelems); i++ {
-                       if !abits.isMarked() {
-                               continue
+                       if abits.index < uintptr(s.freeindex) || abits.isMarked() {
+                               x := s.base() + i*s.elemsize
+                               trace.HeapObjectExists(x, s.typePointersOfUnchecked(x).typ)
                        }
-                       x := s.base() + i*s.elemsize
-                       trace.HeapObjectExists(x, s.typePointersOfUnchecked(x).typ)
                        abits.advance()
                }
        }