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>
// 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) {}
}
f(arg, seq, delay)
if !async && t.isChan {
- // We are no longer sending a value.
- t.isSending.And(^isSendingClear)
-
unlock(&t.sendLock)
}