aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/mheap.go10
1 files changed, 10 insertions, 0 deletions
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