aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2019-04-03 14:47:55 -0400
committerAustin Clements <austin@google.com>2019-04-05 20:19:59 +0000
commit68d89bb8e05afc2aa050b4c5ad0df4b3af03c45d (patch)
tree60f595a8e96eb449910f083c6a5e2aa67dcd4dce /src/runtime
parentea9859f858b603cbf49f0a930f83c56a716490a4 (diff)
downloadgo-68d89bb8e05afc2aa050b4c5ad0df4b3af03c45d.tar.xz
runtime: separate stack freeing from stack shrinking
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>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/mgcmark.go4
-rw-r--r--src/runtime/stack.go10
2 files changed, 3 insertions, 11 deletions
diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go
index cc4e7d06d3..91f79c44db 100644
--- a/src/runtime/mgcmark.go
+++ b/src/runtime/mgcmark.go
@@ -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)
diff --git a/src/runtime/stack.go b/src/runtime/stack.go
index 85902a6b68..d5d09ba7d7 100644
--- a/src/runtime/stack.go
+++ b/src/runtime/stack.go
@@ -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")
}