]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use the immortal weak handle map for sbrk mode
authorMichael Anthony Knyszek <mknyszek@google.com>
Tue, 20 May 2025 20:56:46 +0000 (20:56 +0000)
committerGopher Robot <gobot@golang.org>
Thu, 22 May 2025 04:20:52 +0000 (21:20 -0700)
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>

src/runtime/mheap.go

index 0729184e22e6f92c206ab01ca7d8d7063b285838..3612d71e666a0f9b713be654e11049079e29c5a6 100644 (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