pub(crate) struct Poller {
work_count: Arc<AtomicUsize>,
is_done: Arc<AtomicBool>,
handle: Option<JoinHandle<()>>,
lock: Arc<Mutex<()>>,
}Expand description
Polls devices while there is something to poll.
This objects corresponds to a thread that parks itself when there is no work,
waiting on it, and then calls poll_all_devices repeatedly to block.
The thread dies when this object is dropped, and all work in submission is done.
§Example
let token = self.poller.token(); // create a new token
let callback = SubmittedWorkDoneClosure::from_rust(Box::from(move || {
drop(token); // drop token as closure has been fired
// ...
}));
let result = gfx_select!(queue_id => global.queue_on_submitted_work_done(queue_id, callback));
self.poller.wake(); // wake poller thread to actually pollFields§
§work_count: Arc<AtomicUsize>The number of closures that still needs to be fired. When this is 0, the thread can park itself.
is_done: Arc<AtomicBool>True if thread should die after all work in submission is done
handle: Option<JoinHandle<()>>Handle to the WGPU poller thread (to be used for unparking the thread)
lock: Arc<Mutex<()>>Lock for device maintain calls (in poll_all_devices and queue_submit)
This is workaround for wgpu deadlocks: https://github.com/gfx-rs/wgpu/issues/5572
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Poller
impl !RefUnwindSafe for Poller
impl Send for Poller
impl Sync for Poller
impl Unpin for Poller
impl !UnwindSafe for Poller
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> MaybeBoxed<Box<T>> for T
impl<T> MaybeBoxed<Box<T>> for T
Source§fn maybe_boxed(self) -> Box<T>
fn maybe_boxed(self) -> Box<T>
Convert
Source§impl<T> MaybeBoxed<T> for T
impl<T> MaybeBoxed<T> for T
Source§fn maybe_boxed(self) -> T
fn maybe_boxed(self) -> T
Convert