[![build](https://github.com/vpetrigo/miniloop/actions/workflows/ci.yml/badge.svg)](https://github.com/vpetrigo/miniloop/actions/workflows/ci.yml)
[![Crates.io Version](https://img.shields.io/crates/v/miniloop)](https://crates.io/crates/miniloop)
# miniloop - simple asynchronous executor
This repository is created as an attempt to clarify some more low-level details about how things work
in Rust asynchronous world.
The `miniloop` executor creates a statically allocated list of tasks. That number should be available upon a crate
build:
- `MINILOOP_TASK_ARRAY_SIZE`: default value is `1` which means you can schedule a single task within the executor. To
override that just define an environment variable with the number of tasks you plan to use in your application.
## Configuration
You can set up the environment variable in a shell prior to running the `cargo build` command:
- Linux
```shell
export MINILOOP_TASK_ARRAY_SIZE=10
```
- Windows
```powershell
$env:MINILOOP_TASK_ARRAY_SIZE = 10
```
Or you can use [configurable environment](https://doc.rust-lang.org/nightly/cargo/reference/config.html#env) feature by
creating a `.cargo/config.toml` file with the following content:
```toml
[env]
MINILOOP_TASK_ARRAY_SIZE = "10"
```
# miniloop in action
Create your tasks on the stack, add them to the executor and enjoy!
```rust
use miniloop::executor::Executor;
use miniloop::helpers::yield_me;
fn sleep(s: u64) {
std::thread::sleep(std::time::Duration::from_secs(s));
}
async fn dummy_func(data: &str) {
const TICKS: usize = 4;
let mut counter = 0usize;
while counter != TICKS {
sleep(2);
let now = get_timestamp_sec();
println!("{now}: {data}");
yield_me().await;
counter += 1;
}
}
fn get_timestamp_sec() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs()
}
fn pending_print(task_name: &str) {
let now = get_timestamp_sec();
println!("{now}: Task {task_name} is pending. Waiting for the next tick...");
}
fn main() {
let mut executor = Executor::new();
executor.set_pending_callback(pending_print);
let mut binding1 = async {
dummy_func("hello").await;
};
let mut binding2 = async {
dummy_func("world").await;
};
let _ = executor.spawn("hello", &mut binding1);
let _ = executor.spawn("world", &mut binding2);
executor.run();
println!("Done!");
}
```
# License
This project is licensed under Apache License, Version 2.0
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in time by you, as
defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or
conditions.