mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: convert g.waitreason from string to uint8
Every time I poke at #14921, the g.waitreason string pointer writes show up. They're not particularly important performance-wise, but it'd be nice to clear the noise away. And it does open up a few extra bytes in the g struct for some future use. Change-Id: I7ffbd52fbc2a286931a2218038fda52ed6473cc9 Reviewed-on: https://go-review.googlesource.com/99078 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
025134b0d1
commit
4eea887fd4
15 changed files with 114 additions and 47 deletions
|
|
@ -358,20 +358,20 @@ type g struct {
|
|||
atomicstatus uint32
|
||||
stackLock uint32 // sigprof/scang lock; TODO: fold in to atomicstatus
|
||||
goid int64
|
||||
waitsince int64 // approx time when the g become blocked
|
||||
waitreason string // if status==Gwaiting
|
||||
schedlink guintptr
|
||||
preempt bool // preemption signal, duplicates stackguard0 = stackpreempt
|
||||
paniconfault bool // panic (instead of crash) on unexpected fault address
|
||||
preemptscan bool // preempted g does scan for gc
|
||||
gcscandone bool // g has scanned stack; protected by _Gscan bit in status
|
||||
gcscanvalid bool // false at start of gc cycle, true if G has not run since last scan; TODO: remove?
|
||||
throwsplit bool // must not split stack
|
||||
raceignore int8 // ignore race detection events
|
||||
sysblocktraced bool // StartTrace has emitted EvGoInSyscall about this goroutine
|
||||
sysexitticks int64 // cputicks when syscall has returned (for tracing)
|
||||
traceseq uint64 // trace event sequencer
|
||||
tracelastp puintptr // last P emitted an event for this goroutine
|
||||
waitsince int64 // approx time when the g become blocked
|
||||
waitreason waitReason // if status==Gwaiting
|
||||
preempt bool // preemption signal, duplicates stackguard0 = stackpreempt
|
||||
paniconfault bool // panic (instead of crash) on unexpected fault address
|
||||
preemptscan bool // preempted g does scan for gc
|
||||
gcscandone bool // g has scanned stack; protected by _Gscan bit in status
|
||||
gcscanvalid bool // false at start of gc cycle, true if G has not run since last scan; TODO: remove?
|
||||
throwsplit bool // must not split stack
|
||||
raceignore int8 // ignore race detection events
|
||||
sysblocktraced bool // StartTrace has emitted EvGoInSyscall about this goroutine
|
||||
sysexitticks int64 // cputicks when syscall has returned (for tracing)
|
||||
traceseq uint64 // trace event sequencer
|
||||
tracelastp puintptr // last P emitted an event for this goroutine
|
||||
lockedm muintptr
|
||||
sig uint32
|
||||
writebuf []byte
|
||||
|
|
@ -752,6 +752,69 @@ const (
|
|||
// The maximum number of frames we print for a traceback
|
||||
const _TracebackMaxFrames = 100
|
||||
|
||||
// A waitReason explains why a goroutine has been stopped.
|
||||
// See gopark. Do not re-use waitReasons, add new ones.
|
||||
type waitReason uint8
|
||||
|
||||
const (
|
||||
waitReasonZero waitReason = iota // ""
|
||||
waitReasonGCAssistMarking // "GC assist marking"
|
||||
waitReasonIOWait // "IO wait"
|
||||
waitReasonChanReceiveNilChan // "chan receive (nil chan)"
|
||||
waitReasonChanSendNilChan // "chan send (nil chan)"
|
||||
waitReasonDumpingHeap // "dumping heap"
|
||||
waitReasonGarbageCollection // "garbage collection"
|
||||
waitReasonGarbageCollectionScan // "garbage collection scan"
|
||||
waitReasonPanicWait // "panicwait"
|
||||
waitReasonSelect // "select"
|
||||
waitReasonSelectNoCases // "select (no cases)"
|
||||
waitReasonGCAssistWait // "GC assist wait"
|
||||
waitReasonGCSweepWait // "GC sweep wait"
|
||||
waitReasonChanReceive // "chan receive"
|
||||
waitReasonChanSend // "chan send"
|
||||
waitReasonFinalizerWait // "finalizer wait"
|
||||
waitReasonForceGGIdle // "force gc (idle)"
|
||||
waitReasonSemacquire // "semacquire"
|
||||
waitReasonSleep // "sleep"
|
||||
waitReasonTimerGoroutineIdle // "timer goroutine (idle)"
|
||||
waitReasonTraceReaderBlocked // "trace reader (blocked)"
|
||||
waitReasonWaitForGCCycle // "wait for GC cycle"
|
||||
waitReasonGCWorkerIdle // "GC worker (idle)"
|
||||
)
|
||||
|
||||
var waitReasonStrings = [...]string{
|
||||
waitReasonZero: "",
|
||||
waitReasonGCAssistMarking: "GC assist marking",
|
||||
waitReasonIOWait: "IO wait",
|
||||
waitReasonChanReceiveNilChan: "chan receive (nil chan)",
|
||||
waitReasonChanSendNilChan: "chan send (nil chan)",
|
||||
waitReasonDumpingHeap: "dumping heap",
|
||||
waitReasonGarbageCollection: "garbage collection",
|
||||
waitReasonGarbageCollectionScan: "garbage collection scan",
|
||||
waitReasonPanicWait: "panicwait",
|
||||
waitReasonSelect: "select",
|
||||
waitReasonSelectNoCases: "select (no cases)",
|
||||
waitReasonGCAssistWait: "GC assist wait",
|
||||
waitReasonGCSweepWait: "GC sweep wait",
|
||||
waitReasonChanReceive: "chan receive",
|
||||
waitReasonChanSend: "chan send",
|
||||
waitReasonFinalizerWait: "finalizer wait",
|
||||
waitReasonForceGGIdle: "force gc (idle)",
|
||||
waitReasonSemacquire: "semacquire",
|
||||
waitReasonSleep: "sleep",
|
||||
waitReasonTimerGoroutineIdle: "timer goroutine (idle)",
|
||||
waitReasonTraceReaderBlocked: "trace reader (blocked)",
|
||||
waitReasonWaitForGCCycle: "wait for GC cycle",
|
||||
waitReasonGCWorkerIdle: "GC worker (idle)",
|
||||
}
|
||||
|
||||
func (w waitReason) String() string {
|
||||
if w < 0 || w >= waitReason(len(waitReasonStrings)) {
|
||||
return "unknown wait reason"
|
||||
}
|
||||
return waitReasonStrings[w]
|
||||
}
|
||||
|
||||
var (
|
||||
allglen uintptr
|
||||
allm *m
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue