Struct ksched::sync::Condvar[][src]

pub struct Condvar { /* fields omitted */ }
Expand description

A Condition Variable

This type is an async version of std::sync::Condvar.

Examples

use std::sync::Arc;

use ksched::sync::{Mutex, Condvar};
use ksched::task;

let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();

// Inside of our lock, spawn a new thread, and then wait for it to start.
task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock().await;
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
}).unwrap();

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
let mut started = lock.lock().await;
while !*started {
    started = cvar.wait(started).await;
}

Implementations

impl Condvar[src]

pub fn new() -> Self[src]

Creates a new condition variable

Examples

use ksched::sync::Condvar;

let cvar = Condvar::new();

pub async fn wait<'a, T>(&self, guard: MutexGuard<'a, T>) -> MutexGuard<'a, T>[src]

Blocks the current task until this condition variable receives a notification.

Unlike the std equivalent, this does not check that a single mutex is used at runtime. However, as a best practice avoid using with multiple mutexes.

Examples

use std::sync::Arc;

use ksched::sync::{Mutex, Condvar};
use ksched::task;

let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();

task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock().await;
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
});

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
let mut started = lock.lock().await;
while !*started {
    started = cvar.wait(started).await;
}

pub async fn await_notify<'a, T>(&self, guard: MutexGuard<'a, T>)[src]

Wait for a notification and release the lock.

pub async fn spin_wait<'a, 'b, T>(
    &'a self,
    guard: SpinlockGuard<'b, T>
) -> SpinlockGuard<'b, T>
[src]

Blocks the current task until this condition variable receives a notification.

If failed, return the guard. It is guaranteed that the lock is still held.

Examples

use std::sync::Arc;

use ksched::sync::{Spinlock, Condvar};
use ksched::task;

let pair = Arc::new((Spinlock::new(false), Condvar::new()));
let pair2 = pair.clone();

task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock();
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
}).unwrap();

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
let mut started = lock.lock();
while !*started {
    started = cvar.spin_wait(started).await;
}

pub async fn spin_await_notify<'a, 'b, T>(&'a self, guard: SpinlockGuard<'b, T>)[src]

Wait for a notification and release the lock.

pub async fn wait_until<'a, T, F>(
    &self,
    guard: MutexGuard<'a, T>,
    condition: F
) -> MutexGuard<'a, T> where
    F: FnMut(&mut T) -> bool
[src]

Blocks the current taks until this condition variable receives a notification and the required condition is met. Spurious wakeups are ignored and this function will only return once the condition has been met.

Examples

use std::sync::Arc;

use ksched::sync::{Mutex, Condvar};
use ksched::task;

let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();

task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock().await;
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
}).unwrap();

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
// As long as the value inside the `Mutex<bool>` is `false`, we wait.
let _guard = cvar.wait_until(
    lock.lock().await,
    |started| { *started }
).await;

pub async fn spin_wait_until<'a, 'b, T, F>(
    &'a self,
    guard: SpinlockGuard<'b, T>,
    condition: F
) -> SpinlockGuard<'b, T> where
    F: FnMut(&mut T) -> bool
[src]

Blocks the current taks until this condition variable receives a notification and the required condition is met. Spurious wakeups are ignored and this function will only return once the condition has been met.

Examples

use std::sync::Arc;

use ksched::sync::{Spinlock, Condvar};
use ksched::task;

let pair = Arc::new((Spinlock::new(false), Condvar::new()));
let pair2 = pair.clone();

task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock();
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
}).unwrap();

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
// As long as the value inside the `Mutex<bool>` is `false`, we wait.
let _guard = cvar.spin_wait_until(
    lock.lock(),
    |started| { *started }
).await;

pub fn notify_one(&self)[src]

Wakes up one blocked task on this condvar.

Examples

use std::sync::Arc;

use ksched::sync::{Mutex, Condvar};
use ksched::task;

let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();

task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock().await;
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
}).unwrap();

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
let mut started = lock.lock().await;
while !*started {
    started = cvar.wait(started).await;
}

pub fn notify_all(&self)[src]

Wakes up all blocked tasks on this condvar.

Examples

use std::sync::Arc;

use ksched::sync::{Mutex, Condvar};
use ksched::task;

let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();

task::spawn(async move {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock().await;
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_all();
});

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
let mut started = lock.lock().await;
// As long as the value inside the `Mutex<bool>` is `false`, we wait.
while !*started {
    started = cvar.wait(started).await;
}

Trait Implementations

impl Debug for Condvar[src]

fn fmt(&self, f: &mut Formatter<'_>) -> Result[src]

Formats the value using the given formatter. Read more

impl Default for Condvar[src]

fn default() -> Self[src]

Returns the “default value” for a type. Read more

Auto Trait Implementations

impl !RefUnwindSafe for Condvar

impl Send for Condvar

impl Sync for Condvar

impl Unpin for Condvar

impl !UnwindSafe for Condvar

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.