aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2025-05-21 13:02:59 -0700
committerGopher Robot <gobot@golang.org>2025-05-27 14:47:09 -0700
commitb78e38065efd5f4079564b9e8e3529950ba0dd52 (patch)
tree4c64ecccbcf759c5e07d3cb59be97c888803d29c
parent961818e0131aaa7468616a90ce9ebf00111ccdaa (diff)
downloadgo-b78e38065efd5f4079564b9e8e3529950ba0dd52.tar.xz
runtime: define lock ranking between weak pointers and synctest
Fixes #73817 Change-Id: I0101bdc797237b4c7eb58b414c71b009b0b44447 Reviewed-on: https://go-review.googlesource.com/c/go/+/675176 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com> Auto-Submit: Damien Neil <dneil@google.com>
-rw-r--r--src/internal/synctest/synctest_test.go13
-rw-r--r--src/runtime/lockrank.go2
-rw-r--r--src/runtime/mklockrank.go10
3 files changed, 23 insertions, 2 deletions
diff --git a/src/internal/synctest/synctest_test.go b/src/internal/synctest/synctest_test.go
index e46040e048..7f71df1710 100644
--- a/src/internal/synctest/synctest_test.go
+++ b/src/internal/synctest/synctest_test.go
@@ -9,11 +9,13 @@ import (
"internal/synctest"
"iter"
"reflect"
+ "runtime"
"slices"
"strconv"
"sync"
"testing"
"time"
+ "weak"
)
func TestNow(t *testing.T) {
@@ -625,6 +627,17 @@ func TestHappensBefore(t *testing.T) {
}
}
+// https://go.dev/issue/73817
+func TestWeak(t *testing.T) {
+ synctest.Run(func() {
+ for range 100 {
+ runtime.GC()
+ b := make([]byte, 1024)
+ weak.Make(&b)
+ }
+ })
+}
+
func wantPanic(t *testing.T, want string) {
if e := recover(); e != nil {
if got := fmt.Sprint(e); got != want {
diff --git a/src/runtime/lockrank.go b/src/runtime/lockrank.go
index 456f2b75e6..7f32e6397b 100644
--- a/src/runtime/lockrank.go
+++ b/src/runtime/lockrank.go
@@ -204,7 +204,7 @@ var lockPartialOrder [][]lockRank = [][]lockRank{
lockRankRoot: {},
lockRankItab: {},
lockRankReflectOffs: {lockRankItab},
- lockRankSynctest: {lockRankSysmon, lockRankScavenge, lockRankSweep, lockRankTestR, lockRankTimerSend, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankRoot, lockRankItab, lockRankReflectOffs},
+ lockRankSynctest: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankStrongFromWeakQueue, lockRankSweep, lockRankTestR, lockRankTimerSend, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankRoot, lockRankItab, lockRankReflectOffs},
lockRankUserArenaState: {},
lockRankTraceBuf: {lockRankSysmon, lockRankScavenge},
lockRankTraceStrings: {lockRankSysmon, lockRankScavenge, lockRankTraceBuf},
diff --git a/src/runtime/mklockrank.go b/src/runtime/mklockrank.go
index 6cccece9b5..2e3375331a 100644
--- a/src/runtime/mklockrank.go
+++ b/src/runtime/mklockrank.go
@@ -99,7 +99,15 @@ NONE
< reflectOffs;
# Synctest
-hchan, root, timers, timer, notifyList, reflectOffs < synctest;
+hchan,
+ notifyList,
+ reflectOffs,
+ root,
+ strongFromWeakQueue,
+ sweepWaiters,
+ timer,
+ timers
+< synctest;
# User arena state
NONE < userArenaState;