diff options
Diffstat (limited to 'src/libstd/thread')
| -rw-r--r-- | src/libstd/thread/mod.rs | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs index 1b976b79b4c..d4ee172c961 100644 --- a/src/libstd/thread/mod.rs +++ b/src/libstd/thread/mod.rs @@ -796,7 +796,11 @@ pub fn park() { let mut m = thread.inner.lock.lock().unwrap(); match thread.inner.state.compare_exchange(EMPTY, PARKED, SeqCst, SeqCst) { Ok(_) => {} - Err(NOTIFIED) => return, // notified after we locked + Err(NOTIFIED) => { + // should consume this notification, so prohibit spurious wakeups in next park... + thread.inner.state.store(EMPTY, SeqCst); + return; + }, // notified after we locked Err(_) => panic!("inconsistent park state"), } loop { @@ -882,7 +886,11 @@ pub fn park_timeout(dur: Duration) { let m = thread.inner.lock.lock().unwrap(); match thread.inner.state.compare_exchange(EMPTY, PARKED, SeqCst, SeqCst) { Ok(_) => {} - Err(NOTIFIED) => return, // notified after we locked + Err(NOTIFIED) => { + // should consume this notification, so prohibit spurious wakeups in next park... + thread.inner.state.store(EMPTY, SeqCst); + return; + }, // notified after we locked Err(_) => panic!("inconsistent park_timeout state"), } |
