about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorJason Toffaletti <jason@topsy.com>2013-11-11 13:33:43 -0800
committerJason Toffaletti <jason@topsy.com>2013-11-13 14:44:50 -0800
commit91de538c9802e7c45cadc5391450631c74f593d2 (patch)
tree9d27e1bca85ec26ee67d489c95d3c7ce5b513b49 /src/libstd
parent2b2a89d97f72aa6f1b1fc9849c4322f294747e12 (diff)
downloadrust-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.rs17
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);