sync: new Cond implementation

Change Cond implementation to use a notification list such that waiters
can first register for a notification, release the lock, then actually
wait. Signalers never have to park anymore.

This is intended to address an issue in the previous implementation
where Broadcast could fail to signal all waiters.

Results of the existing benchmark are below.

                                          Original          New  Diff
BenchmarkCond1-48        2000000               745 ns/op    755 +1.3%
BenchmarkCond2-48        1000000              1545 ns/op   1532 -0.8%
BenchmarkCond4-48         300000              3833 ns/op   3896 +1.6%
BenchmarkCond8-48         200000             10049 ns/op  10257 +2.1%
BenchmarkCond16-48        100000             21123 ns/op  21236 +0.5%
BenchmarkCond32-48         30000             40393 ns/op  41097 +1.7%

Fixes #14064

Change-Id: I083466d61593a791a034df61f5305adfb8f1c7f9
Reviewed-on: https://go-review.googlesource.com/18892
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Caleb Spare <cespare@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Wedson Almeida Filho 2016-01-24 19:23:48 +01:00 committed by Austin Clements
parent 87151c82b6
commit 8e7072ca83
6 changed files with 242 additions and 145 deletions

View file

@ -211,7 +211,8 @@ type gobuf struct {
}
// Known to compiler.
// Changes here must also be made in src/cmd/internal/gc/select.go's selecttype.
// Changes here must also be made in src/cmd/compile/internal/gc/select.go's
// selecttype.
type sudog struct {
g *g
selectdone *uint32
@ -219,7 +220,7 @@ type sudog struct {
prev *sudog
elem unsafe.Pointer // data element
releasetime int64
nrelease int32 // -1 for acquire
ticket uint32
waitlink *sudog // g.waiting list
}