RawWakerVTable in core::task - Rust (original) (raw)
Struct RawWakerVTable
1.36.0 · Source
pub struct RawWakerVTable { /* private fields */ }
Expand description
A virtual function pointer table (vtable) that specifies the behavior of a RawWaker.
The pointer passed to all functions inside the vtable is the data
pointer from the enclosing RawWaker object.
The functions inside this struct are only intended to be called on the data
pointer of a properly constructed RawWaker object from inside theRawWaker implementation. Calling one of the contained functions using any other data
pointer will cause undefined behavior.
Note that while this type implements PartialEq
, comparing function pointers, and hence comparing structs like this that contain function pointers, is unreliable: pointers to the same function can compare inequal (because functions are duplicated in multiple codegen units), and pointers to different functions can compare equal (since identical functions can be deduplicated within a codegen unit).
§Thread safety
If the RawWaker will be used to construct a Waker then these functions must all be thread-safe (even though RawWaker is + 
). This is because Waker is [Send](../marker/trait.Send.html "trait core:📑:Send") + [Sync](../marker/trait.Sync.html "trait core:📑:Sync")
, and it may be moved to arbitrary threads or invoked by &
reference. For example, this means that if the clone
and drop
functions manage a reference count, they must do so atomically.
However, if the RawWaker will be used to construct a LocalWaker instead, then these functions don’t need to be thread safe. This means that  + 
data can be stored in the data pointer, and reference counting does not need any atomic synchronization. This is because LocalWaker is not thread safe itself, so it cannot be sent across threads.
1.36.0 (const: 1.36.0) · Source
Creates a new RawWakerVTable
from the provided clone
, wake
,wake_by_ref
, and drop
functions.
If the RawWaker will be used to construct a Waker then these functions must all be thread-safe (even though RawWaker is + 
). This is because Waker is [Send](../marker/trait.Send.html "trait core:📑:Send") + [Sync](../marker/trait.Sync.html "trait core:📑:Sync")
, and it may be moved to arbitrary threads or invoked by &
reference. For example, this means that if the clone
and drop
functions manage a reference count, they must do so atomically.
However, if the RawWaker will be used to construct a LocalWaker instead, then these functions don’t need to be thread safe. This means that  + 
data can be stored in the data pointer, and reference counting does not need any atomic synchronization. This is because LocalWaker is not thread safe itself, so it cannot be sent across threads.
§clone
This function will be called when the RawWaker gets cloned, e.g. when the Waker/LocalWaker in which the RawWaker is stored gets cloned.
The implementation of this function must retain all resources that are required for this additional instance of a RawWaker and associated task. Calling wake
on the resulting RawWaker should result in a wakeup of the same task that would have been awoken by the original RawWaker.
§wake
This function will be called when wake
is called on the Waker. It must wake up the task associated with this RawWaker.
The implementation of this function must make sure to release any resources that are associated with this instance of a RawWaker and associated task.
§wake_by_ref
This function will be called when wake_by_ref
is called on the Waker. It must wake up the task associated with this RawWaker.
This function is similar to wake
, but must not consume the provided data pointer.
§drop
This function will be called when a Waker/LocalWaker gets dropped.
The implementation of this function must make sure to release any resources that are associated with this instance of a RawWaker and associated task.
Tests for self
and other
values to be equal, and is used by ==
.
Tests for !=
. The default implementation is almost always sufficient, and should not be overridden without very good reason.