diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2019-04-03 12:18:38 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2019-04-04 07:19:14 -0700 |
| commit | cb57484dcaeb4881c73f8a1174d4d5661ca2bbe2 (patch) | |
| tree | e4544a0b7059c5bfd2ec95a2bd8a51b917c76e1e /src/test/incremental/thinlto | |
| parent | f8673e0ad85e98997faa76fa7edc99c5825f46ee (diff) | |
| download | rust-cb57484dcaeb4881c73f8a1174d4d5661ca2bbe2.tar.gz rust-cb57484dcaeb4881c73f8a1174d4d5661ca2bbe2.zip | |
std: Avoid usage of `Once` in `Instant`
This commit removes usage of `Once` from the internal implementation of time utilities on OSX and Windows. It turns out that we accidentally hit a deadlock today (#59020) via events that look like: * A thread invokes `park_timeout` * Internally, only on OSX, `park_timeout` calls `Instant::elapsed` * Inside of `Instant::elapsed` on OSX we enter a `Once` to initialize global timer data * Inside of `Once`, it attempts to `park` This means on the same stack frame, when there's contention, we're calling `park` from inside `park_timeout`, causing a deadlock! The solution implemented in this commit was to remove usage of `Once` and instead just do a small dance with atomics. There's no real need we need to guarantee that the global information is only learned once, only that it's only *stored* once. This implementation may have multiple threads invoke `mach_timebase_info`, but only one will store the global information which will amortize the cost for all other threads. A similar fix has been applied to windows to be uniform across our implementations, but looking at the code on Windows no deadlock was possible. This is purely just a consistency update for Windows and in theory a slightly leaner implementation. Closes #59020
Diffstat (limited to 'src/test/incremental/thinlto')
0 files changed, 0 insertions, 0 deletions
