Index: tests/syscalls/semaphore_tests.cc |
diff --git a/tests/syscalls/semaphore_tests.cc b/tests/syscalls/semaphore_tests.cc |
index 86fb41646bf76506fa45a8af624df0570dc701a8..3022bf30b09cca1b58f41c19c7eb856d81c28f44 100644 |
--- a/tests/syscalls/semaphore_tests.cc |
+++ b/tests/syscalls/semaphore_tests.cc |
@@ -163,10 +163,39 @@ int TestSemNormalOperation() { |
END_TEST(); |
} |
+int TestSemTryWait() { |
+ START_TEST("test sem_trywait() and sem_getvalue()"); |
+ |
+ int start_value = 10; |
+ sem_t sem; |
+ EXPECT(0 == sem_init(&sem, 0, start_value)); |
+ |
+ int value = -1; |
+ EXPECT(0 == sem_getvalue(&sem, &value)); |
+ EXPECT(10 == value); |
+ // When the semaphore's value is positive, each call to |
+ // sem_trywait() should decrement the semaphore's value. |
+ for (int i = 1; i <= start_value; i++) { |
+ EXPECT(0 == sem_trywait(&sem)); |
+ EXPECT(0 == sem_getvalue(&sem, &value)); |
+ EXPECT(start_value - i == value); |
+ } |
+ // When the semaphore's value is zero, sem_trywait() should fail. |
+ EXPECT(-1 == sem_trywait(&sem)); |
+ EXPECT(EAGAIN == errno); |
+ EXPECT(0 == sem_getvalue(&sem, &value)); |
+ EXPECT(0 == value); |
+ |
+ EXPECT(0 == sem_destroy(&sem)); |
+ |
+ END_TEST(); |
+} |
+ |
int main() { |
int fail_count = 0; |
fail_count += TestSemInitErrors(); |
fail_count += TestSemPostErrors(); |
fail_count += TestSemNormalOperation(); |
+ fail_count += TestSemTryWait(); |
std::exit(fail_count); |
} |