pkthread 0.1.0

PKaiser's threading utilities.
Documentation
use std::sync::{mpsc::channel, Arc, Barrier};
use pkthread::pool::worker::{Worker, WorkerOptions};

/// Asserts that a [`Worker`] becomes 'busy' if it is processing work.
#[test]
fn worker_is_busy() {
    let worker = spawn_worker();
    let (sender, receiver) = channel::<bool>();
    let barrier = Arc::new(Barrier::new(2));

    let barrier_thread = barrier.clone();
    worker.queue(move || {
        sender
            .send(true)
            .unwrap();
        barrier_thread.wait();
    });

    let received = receiver
        .recv()
        .unwrap();
    if received {
        let is_busy = worker.is_busy();
        assert!(is_busy);
    }

    barrier.wait();
}

/// Asserts that a [`Worker`] executes work.
#[test]
fn work_is_executed() {
    let worker = spawn_worker();
    let (sender, receiver) = channel::<bool>();

    worker.queue(move || {
        sender
            .send(true)
            .unwrap();
    });

    let value = receiver
        .recv()
        .expect("Failed to receive value.");
    
    assert!(value);
}

fn spawn_worker() -> Worker {
    let options = WorkerOptions::default();

    Worker::spawn(options)
        .expect("Failed to initialize the worker thread.")
}