pub struct MainThreadToken {
    _dont_send_me: PhantomData<*const ()>,
}
Expand description

A token that (almost) proves we are on the main thread.

Certain operations are only allowed on the main thread. These operations should require this token. For instance, any function using file dialogs (e.g. using rfd) should require this token.

The token should only be constructed in fn main, using MainThreadToken::i_promise_i_am_on_the_main_thread, and then be passed down the call tree to where it is needed. MainThreadToken is neither Send nor Sync, thus guaranteeing that it cannot be found in other threads.

Of course, there is nothing stopping you from calling MainThreadToken::i_promise_i_am_on_the_main_thread from a background thread, but PLEASE DON’T DO THAT. In other words, don’t use this as a guarantee for unsafe code.

There is also MainThreadToken::from_egui_ui which uses the implicit guarantee of egui (which usually is run on the main thread) to construct a MainThreadToken. Use this only in a code base where you are sure that egui is running only on the main thread.

Fields§

§_dont_send_me: PhantomData<*const ()>

Prevent from being sent between threads.

Workaround until impl !Send for X {} is stable.

Implementations§

source§

impl MainThreadToken

source

pub fn i_promise_i_am_on_the_main_thread() -> Self

Only call this from fn main, or you may get weird runtime errors!

source

pub fn from_egui_ui(_ui: &Ui) -> Self

We should only create an [egui::Ui] on the main thread, so having it is good enough to “prove” that we are on the main thread.

Use this only in a code base where you are sure that egui is running only on the main thread.

In theory there is nothing preventing anyone from creating a [egui::Ui] on another thread, but practice that is unlikely (or intentionally malicious).

Trait Implementations§

source§

impl Clone for MainThreadToken

source§

fn clone(&self) -> MainThreadToken

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Copy for MainThreadToken

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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 more
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

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

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

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

The type returned in the event of a conversion error.
source§

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

Performs the conversion.