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