mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-29 00:32:35 +08:00
win: port semaphore test
R=mark@chromium.org BUG=crashpad:1 Review URL: https://codereview.chromium.org/840933004
This commit is contained in:
parent
b1d2beb724
commit
c6bcbfb042
@ -14,7 +14,9 @@
|
|||||||
|
|
||||||
#include "util/synchronization/semaphore.h"
|
#include "util/synchronization/semaphore.h"
|
||||||
|
|
||||||
|
#if defined(OS_POSIX)
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#endif // OS_POSIX
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
@ -29,17 +31,50 @@ TEST(Semaphore, Simple) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ThreadMainInfo {
|
struct ThreadMainInfo {
|
||||||
|
#if defined(OS_POSIX)
|
||||||
pthread_t pthread;
|
pthread_t pthread;
|
||||||
|
#elif defined(OS_WIN)
|
||||||
|
HANDLE thread;
|
||||||
|
#endif
|
||||||
Semaphore* semaphore;
|
Semaphore* semaphore;
|
||||||
size_t iterations;
|
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);
|
ThreadMainInfo* info = reinterpret_cast<ThreadMainInfo*>(argument);
|
||||||
for (size_t iteration = 0; iteration < info->iterations; ++iteration) {
|
for (size_t iteration = 0; iteration < info->iterations; ++iteration) {
|
||||||
info->semaphore->Wait();
|
info->semaphore->Wait();
|
||||||
}
|
}
|
||||||
|
#if defined(OS_POSIX)
|
||||||
return nullptr;
|
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);
|
||||||
|
EXPECT_EQ(0, rv) << "pthread_join";
|
||||||
|
#elif defined(OS_WIN)
|
||||||
|
DWORD result = WaitForSingleObject(info->thread, INFINITE);
|
||||||
|
EXPECT_EQ(WAIT_OBJECT_0, result) << "WaitForSingleObject";
|
||||||
|
#endif // OS_POSIX
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Semaphore, Threaded) {
|
TEST(Semaphore, Threaded) {
|
||||||
@ -48,13 +83,11 @@ TEST(Semaphore, Threaded) {
|
|||||||
info.semaphore = &semaphore;
|
info.semaphore = &semaphore;
|
||||||
info.iterations = 1;
|
info.iterations = 1;
|
||||||
|
|
||||||
int rv = pthread_create(&info.pthread, nullptr, ThreadMain, &info);
|
ASSERT_NO_FATAL_FAILURE(StartThread(&info));
|
||||||
ASSERT_EQ(0, rv) << "pthread_create";
|
|
||||||
|
|
||||||
semaphore.Signal();
|
semaphore.Signal();
|
||||||
|
|
||||||
rv = pthread_join(info.pthread, nullptr);
|
JoinThread(&info);
|
||||||
ASSERT_EQ(0, rv) << "pthread_join";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Semaphore, TenThreaded) {
|
TEST(Semaphore, TenThreaded) {
|
||||||
@ -65,15 +98,12 @@ TEST(Semaphore, TenThreaded) {
|
|||||||
const size_t kThreads = 10;
|
const size_t kThreads = 10;
|
||||||
ThreadMainInfo info[kThreads];
|
ThreadMainInfo info[kThreads];
|
||||||
size_t iterations = 0;
|
size_t iterations = 0;
|
||||||
int rv;
|
|
||||||
for (size_t index = 0; index < kThreads; ++index) {
|
for (size_t index = 0; index < kThreads; ++index) {
|
||||||
info[index].semaphore = &semaphore;
|
info[index].semaphore = &semaphore;
|
||||||
info[index].iterations = index;
|
info[index].iterations = index;
|
||||||
iterations += info[index].iterations;
|
iterations += info[index].iterations;
|
||||||
|
|
||||||
rv =
|
ASSERT_NO_FATAL_FAILURE(StartThread(&info[index]));
|
||||||
pthread_create(&info[index].pthread, nullptr, ThreadMain, &info[index]);
|
|
||||||
ASSERT_EQ(0, rv) << "pthread_create";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t iteration = 0; iteration < iterations; ++iteration) {
|
for (size_t iteration = 0; iteration < iterations; ++iteration) {
|
||||||
@ -81,8 +111,7 @@ TEST(Semaphore, TenThreaded) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (size_t index = 0; index < kThreads; ++index) {
|
for (size_t index = 0; index < kThreads; ++index) {
|
||||||
rv = pthread_join(info[index].pthread, nullptr);
|
JoinThread(&info[index]);
|
||||||
ASSERT_EQ(0, rv) << "pthread_join";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user