Index: tests/syscalls/semaphore_tests.cc |
diff --git a/tests/syscalls/semaphore_tests.cc b/tests/syscalls/semaphore_tests.cc |
index baaff40089f3a8b4f0e02851a14f83f80cdecb18..5d0df9b1d138068594a8a9f0cff732ce1c6cd129 100644 |
--- a/tests/syscalls/semaphore_tests.cc |
+++ b/tests/syscalls/semaphore_tests.cc |
@@ -251,9 +251,38 @@ 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 += TestSemNormalOperation(); |
+ fail_count += TestSemTryWait(); |
// A semaphore implementation is not required to check for the |
// errors that are tested for here. nacl-newlib checks, but glibc |