Skip to content

Commit

Permalink
runtime: replace sched.mcount int32 with sched.mnext int64
Browse files Browse the repository at this point in the history
Currently, since Ms never exit, the number of Ms, the number of Ms
ever created, and the ID of the next M are all the same and must be
small. That's about to change, so rename sched.mcount to sched.mnext
to make it clear it's the number of Ms ever created (and the ID of the
next M), change its type to int64, and use mcount() for the number of
Ms. In the next commit, mcount() will become slightly less trivial.

For #20395.

Change-Id: I9af34d36bd72416b5656555d16e8085076f1b196
Reviewed-on: https://go-review.googlesource.com/68750
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
  • Loading branch information
aclements committed Oct 11, 2017
1 parent d7ac5ce commit 6c7bea6
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 14 deletions.
25 changes: 14 additions & 11 deletions src/runtime/proc.go
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ func dumpgstatus(gp *g) {

func checkmcount() {
// sched lock is held
if sched.mcount > sched.maxmcount {
if mcount() > sched.maxmcount {
print("runtime: program exceeds ", sched.maxmcount, "-thread limit\n")
throw("thread exhaustion")
}
Expand All @@ -533,8 +533,11 @@ func mcommoninit(mp *m) {
}

lock(&sched.lock)
mp.id = sched.mcount
sched.mcount++
if sched.mnext+1 < sched.mnext {
throw("runtime: thread ID overflow")
}
mp.id = sched.mnext
sched.mnext++
checkmcount()

mp.fastrand[0] = 1597334677 * uint32(mp.id)
Expand Down Expand Up @@ -3374,7 +3377,7 @@ func gcount() int32 {
}

func mcount() int32 {
return sched.mcount
return int32(sched.mnext)
}

var prof struct {
Expand Down Expand Up @@ -3854,7 +3857,7 @@ func acquirep1(_p_ *p) {
throw("acquirep: already in go")
}
if _p_.m != 0 || _p_.status != _Pidle {
id := int32(0)
id := int64(0)
if _p_.m != 0 {
id = _p_.m.ptr().id
}
Expand Down Expand Up @@ -3915,12 +3918,12 @@ func checkdead() {
return
}

run := sched.mcount - sched.nmidle - sched.nmidlelocked - sched.nmsys
run := mcount() - sched.nmidle - sched.nmidlelocked - sched.nmsys
if run > 0 {
return
}
if run < 0 {
print("runtime: checkdead: nmidle=", sched.nmidle, " nmidlelocked=", sched.nmidlelocked, " mcount=", sched.mcount, " nmsys=", sched.nmsys, "\n")
print("runtime: checkdead: nmidle=", sched.nmidle, " nmidlelocked=", sched.nmidlelocked, " mcount=", mcount(), " nmsys=", sched.nmsys, "\n")
throw("checkdead: inconsistent counts")
}

Expand Down Expand Up @@ -4234,7 +4237,7 @@ func schedtrace(detailed bool) {
}

lock(&sched.lock)
print("SCHED ", (now-starttime)/1e6, "ms: gomaxprocs=", gomaxprocs, " idleprocs=", sched.npidle, " threads=", sched.mcount, " spinningthreads=", sched.nmspinning, " idlethreads=", sched.nmidle, " runqueue=", sched.runqsize)
print("SCHED ", (now-starttime)/1e6, "ms: gomaxprocs=", gomaxprocs, " idleprocs=", sched.npidle, " threads=", mcount(), " spinningthreads=", sched.nmspinning, " idlethreads=", sched.nmidle, " runqueue=", sched.runqsize)
if detailed {
print(" gcwaiting=", sched.gcwaiting, " nmidlelocked=", sched.nmidlelocked, " stopwait=", sched.stopwait, " sysmonwait=", sched.sysmonwait, "\n")
}
Expand All @@ -4246,7 +4249,7 @@ func schedtrace(detailed bool) {
h := atomic.Load(&_p_.runqhead)
t := atomic.Load(&_p_.runqtail)
if detailed {
id := int32(-1)
id := int64(-1)
if mp != nil {
id = mp.id
}
Expand Down Expand Up @@ -4294,11 +4297,11 @@ func schedtrace(detailed bool) {
gp := allgs[gi]
mp := gp.m
lockedm := gp.lockedm.ptr()
id1 := int32(-1)
id1 := int64(-1)
if mp != nil {
id1 = mp.id
}
id2 := int32(-1)
id2 := int64(-1)
if lockedm != nil {
id2 = lockedm.id
}
Expand Down
4 changes: 2 additions & 2 deletions src/runtime/runtime2.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ type m struct {
caughtsig guintptr // goroutine running during fatal signal
p puintptr // attached p for executing go code (nil if not executing go code)
nextp puintptr
id int32
id int64
mallocing int32
throwing int32
preemptoff string // if != "", keep curg running on this m
Expand Down Expand Up @@ -531,7 +531,7 @@ type schedt struct {
midle muintptr // idle m's waiting for work
nmidle int32 // number of idle m's waiting for work
nmidlelocked int32 // number of locked m's waiting for work
mcount int32 // number of m's that have been created
mnext int64 // number of m's that have been created and next M ID
maxmcount int32 // maximum number of m's allowed (or die)
nmsys int32 // number of system m's not counted for deadlock

Expand Down
2 changes: 1 addition & 1 deletion src/runtime/signal_sighandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {

if docrash {
crashing++
if crashing < sched.mcount-int32(extraMCount) {
if crashing < mcount()-int32(extraMCount) {
// There are other m's that need to dump their stacks.
// Relay SIGQUIT to the next m by sending it to the current process.
// All m's that have already received SIGQUIT have signal masks blocking
Expand Down

0 comments on commit 6c7bea6

Please sign in to comment.