Struct zircon_object::signal::Futex [−][src]
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]
self: &Arc<Self>,
current_value: i32
) -> impl Future<Output = ZxResult>
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]
self: &Arc<Self>,
current_value: i32,
thread: Option<Arc<Thread>>,
new_owner: Option<Arc<Thread>>
) -> impl Future<Output = ZxResult>
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 truenew_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 atvalue_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]
&self,
current_value: i32,
wake_count: usize,
requeue_count: usize,
requeue_futex: &Arc<Futex>,
new_requeue_owner: Option<Arc<Thread>>
) -> ZxResult
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]
fn id(&self) -> KoID
[src]
fn type_name(&self) -> &str
[src]
fn name(&self) -> String
[src]
fn set_name(&self, name: &str)
[src]
fn signal(&self) -> Signal
[src]
fn signal_set(&self, signal: Signal)
[src]
fn signal_clear(&self, signal: Signal)
[src]
fn signal_change(&self, clear: Signal, set: Signal)
[src]
fn add_signal_callback(&self, callback: SignalHandler)
[src]
fn get_child(&self, _id: KoID) -> ZxResult<Arc<dyn KernelObject>>
[src]
fn peer(&self) -> ZxResult<Arc<dyn KernelObject>>
[src]
fn related_koid(&self) -> KoID
[src]
fn allowed_signals(&self) -> Signal
[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]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Downcast for T where
T: Any,
[src]
T: Any,
pub fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
[src]
pub fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
[src]
pub fn as_any(&self) -> &(dyn Any + 'static)
[src]
pub fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
[src]
impl<T> DowncastSync for T where
T: Send + Sync + Any,
[src]
T: Send + Sync + Any,
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
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]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,