core-allocator 0.2.2

A crate to help set core affinity
Documentation
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, TryLockError, TryLockResult};

#[derive(Clone)]
pub struct Resource {
    taken: Arc<AtomicBool>,
}
impl Resource {
    pub fn new() -> Resource {
        Resource {
            taken: Default::default(),
        }
    }
    pub fn is_taken(&self) -> bool {
        self.taken.load(Ordering::Relaxed)
    }
    pub fn try_lock(&self) -> TryLockResult<ResourceHandle> {
        if self
            .taken
            .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed)
            == Ok(false)
        {
            Ok(ResourceHandle(self.clone()))
        } else {
            Err(TryLockError::WouldBlock)
        }
    }
}
pub struct ResourceHandle(Resource);

impl Drop for ResourceHandle {
    fn drop(&mut self) {
        self.0.taken.store(false, Ordering::Relaxed)
    }
}