Add Win32 support to llvm::llvm_execute_on_thread(). Thanks to Aaron Ballman!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140011 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
NAKAMURA Takumi 2011-09-19 07:41:43 +00:00
parent 0a3eb60952
commit 92ec8e1427

View File

@ -102,11 +102,42 @@ void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,
error:
::pthread_attr_destroy(&Attr);
}
#elif defined(LLVM_MULTITHREADED) && defined(LLVM_ON_WIN32)
#include "Windows/Windows.h"
#include <process.h>
struct ThreadInfo {
void (*func)(void*);
void *param;
};
static unsigned __stdcall ThreadCallback(void *param) {
struct ThreadInfo *info = reinterpret_cast<struct ThreadInfo *>(param);
info->func(info->param);
return 0;
}
void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,
unsigned RequestedStackSize) {
struct ThreadInfo param = { Fn, UserData };
HANDLE hThread = (HANDLE)::_beginthreadex(NULL,
RequestedStackSize, ThreadCallback,
&param, 0, NULL);
if (hThread) {
// We actually don't care whether the wait succeeds or fails, in
// the same way we don't care whether the pthread_join call succeeds
// or fails. There's not much we could do if this were to fail. But
// on success, this call will wait until the thread finishes executing
// before returning.
(void)::WaitForSingleObject(hThread, INFINITE);
::CloseHandle(hThread);
}
}
#else
// No non-pthread implementation, currently.
// Support for non-Win32, non-pthread implementation.
void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,
unsigned RequestedStackSize) {
(void) RequestedStackSize;