From 53b9eae3875122a65b387adf18c5cb7a67e824d7 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Tue, 20 May 2025 20:56:46 +0000 Subject: [PATCH] runtime: use the immortal weak handle map for sbrk mode Currently weak pointers break in sbrk mode. We can just use the immortal weak handle map for weak pointers in this case, since nothing is ever freed. Fixes #69729. Change-Id: Ie9fa7e203c22776dc9eb3601c6480107d9ad0c99 Reviewed-on: https://go-review.googlesource.com/c/go/+/674656 Reviewed-by: Carlos Amedee Auto-Submit: Michael Knyszek TryBot-Bypass: Michael Knyszek --- src/runtime/mheap.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 0729184e22..3612d71e66 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -2545,6 +2545,16 @@ func gcWakeAllStrongFromWeak() { // Retrieves or creates a weak pointer handle for the object p. func getOrAddWeakHandle(p unsafe.Pointer) *atomic.Uintptr { + if debug.sbrk != 0 { + // debug.sbrk never frees memory, so it'll never go nil. However, we do still + // need a weak handle that's specific to p. Use the immortal weak handle map. + // Keep p alive across the call to getOrAdd defensively, though it doesn't + // really matter in this particular case. + handle := mheap_.immortalWeakHandles.getOrAdd(uintptr(p)) + KeepAlive(p) + return handle + } + // First try to retrieve without allocating. if handle := getWeakHandle(p); handle != nil { // Keep p alive for the duration of the function to ensure