aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/lockrank_on.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/lockrank_on.go')
-rw-r--r--src/runtime/lockrank_on.go16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/runtime/lockrank_on.go b/src/runtime/lockrank_on.go
index e95190f0b2..120ebc21fa 100644
--- a/src/runtime/lockrank_on.go
+++ b/src/runtime/lockrank_on.go
@@ -104,12 +104,16 @@ func printHeldLocks(gp *g) {
}
}
-// acquireLockRank acquires a rank which is not associated with a mutex lock
+// acquireLockRankAndM acquires a rank which is not associated with a mutex
+// lock. To maintain the invariant that an M with m.locks==0 does not hold any
+// lock-like resources, it also acquires the M.
//
// This function may be called in nosplit context and thus must be nosplit.
//
//go:nosplit
-func acquireLockRank(rank lockRank) {
+func acquireLockRankAndM(rank lockRank) {
+ acquirem()
+
gp := getg()
// Log the new class. See comment on lockWithRank.
systemstack(func() {
@@ -189,12 +193,14 @@ func unlockWithRank(l *mutex) {
})
}
-// releaseLockRank releases a rank which is not associated with a mutex lock
+// releaseLockRankAndM releases a rank which is not associated with a mutex
+// lock. To maintain the invariant that an M with m.locks==0 does not hold any
+// lock-like resources, it also releases the M.
//
// This function may be called in nosplit context and thus must be nosplit.
//
//go:nosplit
-func releaseLockRank(rank lockRank) {
+func releaseLockRankAndM(rank lockRank) {
gp := getg()
systemstack(func() {
found := false
@@ -211,6 +217,8 @@ func releaseLockRank(rank lockRank) {
throw("lockRank release without matching lockRank acquire")
}
})
+
+ releasem(getg().m)
}
// nosplit because it may be called from nosplit contexts.