Пример #1
0
tb_bool_t tb_semaphore_post(tb_semaphore_ref_t semaphore, tb_size_t post)
{
    // check
    tb_semaphore_impl_t* impl = (tb_semaphore_impl_t*)semaphore;
    tb_assert_and_check_return_val(semaphore && impl->semaphore && impl->semaphore != INVALID_HANDLE_VALUE && post, tb_false);
    
    // += post
    tb_atomic_fetch_and_add(&impl->value, post);
    
    // post
    LONG prev = 0;
    if (!ReleaseSemaphore(impl->semaphore, (LONG)post, &prev) && prev >= 0) 
    {
        // restore
        tb_atomic_fetch_and_sub(&impl->value, (tb_long_t)post);
        return tb_false;
    }

    // check
    tb_assert_and_check_return_val(prev + post <= TB_SEMAPHORE_VALUE_MAXN, tb_false);
    
    // save value
    tb_atomic_set(&impl->value, prev + post);
    
    // ok
    return tb_true;
}
Пример #2
0
tb_bool_t tb_semaphore_post(tb_semaphore_ref_t self, tb_size_t post)
{
    // check
    tb_atomic_t* semaphore = (tb_atomic_t*)self;
    tb_assert_and_check_return_val(semaphore && post, tb_false);

    // post it
    tb_long_t value = tb_atomic_fetch_and_add(semaphore, post);

    // ok
    return value >= 0? tb_true : tb_false;
}