pub struct TokioCt { /* private fields */ }
Available on crate feature tokio_ct only.
Expand description

An executor that uses a tokio::runtime::Runtime with the current thread and a tokio::task::LocalSet. Can spawn !Send futures.

Creation of the runtime

You must use TokioCtBuilder to create the executor.

// Make sure to set the `tokio_ct` feature on async_executors.
//
use
{
   async_executors :: { TokioCt, TokioCtBuilder, LocalSpawnHandleExt } ,
   tokio           :: { runtime::Builder                             } ,
   std             :: { rc::Rc                                       } ,
};

// You must use the builder. This guarantees that TokioCt is always backed by a single threaded runtime.
// You can set other configurations by calling `tokio_builder()` on TokioCtBuilder, so you get
// access to the `tokio::runtime::Builder`.
//
let exec = TokioCtBuilder::new().build().expect( "create tokio runtime" );

// block_on takes a &self, so if you need to `async move`,
// just clone it for use inside the async block.
//
exec.block_on( async
{
   let not_send = async { let rc = Rc::new(()); };

   // We can spawn !Send futures here.
   //
   let join_handle = exec.spawn_handle_local( not_send ).expect( "spawn" );

   join_handle.await;
});

Unwind Safety.

When a future spawned on this wrapper panics, the panic will be caught by tokio in the poll function.

You must only spawn futures to this API that are unwind safe. Tokio will wrap spawned tasks in std::panic::AssertUnwindSafe and wrap the poll invocation with std::panic::catch_unwind.

They reason that this is fine because they require Send + 'static on the task. As far as I can tell this is wrong. Unwind safety can be circumvented in several ways even with Send + 'static (eg. parking_lot::Mutex is Send + 'static but !UnwindSafe).

You should make sure that if your future panics, no code that lives on after the panic, nor any destructors called during the unwind can observe data in an inconsistent state.

Note: the future running from within block_on as opposed to spawn does not exhibit this behavior and will panic the current thread.

Note that these are logic errors, not related to the class of problems that cannot happen in safe rust (memory safety, undefined behavior, unsoundness, data races, …). See the relevant catch_unwind RFC and it’s discussion threads for more info as well as the documentation of std::panic::UnwindSafe for more information.

Implementations

This is the entry point for this executor. Once this call returns, no remaining tasks shall be polled anymore. However the tasks stay in the executor, so if you make a second call to block_on with a new task, the older tasks will start making progress again.

For simplicity, it’s advised to just create top level task that you run through block_on and make sure your program is done when it returns.

See: tokio::runtime::Runtime::block_on

Panics

This function will panic if it is called from an async context, including but not limited to making a nested call. It will also panic if the provided future panics.

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Spawns a future that will be run to completion. Read more

Determines whether the executor is able to spawn new tasks. Read more

Spawn a future and return a JoinHandle that can be awaited for the output of the future.

Spawns a future that will be run to completion. Read more

Determines whether the executor is able to spawn new tasks. Read more

Runs the provided closure on a thread where blocking is acceptable.

Runs the provided closure on a thread where blocking is acceptable. This part of the trait is object safe but your closure must be boxed and you cannot have a return value. Read more

Spawn a future and return a JoinHandle that can be awaited for the output of the future.

Future that resolves after a given duration.

Await this future in order to yield to the executor.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

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

Spawns a task that polls the given future with output () to completion. Read more

Spawns a task that polls the given future to completion and returns a future that resolves to the spawned future’s output. Read more

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

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

Spawns a task that polls the given future with output () to completion. Read more

Spawns a task that polls the given future to completion and returns a future that resolves to the spawned future’s output. Read more

The resulting type after obtaining ownership.

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

🔬 This is a nightly-only experimental API. (toowned_clone_into)

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

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more