Struct zircon_object::signal::Futex[][src]

pub struct Futex { /* fields omitted */ }

A primitive for creating userspace synchronization tools.

SYNOPSIS

A futex is a Fast Userspace muTEX. It is a low level synchronization primitive which is a building block for higher level APIs such as pthread_mutex_t and pthread_cond_t. Futexes are designed to not enter the kernel or allocate kernel resources in the uncontested case.

Implementations

impl Futex[src]

pub fn new(value: &'static AtomicI32) -> Arc<Self>[src]

Create a new Futex.

The parameter value is the reference to an userspace AtomicI32. This reference is the information used in kernel to track what futex given threads are waiting on. The kernel does not currently modify the value of *value. It is up to userspace code to correctly atomically modify this value across threads in order to build mutexes and so on.

pub fn wait(
    self: &Arc<Self>,
    current_value: i32
) -> impl Future<Output = ZxResult>
[src]

Wait on a futex.

This atomically verifies that value_ptr still contains the value current_value and sleeps until the futex is made available by a call to wake.

See wait_with_owner for advanced usage and more details.

pub fn wake(&self, wake_count: usize) -> usize[src]

Wake some number of threads waiting on a futex.

It wakes at most wake_count of the waiters that are waiting on this futex. Return the number of waiters that were woken up.

Ownership

The owner of the futex is set to nothing, regardless of the wake count.

pub fn owner(&self) -> Option<Arc<Thread>>[src]

Get the owner of the futex.

pub fn wait_with_owner(
    self: &Arc<Self>,
    current_value: i32,
    thread: Option<Arc<Thread>>,
    new_owner: Option<Arc<Thread>>
) -> impl Future<Output = ZxResult>
[src]

Wait on a futex.

This atomically verifies that value_ptr still contains the value current_value and sleeps until the futex is made available by a call to wake.

SPURIOUS WAKEUPS

This implementation currently does not generate spurious wakeups.

Ownership

A successful call results in the owner of the futex being set to the thread referenced by the new_owner, or to nothing if it is None.

Errors

  • INVALID_ARGS: One of the following is true
    • new_owner is currently a member of the waiters for this.
    • new_owner has not been started yet.
  • BAD_STATE: current_value does not match the value at value_ptr.
  • TIMED_OUT: The thread was not woken before deadline passed.

pub fn wake_single_owner(&self)[src]

Wake exactly one thread from the futex wait queue.

If there is at least one thread to wake, the owner of the futex will be set to the thread which was woken. Otherwise, the futex will have no owner.

Ownership

If there is at least one thread to wake, the owner of the futex will be set to the thread which was woken. Otherwise, the futex will have no owner.

pub fn requeue(
    &self,
    current_value: i32,
    wake_count: usize,
    requeue_count: usize,
    requeue_futex: &Arc<Futex>,
    new_requeue_owner: Option<Arc<Thread>>
) -> ZxResult
[src]

Requeuing is a generalization of waking.

First, verifies that the value in current_value matches the value of the futex, and if not reports ZxError::BAD_STATE. After waking wake_count threads, requeue_count threads are moved from the original futex’s wait queue to the wait queue corresponding to another requeue_futex.

This requeueing behavior may be used to avoid thundering herds on wake.

Ownership

The owner of this futex is set to nothing, regardless of the wake count. The owner of the requeue_futex is set to the thread new_requeue_owner.

Trait Implementations

impl Debug for Futex[src]

impl KernelObject for Futex[src]

Auto Trait Implementations

impl !RefUnwindSafe for Futex

impl Send for Futex

impl Sync for Futex

impl Unpin for Futex

impl !UnwindSafe for Futex

Blanket Implementations

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

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

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

impl<T> Downcast for T where
    T: Any
[src]

impl<T> DowncastSync for T where
    T: Send + Sync + Any
[src]

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

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

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.

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.