]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.23] runtime: clear isSending bit earlier
authorIan Lance Taylor <iant@golang.org>
Wed, 2 Oct 2024 20:38:25 +0000 (13:38 -0700)
committerGopher Robot <gobot@golang.org>
Tue, 8 Oct 2024 22:28:41 +0000 (22:28 +0000)
I've done some more testing of the new isSending field.
I'm not able to get more than 2 bits set. That said,
with this change it's significantly less likely to have even
2 bits set. The idea here is to clear the bit before possibly
locking the channel we are sending the value on, thus avoiding
some delay and some serialization.

For #69312
For #69333

Change-Id: I8b5f167f162bbcbcbf7ea47305967f349b62b0f4
Reviewed-on: https://go-review.googlesource.com/c/go/+/617596
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Commit-Queue: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>

src/runtime/time.go

index b43cf9589bf90b3af54e85a33eb00ef459afd42e..7abd15ee86260890737652489d6cbea0ed579458 100644 (file)
@@ -1114,6 +1114,11 @@ func (t *timer) unlockAndRun(now int64) {
                // started to send the value. That lets them correctly return
                // true meaning that no value was sent.
                lock(&t.sendLock)
+
+               // We are committed to possibly sending a value based on seq,
+               // so no need to keep telling stop/modify that we are sending.
+               t.isSending.And(^isSendingClear)
+
                if t.seq != seq {
                        f = func(any, uintptr, int64) {}
                }
@@ -1122,9 +1127,6 @@ func (t *timer) unlockAndRun(now int64) {
        f(arg, seq, delay)
 
        if !async && t.isChan {
-               // We are no longer sending a value.
-               t.isSending.And(^isSendingClear)
-
                unlock(&t.sendLock)
        }