mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[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:
parent
46beeed0ac
commit
3298c749ac
4 changed files with 13 additions and 30 deletions
|
|
@ -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) {
|
||||
// Test that runq is not spuriously reported as empty.
|
||||
// Runq emptiness affects scheduling decisions and spurious emptiness
|
||||
// can lead to underutilization (both runnable Gs and idle Ps coexist
|
||||
// for arbitrary long time).
|
||||
done := make(chan bool, 1)
|
||||
RunSchedLocalQueueEmptyState.done = done
|
||||
p := new(p)
|
||||
RunSchedLocalQueueEmptyState.p = p
|
||||
gs := make([]g, 2)
|
||||
ready := new(uint32)
|
||||
RunSchedLocalQueueEmptyState.ready = ready
|
||||
for i := 0; i < iters; i++ {
|
||||
*ready = 0
|
||||
next0 := (i & 1) == 0
|
||||
next1 := (i & 2) == 0
|
||||
runqput(p, &gs[0], next0)
|
||||
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) {
|
||||
//println("next:", next0, next1)
|
||||
if runqempty(p) {
|
||||
println("next:", next0, next1)
|
||||
throw("queue is empty")
|
||||
}
|
||||
RunSchedLocalQueueEmptyState.done <- true
|
||||
done <- true
|
||||
}()
|
||||
for atomic.Xadd(ready, 1); atomic.Load(ready) != 2; {
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue