]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: replace sched.mcount int32 with sched.mnext int64
authorAustin Clements <austin@google.com>
Fri, 6 Oct 2017 01:28:01 +0000 (21:28 -0400)
committerAustin Clements <austin@google.com>
Wed, 11 Oct 2017 17:47:16 +0000 (17:47 +0000)
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>
src/runtime/proc.go
src/runtime/runtime2.go
src/runtime/signal_sighandler.go

index 0fa0cf965e6d21552a9aed3912f2aaf9fea1291f..1ad95ae9a6eb025d9888bb1b35c2f8bad5368b7b 100644 (file)
@@ -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
                }
index 3f99de65d563c11fbfa3af56f94c8a78e2831535..e652f5be64987d83b128cfc73097a217003fd164 100644 (file)
@@ -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
@@ -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
 
index 672d7828ff677f76750d9b161f84366dc317e0ed..f24a117fcdf566acd5d3d9f03fa96ca77cb75666 100644 (file)
@@ -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