From 92ec8e1427e595d540f2238c7a1bb05fbd013013 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Mon, 19 Sep 2011 07:41:43 +0000 Subject: [PATCH] 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 --- lib/Support/Threading.cpp | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/Support/Threading.cpp b/lib/Support/Threading.cpp index 29579567ac6..bf432a9af71 100644 --- a/lib/Support/Threading.cpp +++ b/lib/Support/Threading.cpp @@ -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 +struct ThreadInfo { + void (*func)(void*); + void *param; +}; + +static unsigned __stdcall ThreadCallback(void *param) { + struct ThreadInfo *info = reinterpret_cast(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, + ¶m, 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;