[go: up one dir, main page]

saa 0.3.0

Low-level synchronization primitives that provide both synchronous and asynchronous interfaces
Documentation
use std::sync::Arc;

use loom::thread::spawn;

use crate::opcode::Opcode;
use crate::sync_primitive::SyncPrimitive;
use crate::{Lock, Semaphore};

#[test]
fn lock_shared() {
    loom::model(|| {
        let lock = Arc::new(Lock::default());
        lock.lock_exclusive_sync();
        let lock_clone = lock.clone();
        let thread = spawn(move || {
            lock_clone.lock_shared_sync();
            assert!(lock_clone.unlock_shared());
        });
        assert!(lock.unlock_exclusive());
        assert!(thread.join().is_ok());
    });
}

#[test]
fn lock_exclusive() {
    loom::model(|| {
        let lock = Arc::new(Lock::default());
        lock.lock_shared_sync();
        let lock_clone = lock.clone();
        let thread = spawn(move || {
            lock_clone.lock_exclusive_sync();
            assert!(lock_clone.unlock_exclusive());
        });
        assert!(lock.unlock_shared());
        assert!(thread.join().is_ok());
    });
}

#[test]
fn semaphore_release_acquire() {
    loom::model(|| {
        let semaphore = Arc::new(Semaphore::default());
        semaphore.acquire_many_sync(Semaphore::MAX_PERMITS);
        let semaphore_clone = semaphore.clone();
        let thread = spawn(move || {
            semaphore_clone.acquire_many_sync(9);
            semaphore_clone.acquire_many_sync(2);
        });
        assert!(semaphore.release_many(10));
        assert!(semaphore.release());
        assert!(thread.join().is_ok());
    });
}

#[test]
fn drop_future() {
    loom::model(|| {
        let semaphore = Arc::new(Semaphore::default());
        semaphore.acquire_many_sync(Semaphore::MAX_PERMITS);
        let semaphore_clone = semaphore.clone();
        let thread = spawn(move || {
            semaphore_clone.acquire_many_sync(9);
        });
        semaphore.test_drop_wait_queue_entry(Opcode::Semaphore(11));
        assert!(semaphore.release_many(Semaphore::MAX_PERMITS));
        assert!(thread.join().is_ok());
    });
}