85bbb12141
timers.wakeTime, which is called concurrently by P's trying to decide how long they should sleep, can return inaccurate values while timers.adjust is running. (Before the refactoring, this was still true but the code did not have good names and was spread across more files, making the race harder to see.) The runtime thread sleeping code is complex enough that I am not confident that the inaccuracy can cause delayed timer wakeups, but I am also not confident that it can't, nor that it won't in the future. There are two parts to the fix: 1. A simple logic change in timers.adjust. 2. The introduction of t.maybeAdd to avoid having a t that is marked as belonging to a specific timers ts but not present in ts.heap. That was okay before when everything was racy but needs to be eliminated to make timers.adjust fully consistent. The cost of the change is an extra CAS-lock operation on a timer add (close to free since the CAS-lock was just unlocked) and a change in the static lock ranking to allow malloc while holding a timer lock. Change-Id: I1249e6e24ae9ef74a69837f453e15b513f0d75c0 Reviewed-on: https://go-review.googlesource.com/c/go/+/564977 Reviewed-by: Austin Clements <austin@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Russ Cox <rsc@golang.org> |
||
---|---|---|
.github | ||
api | ||
doc | ||
lib/time | ||
misc | ||
src | ||
test | ||
.gitattributes | ||
.gitignore | ||
codereview.cfg | ||
CONTRIBUTING.md | ||
go.env | ||
LICENSE | ||
PATENTS | ||
README.md | ||
SECURITY.md |
The Go Programming Language
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Gopher image by Renee French, licensed under Creative Commons 4.0 Attributions license.
Our canonical Git repository is located at https://go.googlesource.com/go. There is a mirror of the repository at https://github.com/golang/go.
Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file.
Download and Install
Binary Distributions
Official binary distributions are available at https://go.dev/dl/.
After downloading a binary release, visit https://go.dev/doc/install for installation instructions.
Install From Source
If a binary distribution is not available for your combination of operating system and architecture, visit https://go.dev/doc/install/source for source installation instructions.
Contributing
Go is the work of thousands of contributors. We appreciate your help!
To contribute, please read the contribution guidelines at https://go.dev/doc/contribute.
Note that the Go project uses the issue tracker for bug reports and proposals only. See https://go.dev/wiki/Questions for a list of places to ask questions about the Go language.