pub trait SemaphoreState {
type Params;
type Permit;
// Required methods
fn acquire(
&mut self,
params: Self::Params,
) -> Result<Self::Permit, Self::Params>;
fn release(&mut self, permit: Self::Permit);
}Expand description
The trait defining how semaphores behave.
The usage of this state is as follows:
fn get_permit<S: SemaphoreState>(s: &Mutex<S>, mut params: S::Params) -> S::Permit {
loop {
let mut s = s.lock().unwrap();
match s.acquire(params) {
Ok(permit) => break permit,
Err(p) => params = p,
}
// sleep/spin/yield until time to try again
}
}
fn return_permit<S: SemaphoreState>(s: &Mutex<S>, permit: S::Permit) {
s.lock().unwrap().release(permit);
}