From cc16cdf48f228caebc55c982ed5b1b187ff39fcc Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 2 Oct 2024 13:38:25 -0700 Subject: [PATCH] [release-branch.go1.23] runtime: clear isSending bit earlier 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 Reviewed-by: Michael Knyszek Reviewed-by: Ian Lance Taylor Commit-Queue: Ian Lance Taylor Auto-Submit: Ian Lance Taylor --- src/runtime/time.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/runtime/time.go b/src/runtime/time.go index b43cf9589b..7abd15ee86 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -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) } -- 2.48.1