semka 2.0.7

Semaphore implementation
Documentation
use semka::Sem;
use std::time;

#[test]
fn should_init_after_close() {
    let sem = Sem::new(0).unwrap();

    assert!(sem.is_init());
    assert!(!sem.init(0));

    unsafe {
        sem.close();
        sem.close();
    }

    assert!(sem.init(0));
    assert!(!sem.init(0));

    assert!(!sem.try_wait());
    sem.signal();
    sem.signal();
    assert!(sem.try_wait());
    assert!(sem.try_wait());

    assert!(!sem.try_wait());

    unsafe {
        sem.close();
        sem.close();
    }
}

#[test]
fn should_fail_init_twice() {
    let sem = unsafe {
        Sem::new_uninit()
    };

    assert!(!sem.is_init());
    assert!(sem.init(0));
    assert!(!sem.init(0));
    assert!(sem.is_init());

    assert!(!sem.try_wait());
    sem.signal();
    sem.signal();
    assert!(sem.try_wait());
    assert!(sem.try_wait());

    assert!(!sem.try_wait());
}

#[test]
fn should_return_when_signaled_counting() {
    let sem = Sem::new(0).unwrap();

    assert!(!sem.try_wait());
    sem.signal();
    sem.signal();
    assert!(sem.try_wait());
    assert!(sem.try_wait());

    assert!(!sem.try_wait());
}

#[test]
fn should_timeout_on_wait() {
    let sem = Sem::new(0).unwrap();
    assert!(!sem.try_wait());

    let before = time::Instant::now();
    assert!(!sem.wait_timeout(time::Duration::from_millis(2500)));
    let after = time::Instant::now();

    let duration = after.duration_since(before);
    println!("duration={:?}", duration);
    assert!(duration.as_millis() > 2000 && duration.as_millis() < 3000);
}