lockRankPollDesc
lockRankSched
lockRankDeadlock
- lockRankPanic
lockRankAllg
lockRankAllp
// rank, we don't allow any further locks to be acquired other than more
// hchan locks.
lockRankHchanLeaf
+ lockRankPanic
// Leaf locks with no dependencies, so these constants are not actually used anywhere.
// There are other architecture-dependent leaf locks as well.
lockRankPollDesc: "pollDesc",
lockRankSched: "sched",
lockRankDeadlock: "deadlock",
- lockRankPanic: "panic",
lockRankAllg: "allg",
lockRankAllp: "allp",
lockRankGFree: "gFree",
lockRankHchanLeaf: "hchanLeaf",
+ lockRankPanic: "panic",
lockRankNewmHandoff: "newmHandoff.lock",
lockRankDebugPtrmask: "debugPtrmask.lock",
lockRankPollDesc: {},
lockRankSched: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankPollDesc},
lockRankDeadlock: {lockRankDeadlock},
- lockRankPanic: {lockRankDeadlock},
- lockRankAllg: {lockRankSysmon, lockRankSched, lockRankPanic},
+ lockRankAllg: {lockRankSysmon, lockRankSched},
lockRankAllp: {lockRankSysmon, lockRankSched},
lockRankTimers: {lockRankSysmon, lockRankScavenge, lockRankSched, lockRankAllp, lockRankPollDesc, lockRankTimers},
lockRankItab: {},
lockRankGFree: {lockRankSched},
lockRankHchanLeaf: {lockRankGscan, lockRankHchanLeaf},
+ lockRankPanic: {lockRankDeadlock}, // plus any other lock held on throw.
lockRankNewmHandoff: {},
lockRankDebugPtrmask: {},
// rank recording for it, since print/println are used when
// printing out a lock ordering problem below.
//
- // paniclk has an ordering problem, since it can be acquired
- // during a panic with any other locks held (especially if the
- // panic is because of a directed segv), and yet also allg is
- // acquired after paniclk in tracebackothers()). This is a genuine
- // problem, so for now we don't do lock rank recording for paniclk
- // either.
+ // paniclk is only used for fatal throw/panic. Don't do lock
+ // ranking recording for it, since we throw after reporting a
+ // lock ordering problem. Additionally, paniclk may be taken
+ // after effectively any lock (anywhere we might panic), which
+ // the partial order doesn't cover.
lock2(l)
return
}