Skip to content

Commit

Permalink
[release-branch.go1.23] runtime: clear isSending bit earlier
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Michael Knyszek <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
Commit-Queue: Ian Lance Taylor <[email protected]>
Auto-Submit: Ian Lance Taylor <[email protected]>
  • Loading branch information
ianlancetaylor authored and gopherbot committed Oct 8, 2024
1 parent 9563300 commit cc16cdf
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/runtime/time.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
}
Expand All @@ -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)
}

Expand Down

0 comments on commit cc16cdf

Please sign in to comment.