about summary refs log tree commit diff
path: root/src/libstd/thread
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd/thread')
-rw-r--r--src/libstd/thread/mod.rs12
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"),
     }