safina-executor 0.3.3

Safe async runtime
Documentation
# safina-executor

[![crates.io version](https://img.shields.io/crates/v/safina-executor.svg)](https://crates.io/crates/safina-executor)
[![license: Apache 2.0](https://gitlab.com/leonhard-llc/safina-rs/-/raw/main/license-apache-2.0.svg)](http://www.apache.org/licenses/LICENSE-2.0)
[![unsafe forbidden](https://gitlab.com/leonhard-llc/safina-rs/-/raw/main/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance/)
[![pipeline status](https://gitlab.com/leonhard-llc/safina-rs/badges/main/pipeline.svg)](https://gitlab.com/leonhard-llc/safina-rs/-/pipelines)

An async executor.

It is part of [`safina`](https://crates.io/crates/safina), a safe async runtime.

## Features
- Spawn async tasks to execute on a threadpool.
- Schedule closures or `FnOnce` to run on a separate thread pool
  for blocking jobs.
- Supports multiple executors.
- `forbid(unsafe_code)`
- Depends only on `std`
- Good test coverage (100%)

## Limitations
- Allocates memory
- Not optimized

## Documentation
<https://docs.rs/safina-executor>

## Examples
```rust
let executor = safina_executor::Executor::default();
let (sender, receiver) = std::sync::mpsc::channel();
executor.spawn(async move {
    sender.send(()).unwrap();
});
receiver.recv().unwrap();
```

```rust
let result = safina_executor::block_on(async {
    prepare_request().await?;
    execute_request().await
})?;
```

```rust
let result = safina_executor::schedule_blocking(|| {
    read_file1()?;
    read_file2()
}).async_recv().await.unwrap()?;
```

## Alternatives
- [`async-executor`]https://crates.io/crates/async-executor
  - Popular
  - Dependencies have some `unsafe` code
- [`futures-executor`]https://crates.io/crates/futures-executor
  - Very popular
  - Full of `unsafe`
- [`tokio-executor`]https://crates.io/crates/tokio-executor
  - Very popular
  - Fast
  - Internally complicated
  - Full of `unsafe`
- [`executors`]https://crates.io/crates/executors
  - Dependencies have lots of `unsafe` code
- [`bastion-executor`]https://crates.io/crates/bastion-executor
  - Lots of `unsafe` code
- [`rayon_core`]https://crates.io/crates/rayon-core
  - Generous amounts of `unsafe` code
- [`pollster`]https://crates.io/crates/pollster
  - Minimal
  - Has a little `unsafe` code
- [`lelet`]https://crates.io/crates/lelet
  - Automatically scales worker thread pool
  - Lots of `unsafe` code
- [`fibers`]https://crates.io/crates/fibers
  - Dependencies are full of unsafe
- [`nostd_async`]https://crates.io/crates/nostd_async
  - Has some `unsafe` code
- [`embedded-executor`]https://crates.io/crates/embedded-executor
  - Generous amounts of `unsafe` code
- [`spin_on`]https://crates.io/crates/spin_on
  - Minimal
- [`pasts`]https://crates.io/crates/pasts
- [`switchyard`]https://crates.io/crates/switchyard
  - Lots of `unsafe` code
- [`sealrs`]https://crates.io/crates/sealrs
- [`rusty_pool`]https://crates.io/crates/rusty_pool
  - Automatically adjusts thread pool
  - Dependencies are full of unsafe

## Changelog
- v0.3.3 - Eliminate spurious "resumed after completion" worker thread panics.
- v0.3.2 - Re-export `safina_sync::Receiver` and `safina_threadpool::NewThreadPoolError`.
- v0.3.1 - Use `safina-async` v0.2.1.
- v0.3.0 - `schedule_blocking` to return new `safina_sync::Receiver`.
- v0.2.1 - Update docs.
- v0.2.0
  - `Executor::new` and `Executor::with_name` to return `Result`.
  - Upgrade to `safina-threadpool` v0.2.0.
- v0.1.7 - `block_on` functions to take futures that are not `Send`.
- v0.1.6 - Fix deadlock in `block_on` and `block_on_unpin` when task is awakened a second time.
- v0.1.5 - Support stable Rust!  Needs 1.51+.
- v0.1.4 - Add
  [`schedule_blocking`]https://docs.rs/safina-executor/latest/safina_executor/fn.schedule_blocking.html
  and
  [`Executor::schedule_blocking`]https://docs.rs/safina-executor/latest/safina_executor/struct.Executor.html#method.schedule_blocking
- v0.1.3
  - Removed global executor.  Users must explicitly create executor.
  - Removed dependency on unstable
    [`OnceCell`]https://doc.rust-lang.org/std/lazy/struct.OnceCell.html.
  - Uses [`safina_threadpool`]https://crates.io/crates/safina-threadpool
    internally.
- v0.1.2 - Let callers pass futures to `spawn` and `block_on` without
  using `Box::pin`.
  Add `spawn_unpin` and `block_on_unpin` for folks who need to avoid allocating.
  so callers don't have to.
- v0.1.1 - Fix badge and update readme
- v0.1.0 - Renamed from `safina`

## TO DO
- Add a stress test
- Add a benchmark.  See benchmarks in <https://crates.io/crates/executors>
- Add an `#[async_main]` macro
- Look into using [`flume`]https://crates.io/crates/flume
  to eliminate the receiver mutex and reduce contention.

## Release Process
1. Edit `Cargo.toml` and bump version number.
1. Run `./release.sh`

License: Apache-2.0