Chromium Code Reviews| Index: ppapi/tests/pp_thread.h |
| diff --git a/ppapi/tests/pp_thread.h b/ppapi/tests/pp_thread.h |
| index c4af8f1bbf1094d95c06d2b4519577c23fc60d9c..bc8ce772ca0e4707018388da03874e324bfe3345 100644 |
| --- a/ppapi/tests/pp_thread.h |
| +++ b/ppapi/tests/pp_thread.h |
| @@ -33,18 +33,22 @@ |
| * used in ppapi/tests, so is not part of the published API. |
| */ |
| +typedef void (PP_ThreadFunction)(void* data); |
| + |
| #if defined(PPAPI_POSIX) |
| -typedef pthread_t PP_ThreadType; |
| +typedef pthread_t PP_Thread; |
| #elif defined(PPAPI_OS_WIN) |
| -typedef uintptr_t PP_ThreadType; |
| +struct PP_Thread { |
| + HANDLE handle; |
| + PP_ThreadFunction* thread_func; |
| + void* thread_arg; |
| +}; |
| #endif |
| -typedef void (PP_ThreadFunction)(void* data); |
| - |
| -PP_INLINE bool PP_CreateThread(PP_ThreadType* thread, |
| +PP_INLINE bool PP_CreateThread(PP_Thread* thread, |
| PP_ThreadFunction function, |
| void* thread_arg); |
| -PP_INLINE void PP_JoinThread(PP_ThreadType thread); |
| +PP_INLINE void PP_JoinThread(PP_Thread thread); |
| #if defined(PPAPI_POSIX) |
| /* Because POSIX thread functions return void* and Windows thread functions do |
| @@ -65,7 +69,7 @@ PP_INLINE void* PP_POSIXThreadFunctionThunk(void* posix_thread_arg) { |
| return NULL; |
| } |
| -PP_INLINE bool PP_CreateThread(PP_ThreadType* thread, |
| +PP_INLINE bool PP_CreateThread(PP_Thread* thread, |
| PP_ThreadFunction function, |
| void* thread_arg) { |
| PP_ThreadFunctionArgWrapper* arg_wrapper = |
| @@ -78,27 +82,39 @@ PP_INLINE bool PP_CreateThread(PP_ThreadType* thread, |
| arg_wrapper) == 0); |
| } |
| -PP_INLINE void PP_JoinThread(PP_ThreadType thread) { |
| +PP_INLINE void PP_JoinThread(PP_Thread thread) { |
| void* exit_status; |
| pthread_join(thread, &exit_status); |
| } |
| #elif defined(PPAPI_OS_WIN) |
| -typedef DWORD (PP_WindowsThreadFunction)(void* data); |
| -PP_INLINE bool PP_CreateThread(PP_ThreadType* thread, |
| +PP_INLINE unsigned __stdcall PP_WindowsThreadFunction(void* param) { |
| + PP_Thread* params = reinterpret_cast<PP_Thread*>(param); |
|
bbudge
2014/09/11 14:06:01
nit: name this 'thread'?
|
| + params->thread_func(params->thread_arg); |
| + return 0; |
| +} |
| + |
| +PP_INLINE bool PP_CreateThread(PP_Thread* thread, |
| PP_ThreadFunction function, |
| void* thread_arg) { |
| if (!thread) |
| return false; |
| - *thread = ::_beginthread(function, |
| - 0, /* Use default stack size. */ |
| - thread_arg); |
| - return (*thread != NULL); |
| + thread->thread_func = function; |
| + thread->thread_arg = thread_arg; |
| + uintptr_t raw_handle = ::_beginthreadex(NULL, |
| + 0, /* Use default stack size. */ |
| + &PP_WindowsThreadFunction, |
| + thread, |
| + 0, |
| + NULL); |
| + thread->handle = reinterpret_cast<HANDLE>(raw_handle); |
| + return (thread->handle != NULL); |
| } |
| -PP_INLINE void PP_JoinThread(PP_ThreadType thread) { |
| - ::WaitForSingleObject((HANDLE)thread, INFINITE); |
| +PP_INLINE void PP_JoinThread(PP_Thread thread) { |
| + ::WaitForSingleObject(thread.handle, INFINITE); |
| + ::CloseHandle(thread.handle); |
| } |
| #endif |