From 800772642df81934a6d061e4ac5ed1097002b367 Mon Sep 17 00:00:00 2001 From: Emeric Chevalier Date: Mon, 12 Jan 2015 23:06:55 +0100 Subject: [PATCH] Add posix like get_val for semaphore --- src/libstd/sync/semaphore.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/libstd/sync/semaphore.rs b/src/libstd/sync/semaphore.rs index 8d44084671aad..37b446c04982e 100644 --- a/src/libstd/sync/semaphore.rs +++ b/src/libstd/sync/semaphore.rs @@ -96,6 +96,20 @@ impl Semaphore { self.acquire(); SemaphoreGuard { sem: self } } + + /// Get the current value of the semaphore. + /// + /// This method could be used to unlock a semaphore in an unknown state. + /// ``` + /// for i in range(sem.get_value(),1) { + /// sem.release(); + /// } + /// Or simply to monitor a semaphore state. + /// ``` + pub fn get_value(&self) -> int { + *self.lock.lock().unwrap() + } + } #[unsafe_destructor] @@ -198,4 +212,21 @@ mod tests { } rx.recv().unwrap(); // wait for child to be done } + + #[test] + fn test_sem_get_val() { + let s = Arc::new(Semaphore::new(-5)); + let s2 = s.clone(); + let (tx, rx) = channel(); + let _t = Thread::spawn(move|| { + let _ = rx.recv(); + for _ in range(s2.get_value(),1){ + s2.release(); + } + }); + tx.send(()).unwrap(); + s.acquire(); + } + + }