mirror of
https://github.com/golang/go.git
synced 2025-05-22 16:09:37 +00:00
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:
parent
27ff0f249c
commit
53b9eae387
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user