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; }
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; }