| Index: ppapi/tests/pp_thread.h
|
| diff --git a/ppapi/tests/pp_thread.h b/ppapi/tests/pp_thread.h
|
| index c4af8f1bbf1094d95c06d2b4519577c23fc60d9c..c80ffa1862305d41a93791629515f51c23cf2398 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* thread = reinterpret_cast<PP_Thread*>(param);
|
| + thread->thread_func(thread->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
|
|
|