[dev.typeparams] runtime: undo go'd closure argument workaround

In CL 298669 we added defer/go wrapping, and, as it is not
allowed for closures to escape when compiling runtime, we worked
around it by rewriting go'd closures to argumentless
non-capturing closures, so it is not a real closure and so not
needed to escape.

Previous CL removes the restriction. Now we can undo the
workaround.

Updates #40724.

Change-Id: Ic7bf129da4aee7b7fdb7157414eca943a6a27264
Reviewed-on: https://go-review.googlesource.com/c/go/+/325110
Trust: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
Cherry Mui 2021-06-03 18:29:05 -04:00
parent 46beeed0ac
commit 3298c749ac
4 changed files with 13 additions and 30 deletions

View file

@ -145,40 +145,28 @@ func RunSchedLocalQueueStealTest() {
} }
} }
// Temporary to enable register ABI bringup.
// TODO(register args): convert back to local variables in RunSchedLocalQueueEmptyTest that
// get passed to the "go" stmts there.
var RunSchedLocalQueueEmptyState struct {
done chan bool
ready *uint32
p *p
}
func RunSchedLocalQueueEmptyTest(iters int) { func RunSchedLocalQueueEmptyTest(iters int) {
// Test that runq is not spuriously reported as empty. // Test that runq is not spuriously reported as empty.
// Runq emptiness affects scheduling decisions and spurious emptiness // Runq emptiness affects scheduling decisions and spurious emptiness
// can lead to underutilization (both runnable Gs and idle Ps coexist // can lead to underutilization (both runnable Gs and idle Ps coexist
// for arbitrary long time). // for arbitrary long time).
done := make(chan bool, 1) done := make(chan bool, 1)
RunSchedLocalQueueEmptyState.done = done
p := new(p) p := new(p)
RunSchedLocalQueueEmptyState.p = p
gs := make([]g, 2) gs := make([]g, 2)
ready := new(uint32) ready := new(uint32)
RunSchedLocalQueueEmptyState.ready = ready
for i := 0; i < iters; i++ { for i := 0; i < iters; i++ {
*ready = 0 *ready = 0
next0 := (i & 1) == 0 next0 := (i & 1) == 0
next1 := (i & 2) == 0 next1 := (i & 2) == 0
runqput(p, &gs[0], next0) runqput(p, &gs[0], next0)
go func() { go func() {
for atomic.Xadd(RunSchedLocalQueueEmptyState.ready, 1); atomic.Load(RunSchedLocalQueueEmptyState.ready) != 2; { for atomic.Xadd(ready, 1); atomic.Load(ready) != 2; {
} }
if runqempty(RunSchedLocalQueueEmptyState.p) { if runqempty(p) {
//println("next:", next0, next1) println("next:", next0, next1)
throw("queue is empty") throw("queue is empty")
} }
RunSchedLocalQueueEmptyState.done <- true done <- true
}() }()
for atomic.Xadd(ready, 1); atomic.Load(ready) != 2; { for atomic.Xadd(ready, 1); atomic.Load(ready) != 2; {
} }

View file

@ -167,22 +167,17 @@ func gcinit() {
lockInit(&work.wbufSpans.lock, lockRankWbufSpans) lockInit(&work.wbufSpans.lock, lockRankWbufSpans)
} }
// Temporary in order to enable register ABI work.
// TODO(register args): convert back to local chan in gcenabled, passed to "go" stmts.
var gcenable_setup chan int
// gcenable is called after the bulk of the runtime initialization, // gcenable is called after the bulk of the runtime initialization,
// just before we're about to start letting user code run. // just before we're about to start letting user code run.
// It kicks off the background sweeper goroutine, the background // It kicks off the background sweeper goroutine, the background
// scavenger goroutine, and enables GC. // scavenger goroutine, and enables GC.
func gcenable() { func gcenable() {
// Kick off sweeping and scavenging. // Kick off sweeping and scavenging.
gcenable_setup = make(chan int, 2) c := make(chan int, 2)
go bgsweep() go bgsweep(c)
go bgscavenge() go bgscavenge(c)
<-gcenable_setup <-c
<-gcenable_setup <-c
gcenable_setup = nil
memstats.enablegc = true // now that runtime is initialized, GC is okay memstats.enablegc = true // now that runtime is initialized, GC is okay
} }

View file

@ -249,7 +249,7 @@ func scavengeSleep(ns int64) int64 {
// The background scavenger maintains the RSS of the application below // The background scavenger maintains the RSS of the application below
// the line described by the proportional scavenging statistics in // the line described by the proportional scavenging statistics in
// the mheap struct. // the mheap struct.
func bgscavenge() { func bgscavenge(c chan int) {
scavenge.g = getg() scavenge.g = getg()
lockInit(&scavenge.lock, lockRankScavenge) lockInit(&scavenge.lock, lockRankScavenge)
@ -261,7 +261,7 @@ func bgscavenge() {
wakeScavenger() wakeScavenger()
} }
gcenable_setup <- 1 c <- 1
goparkunlock(&scavenge.lock, waitReasonGCScavengeWait, traceEvGoBlock, 1) goparkunlock(&scavenge.lock, waitReasonGCScavengeWait, traceEvGoBlock, 1)
// Exponentially-weighted moving average of the fraction of time this // Exponentially-weighted moving average of the fraction of time this

View file

@ -153,13 +153,13 @@ func finishsweep_m() {
nextMarkBitArenaEpoch() nextMarkBitArenaEpoch()
} }
func bgsweep() { func bgsweep(c chan int) {
sweep.g = getg() sweep.g = getg()
lockInit(&sweep.lock, lockRankSweep) lockInit(&sweep.lock, lockRankSweep)
lock(&sweep.lock) lock(&sweep.lock)
sweep.parked = true sweep.parked = true
gcenable_setup <- 1 c <- 1
goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceEvGoBlock, 1) goparkunlock(&sweep.lock, waitReasonGCSweepWait, traceEvGoBlock, 1)
for { for {