From a109ac00e67129ddb358b6416a3241f22a441ad9 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 25 May 2025 17:34:45 +0200 Subject: feat(engine): add asset management --- engine/src/work_queue.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 engine/src/work_queue.rs (limited to 'engine/src/work_queue.rs') diff --git a/engine/src/work_queue.rs b/engine/src/work_queue.rs new file mode 100644 index 0000000..7226c7d --- /dev/null +++ b/engine/src/work_queue.rs @@ -0,0 +1,44 @@ +use std::marker::PhantomData; +use std::sync::mpsc::{channel as mpsc_channel, Sender as MpscSender}; +use std::thread::JoinHandle as ThreadHandle; + +pub struct Work +{ + pub func: fn(UserData), + pub user_data: UserData, +} + +#[derive(Debug)] +pub struct WorkQueue +{ + work_sender: MpscSender>, + _thread: ThreadHandle<()>, + _pd: PhantomData, +} + +impl WorkQueue +{ + pub fn new() -> Self + { + let (work_sender, work_receiver) = mpsc_channel::>(); + + Self { + work_sender, + _thread: std::thread::spawn(move || { + let work_receiver = work_receiver; + + while let Ok(work) = work_receiver.recv() { + (work.func)(work.user_data); + } + }), + _pd: PhantomData, + } + } + + pub fn add_work(&self, work: Work) + { + if self.work_sender.send(work).is_err() { + tracing::error!("Cannot add work to work queue. Work queue thread is dead"); + } + } +} -- cgit v1.2.3-18-g5258