Skip to main content

execute

Macro execute 

macro_rules! execute {
    (
        actors: [
            $($actor_type:ty $(: $init_context:expr )? ),* $(,)?
        ] $(,)?
    ) => { ... };
}
Expand description

Execute a given set of actors without heap allocation.

use core::fmt::Debug;

use veecle_os_runtime::single_writer::{Reader, Writer};
use veecle_os_runtime::{Never, Storable};

#[derive(Debug, Clone, PartialEq, Eq, Default, Storable)]
pub struct Ping {
    value: u32,
}

#[derive(Debug, Clone, PartialEq, Eq, Default, Storable)]
pub struct Pong {
    value: u32,
}

#[veecle_os_runtime::actor]
async fn ping_actor(mut ping: Writer<'_, Ping>, mut pong: Reader<'_, Pong>) -> Never {
    let mut value = 0;
    ping.write(Ping { value }).await;

    loop {
        ping.write(Ping { value }).await;
        value += 1;

        pong.read_updated(|pong| {
            println!("Pong: {}", pong.value);
        }).await;
    }
}

#[veecle_os_runtime::actor]
async fn pong_actor(mut pong: Writer<'_, Pong>, mut ping: Reader<'_, Ping>) -> Never {
    loop {
        let ping = ping.read_updated_cloned().await;
        println!("Ping: {}", ping.value);

        let data = Pong { value: ping.value };
        pong.write(data).await;
    }
}

futures::executor::block_on(
   veecle_os_runtime::execute! {
       actors: [PingActor, PongActor],
   }
)