diff options
| author | Austin Clements <austin@google.com> | 2017-10-05 21:28:01 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2017-10-11 17:47:16 +0000 |
| commit | 6c7bea63096e471f5bc6d256f8beeb303e592c57 (patch) | |
| tree | 622b24d50e9a14b96dbf3bac70116a15ba96d493 /src/runtime/proc.go | |
| parent | d7ac5ce8a3d0cc0a77e4ea5dc7ef1aa4b39db2f5 (diff) | |
| download | go-6c7bea63096e471f5bc6d256f8beeb303e592c57.tar.xz | |
runtime: replace sched.mcount int32 with sched.mnext int64
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>
Diffstat (limited to 'src/runtime/proc.go')
| -rw-r--r-- | src/runtime/proc.go | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 0fa0cf965e..1ad95ae9a6 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -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") } @@ -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) @@ -3374,7 +3377,7 @@ func gcount() int32 { } func mcount() int32 { - return sched.mcount + return int32(sched.mnext) } var prof struct { @@ -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 } @@ -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") } @@ -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") } @@ -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 } @@ -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 } |
