]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: remove scase.releasetime field
authorMatthew Dempsky <mdempsky@google.com>
Mon, 27 Jul 2020 21:05:05 +0000 (14:05 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 18 Aug 2020 20:05:41 +0000 (20:05 +0000)
selectgo will report at most one block event, so there's no need to
keep a releasetime for every select case. It suffices to simply track
the releasetime of the case responsible for the wakeup.

Updates #40410.

Change-Id: I72679cd43dde80d7e6dbab21a78952a4372d1e79
Reviewed-on: https://go-review.googlesource.com/c/go/+/245122
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/select.go
src/runtime/select.go

index 49cc23cd3de236b6edc60e867e7cb7004ba2400f..eb5ff8469bac13f292a9b8cbc43c044ab4b3b1bb 100644 (file)
@@ -386,7 +386,6 @@ func scasetype() *types.Type {
                        namedfield("elem", types.Types[TUNSAFEPTR]),
                        namedfield("kind", types.Types[TUINT16]),
                        namedfield("pc", types.Types[TUINTPTR]),
-                       namedfield("releasetime", types.Types[TINT64]),
                })
                scase.SetNoalg(true)
        }
index 081db7bad4e667a7054aa8c9fc7c2ecb0f47f6ad..2f8b139155f1119c582ccea8d565f8288049c12f 100644 (file)
@@ -26,11 +26,10 @@ const (
 // Known to compiler.
 // Changes here must also be made in src/cmd/internal/gc/select.go's scasetype.
 type scase struct {
-       c           *hchan         // chan
-       elem        unsafe.Pointer // data element
-       kind        uint16
-       pc          uintptr // race pc (for race detector / msan)
-       releasetime int64
+       c    *hchan         // chan
+       elem unsafe.Pointer // data element
+       kind uint16
+       pc   uintptr // race pc (for race detector / msan)
 }
 
 var (
@@ -142,9 +141,6 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) {
        var t0 int64
        if blockprofilerate > 0 {
                t0 = cputicks()
-               for i := 0; i < ncases; i++ {
-                       scases[i].releasetime = -1
-               }
        }
 
        // The compiler rewrites selects that statically have
@@ -227,6 +223,7 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) {
        var casi int
        var cas *scase
        var caseSuccess bool
+       var caseReleaseTime int64 = -1
        var recvOK bool
        for i := 0; i < ncases; i++ {
                casi = int(pollorder[i])
@@ -346,14 +343,14 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) {
                if k.kind == caseNil {
                        continue
                }
-               if sglist.releasetime > 0 {
-                       k.releasetime = sglist.releasetime
-               }
                if sg == sglist {
                        // sg has already been dequeued by the G that woke us up.
                        casi = int(casei)
                        cas = k
                        caseSuccess = sglist.success
+                       if sglist.releasetime > 0 {
+                               caseReleaseTime = sglist.releasetime
+                       }
                } else {
                        c = k.c
                        if k.kind == caseSend {
@@ -483,8 +480,8 @@ send:
        goto retc
 
 retc:
-       if cas.releasetime > 0 {
-               blockevent(cas.releasetime-t0, 1)
+       if caseReleaseTime > 0 {
+               blockevent(caseReleaseTime-t0, 1)
        }
        return casi, recvOK