#ecs #systems #resources #parallel #access-control #system

shred

Dispatches systems in parallel which need read access to some resources, and write access to others

44 releases

0.16.1 May 15, 2024
0.16.0 Jan 12, 2024
0.15.0 Sep 16, 2023
0.14.1 Jul 14, 2022
0.4.3 Jun 21, 2017

#95 in Concurrency

Download history 2598/week @ 2024-07-22 2457/week @ 2024-07-29 2233/week @ 2024-08-05 4258/week @ 2024-08-12 2474/week @ 2024-08-19 2872/week @ 2024-08-26 2820/week @ 2024-09-02 2404/week @ 2024-09-09 2444/week @ 2024-09-16 2937/week @ 2024-09-23 2560/week @ 2024-09-30 739/week @ 2024-10-07 2107/week @ 2024-10-14 2169/week @ 2024-10-21 2712/week @ 2024-10-28 2308/week @ 2024-11-04

9,376 downloads per month
Used in 125 crates (13 directly)

MIT/Apache

160KB
3K SLoC

shred - Shared resource dispatcher

Build Status Crates.io MIT/Apache Docs.rs LoC

This library allows to dispatch systems, which can have interdependencies, shared and exclusive resource access, in parallel.

Usage

extern crate shred;

use shred::{DispatcherBuilder, Read, Resource, ResourceId, System, SystemData, World, Write};

#[derive(Debug, Default)]
struct ResA;

#[derive(Debug, Default)]
struct ResB;

#[derive(SystemData)] // Provided with `shred-derive` feature
struct Data<'a> {
    a: Read<'a, ResA>,
    b: Write<'a, ResB>,
}

struct EmptySystem;

impl<'a> System<'a> for EmptySystem {
    type SystemData = Data<'a>;

    fn run(&mut self, bundle: Data<'a>) {
        println!("{:?}", &*bundle.a);
        println!("{:?}", &*bundle.b);
    }
}

fn main() {
    let mut world = World::empty();
    let mut dispatcher = DispatcherBuilder::new()
        .with(EmptySystem, "empty", &[])
        .build();
    world.insert(ResA);
    world.insert(ResB);

    dispatcher.dispatch(&mut world);
}

Please see the benchmark for a bigger (and useful) example.

Required Rust version

1.56.1 stable

Features

  • lock-free
  • no channels or similar functionality used (-> less overhead)
  • allows both automated parallelization and fine-grained control

Contribution

Contribution is highly welcome! If you'd like another feature, just create an issue. You can also help out if you want to; just pick a "help wanted" issue. If you need any help, feel free to ask!

All contributions are assumed to be dual-licensed under MIT/Apache-2.

License

shred is distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT.

Dependencies

~4MB
~76K SLoC