1
0
mirror of https://github.com/golang/go synced 2024-11-15 00:30:31 -07:00
go/src/time
Michael Anthony Knyszek 6a49f81edc runtime,time: use atomic.Int32 for isSending
This change switches isSending to be an atomic.Int32 instead of an
atomic.Uint8. The Int32 version is managed as a counter, which is
something that we couldn't do with Uint8 without adding a new intrinsic
which may not be available on all architectures.

That is, instead of only being able to support 8 concurrent timer
firings on the same timer because we only have 8 independent bits to set
for each concurrent timer firing, we can now have 2^31-1 concurrent
timer firings before running into any issues. Like the fact that each
bit-set was matched with a clear, here we match increments with
decrements to indicate that we're in the "sending on a channel" critical
section in the timer code, so we can report the correct result back on
Stop or Reset.

We choose an Int32 instead of a Uint32 because it's easier to check for
obviously bad values (negative values are always bad) and 2^31-1
concurrent timer firings should be enough for anyone.

Previously, we avoided anything bigger than a Uint8 because we could
pack it into some padding in the runtime.timer struct. But it turns out
that the type that actually matters, runtime.timeTimer, is exactly 96
bytes in size. This means its in the next size class up in the 112 byte
size class because of an allocation header. We thus have some free space
to work with. This change increases the size of this struct from 96
bytes to 104 bytes.

(I'm not sure if runtime.timer is often allocated directly, but if it
is, we get lucky in the same way too. It's exactly 80 bytes in size,
which means its in the 96-byte size class, leaving us with some space to
work with.)

Fixes #69969.
Related to #69880 and #69312.

Change-Id: I9fd59cb6a69365c62971d1f225490a65c58f3e77
Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest
Reviewed-on: https://go-review.googlesource.com/c/go/+/621616
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
2024-10-21 21:48:17 +00:00
..
testdata
tzdata
abs_test.go time: optimize time <-> date conversions 2024-07-31 21:29:46 +00:00
embed.go
example_test.go
export_android_test.go
export_test.go
export_windows_test.go
format_rfc3339.go time: optimize time <-> date conversions 2024-07-31 21:29:46 +00:00
format_test.go
format.go time: don't check non-nil err twice in parse 2024-09-10 21:43:25 +00:00
genzabbrs.go
internal_test.go
linkname_test.go time: optimize time <-> date conversions 2024-07-31 21:29:46 +00:00
mono_test.go
sleep_test.go runtime,time: use atomic.Int32 for isSending 2024-10-21 21:48:17 +00:00
sleep.go timer: fix Stop link in Timer.Reset doc comment 2024-10-14 21:03:43 +00:00
sys_plan9.go
sys_unix.go
sys_windows.go
tick_test.go
tick.go
time_test.go time: correct time.AppendText's error message 2024-10-17 03:01:53 +00:00
time.go time: correct time.AppendText's error message 2024-10-17 03:01:53 +00:00
tzdata_test.go
zoneinfo_abbrs_windows.go
zoneinfo_android_test.go
zoneinfo_android.go
zoneinfo_goroot.go
zoneinfo_ios.go
zoneinfo_js.go
zoneinfo_plan9.go
zoneinfo_read.go
zoneinfo_test.go
zoneinfo_unix_test.go
zoneinfo_unix.go
zoneinfo_wasip1.go
zoneinfo_windows_test.go
zoneinfo_windows.go all: remove unnecessary symbols and add missing symbols 2024-09-09 16:44:45 +00:00
zoneinfo.go time: optimize time <-> date conversions 2024-07-31 21:29:46 +00:00