//! # smarm — Silly Marks Abstract Rust Machine //! //! Erlang-style green-thread actor concurrency for Rust. //! //! Multi-threaded: N scheduler OS threads (default: one per CPU) share a //! single global run queue behind a `Mutex`. Actors communicate by sending //! `Send` messages over channels; every actor has a supervisor. Synchronisation //! primitives — `Mutex` with mandatory lock timeouts, channel `recv`, //! `sleep`, and epoll-backed `wait_readable`/`wait_writable` — all park the //! green thread, never the OS thread. //! //! See `LOOM.md` for the design intent and the deferred-for-later list. pub mod stack; pub mod context; pub mod preempt; pub mod pid; pub mod actor; pub mod channel; pub mod scheduler; pub mod supervisor; pub mod timer; pub mod io; pub mod mutex; pub mod monitor; pub mod registry; pub mod link; pub mod gen_server; pub mod runtime; pub(crate) mod raw_mutex; pub(crate) mod slot_state; pub(crate) mod sync_shim; #[doc(hidden)] // pub only so benches/rq_micro.rs can drive the raw structures pub mod run_queue; pub mod trace; // --------------------------------------------------------------------------- // Global allocator // --------------------------------------------------------------------------- #[global_allocator] static ALLOCATOR: preempt::PreemptingAllocator = preempt::PreemptingAllocator; // --------------------------------------------------------------------------- // Public API re-exports // --------------------------------------------------------------------------- pub use channel::{ channel, select, select_timeout, try_select, try_select_timeout, Receiver, RecvError, RecvTimeoutError, Selectable, Sender, }; pub use gen_server::{CallError, CallTimeoutError, CastError, GenServer, ServerBuilder, ServerCtx, ServerRef, Watcher}; pub use link::{link, trap_exit, unlink, ExitSignal}; pub use monitor::{demonitor, monitor, Down, DownReason, Monitor, MonitorId}; pub use mutex::{LockTimeout, Mutex, MutexGuard}; pub use pid::Pid; pub use registry::{name_of, register, unregister, whereis, RegisterError}; pub use runtime::{init, Config, Runtime}; pub use scheduler::{ block_on_io, request_stop, run, self_pid, sleep, spawn, spawn_under, wait_readable, wait_readable_timeout, wait_writable, wait_writable_timeout, yield_now, FdArm, JoinError, JoinHandle, }; pub use supervisor::{ChildSpec, OneForOne, Restart, Signal, Strategy}; // --------------------------------------------------------------------------- // check!() // --------------------------------------------------------------------------- /// Voluntarily check whether this actor's timeslice has expired, yielding /// if so. #[macro_export] macro_rules! check { () => { $crate::preempt::maybe_preempt() }; }