Chromium Code Reviews| Index: util/synchronization/semaphore_test.cc |
| diff --git a/util/synchronization/semaphore_test.cc b/util/synchronization/semaphore_test.cc |
| index 3e779574fd448214a70aa1db4c98c9b72e14f7c3..d56f72b9c530c3fc8d32888c34f0ea878891902e 100644 |
| --- a/util/synchronization/semaphore_test.cc |
| +++ b/util/synchronization/semaphore_test.cc |
| @@ -14,7 +14,9 @@ |
| #include "util/synchronization/semaphore.h" |
| +#if defined(OS_POSIX) |
| #include <pthread.h> |
| +#endif // OS_POSIX |
| #include "gtest/gtest.h" |
| @@ -29,17 +31,50 @@ TEST(Semaphore, Simple) { |
| } |
| struct ThreadMainInfo { |
| +#if defined(OS_POSIX) |
| pthread_t pthread; |
| +#elif defined(OS_WIN) |
| + HANDLE thread; |
| +#endif |
| Semaphore* semaphore; |
| size_t iterations; |
| }; |
| -void* ThreadMain(void* argument) { |
| +#if defined(OS_POSIX) |
| +void* |
| +#elif defined(OS_WIN) |
| +DWORD WINAPI |
| +#endif // OS_POSIX |
| +ThreadMain(void* argument) { |
| ThreadMainInfo* info = reinterpret_cast<ThreadMainInfo*>(argument); |
| for (size_t iteration = 0; iteration < info->iterations; ++iteration) { |
| info->semaphore->Wait(); |
| } |
| +#if defined(OS_POSIX) |
| return nullptr; |
| +#elif defined(OS_WIN) |
| + return 0; |
| +#endif // OS_POSIX |
| +} |
| + |
| +void StartThread(ThreadMainInfo* info) { |
| +#if defined(OS_POSIX) |
| + int rv = pthread_create(&info->pthread, nullptr, ThreadMain, info); |
| + ASSERT_EQ(0, rv) << "pthread_create"; |
| +#elif defined(OS_WIN) |
| + info->thread = CreateThread(nullptr, 0, ThreadMain, info, 0, nullptr); |
| + ASSERT_NE(nullptr, info->thread) << "CreateThread"; |
| +#endif // OS_POSIX |
| +} |
| + |
| +void JoinThread(ThreadMainInfo* info) { |
| +#if defined(OS_POSIX) |
| + int rv = pthread_join(info->pthread, nullptr); |
| + ASSERT_EQ(0, rv) << "pthread_join"; |
|
Mark Mentovai
2015/01/08 17:06:43
I guess this should have been EXPECT_EQ all along,
scottmg
2015/01/08 17:32:07
Done.
|
| +#elif defined(OS_WIN) |
| + DWORD result = WaitForSingleObject(info->thread, INFINITE); |
| + ASSERT_EQ(WAIT_OBJECT_0, result) << "WaitForSingleObject"; |
| +#endif // OS_POSIX |
| } |
| TEST(Semaphore, Threaded) { |
| @@ -48,13 +83,11 @@ TEST(Semaphore, Threaded) { |
| info.semaphore = &semaphore; |
| info.iterations = 1; |
| - int rv = pthread_create(&info.pthread, nullptr, ThreadMain, &info); |
| - ASSERT_EQ(0, rv) << "pthread_create"; |
| + StartThread(&info); |
|
Mark Mentovai
2015/01/08 17:06:43
The assertion has moved into a subroutine, so to r
scottmg
2015/01/08 17:32:07
Done.
|
| semaphore.Signal(); |
| - rv = pthread_join(info.pthread, nullptr); |
| - ASSERT_EQ(0, rv) << "pthread_join"; |
| + JoinThread(&info); |
| } |
| TEST(Semaphore, TenThreaded) { |
| @@ -65,15 +98,12 @@ TEST(Semaphore, TenThreaded) { |
| const size_t kThreads = 10; |
| ThreadMainInfo info[kThreads]; |
| size_t iterations = 0; |
| - int rv; |
| for (size_t index = 0; index < kThreads; ++index) { |
| info[index].semaphore = &semaphore; |
| info[index].iterations = index; |
| iterations += info[index].iterations; |
| - rv = |
| - pthread_create(&info[index].pthread, nullptr, ThreadMain, &info[index]); |
| - ASSERT_EQ(0, rv) << "pthread_create"; |
| + StartThread(&info[index]); |
| } |
| for (size_t iteration = 0; iteration < iterations; ++iteration) { |
| @@ -81,8 +111,7 @@ TEST(Semaphore, TenThreaded) { |
| } |
| for (size_t index = 0; index < kThreads; ++index) { |
| - rv = pthread_join(info[index].pthread, nullptr); |
| - ASSERT_EQ(0, rv) << "pthread_join"; |
| + JoinThread(&info[index]); |
| } |
| } |