]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: separate stack freeing from stack shrinking
authorAustin Clements <austin@google.com>
Wed, 3 Apr 2019 18:47:55 +0000 (14:47 -0400)
committerAustin Clements <austin@google.com>
Fri, 5 Apr 2019 20:19:59 +0000 (20:19 +0000)
Currently, shrinkstack will free the stack if the goroutine is dead.
There are only two places that call shrinkstack: scanstack, which will
never call it if the goroutine is dead; and markrootFreeGStacks, which
only calls it on dead goroutines.

Clean this up by separating stack freeing out of shrinkstack.

Change-Id: I7d7891e620550c32a2220833923a025704986681
Reviewed-on: https://go-review.googlesource.com/c/go/+/170890
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/mgcmark.go
src/runtime/stack.go

index cc4e7d06d30e7ecc36af1a8dd61784fd0c30d2b2..91f79c44db9bedea412a6265214c03cd5311063a 100644 (file)
@@ -270,7 +270,9 @@ func markrootFreeGStacks() {
        // Free stacks.
        q := gQueue{list.head, list.head}
        for gp := list.head.ptr(); gp != nil; gp = gp.schedlink.ptr() {
-               shrinkstack(gp)
+               stackfree(gp.stack)
+               gp.stack.lo = 0
+               gp.stack.hi = 0
                // Manipulate the queue directly since the Gs are
                // already all linked the right way.
                q.tail.set(gp)
index 85902a6b68eea8ac85b90e3efba651e27bbd474f..d5d09ba7d7bef9757b530d3bdba2b1053f015cfa 100644 (file)
@@ -1077,16 +1077,6 @@ func gostartcallfn(gobuf *gobuf, fv *funcval) {
 // gp must be stopped, but the world need not be.
 func shrinkstack(gp *g) {
        gstatus := readgstatus(gp)
-       if gstatus&^_Gscan == _Gdead {
-               if gp.stack.lo != 0 {
-                       // Free whole stack - it will get reallocated
-                       // if G is used again.
-                       stackfree(gp.stack)
-                       gp.stack.lo = 0
-                       gp.stack.hi = 0
-               }
-               return
-       }
        if gp.stack.lo == 0 {
                throw("missing stack in shrinkstack")
        }