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 <carlos@golang.org>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
TryBot-Bypass: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
Michael Anthony Knyszek 2025-05-20 20:56:46 +00:00 committed by Gopher Robot
parent 27ff0f249c
commit 53b9eae387

View File

@ -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