diff options
| author | Jason Toffaletti <jason@topsy.com> | 2013-11-11 13:33:43 -0800 |
|---|---|---|
| committer | Jason Toffaletti <jason@topsy.com> | 2013-11-13 14:44:50 -0800 |
| commit | 91de538c9802e7c45cadc5391450631c74f593d2 (patch) | |
| tree | 9d27e1bca85ec26ee67d489c95d3c7ce5b513b49 /src/libstd | |
| parent | 2b2a89d97f72aa6f1b1fc9849c4322f294747e12 (diff) | |
| download | rust-91de538c9802e7c45cadc5391450631c74f593d2.tar.gz rust-91de538c9802e7c45cadc5391450631c74f593d2.zip | |
add rust_trylock_little_lock
Try to acquire lock and succeed only if lock is not already held. Uses TryEnterCriticalSection or pthread_mutex_trylock.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/unstable/sync.rs | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/libstd/unstable/sync.rs b/src/libstd/unstable/sync.rs index a08b914ca31..0e1f5fc1bdc 100644 --- a/src/libstd/unstable/sync.rs +++ b/src/libstd/unstable/sync.rs @@ -13,7 +13,7 @@ use cell::Cell; use comm; use libc; use ptr; -use option::*; +use option::{Option,Some,None}; use task; use unstable::atomics::{AtomicOption,AtomicUint,Acquire,Release,Relaxed,SeqCst}; use unstable::finally::Finally; @@ -354,6 +354,20 @@ impl LittleLock { } } + pub unsafe fn try_lock<T>(&self, f: &fn() -> T) -> Option<T> { + do atomically { + if rust_trylock_little_lock(self.l) { + Some(do (|| { + f() + }).finally { + rust_unlock_little_lock(self.l); + }) + } else { + None + } + } + } + pub unsafe fn signal(&self) { rust_signal_little_lock(self.l); } @@ -478,6 +492,7 @@ impl<T:Send> Exclusive<T> { extern { fn rust_create_little_lock() -> rust_little_lock; fn rust_destroy_little_lock(lock: rust_little_lock); + fn rust_trylock_little_lock(lock: rust_little_lock) -> bool; fn rust_lock_little_lock(lock: rust_little_lock); fn rust_unlock_little_lock(lock: rust_little_lock); fn rust_signal_little_lock(lock: rust_little_lock); |
