diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 | 
| commit | 30815c536baacc07e925f0aef23a5395883173dc (patch) | |
| tree | 2cbcf22585e99f8a87d12d5ff94f392c0d266819 /lib/Support/Threading.cpp | |
| parent | 411bd29eea3c360d5b48a18a17b5e87f5671af0e (diff) | |
Notes
Diffstat (limited to 'lib/Support/Threading.cpp')
| -rw-r--r-- | lib/Support/Threading.cpp | 41 | 
1 files changed, 36 insertions, 5 deletions
| diff --git a/lib/Support/Threading.cpp b/lib/Support/Threading.cpp index 29579567ac6c..8f0bb93eb4d1 100644 --- a/lib/Support/Threading.cpp +++ b/lib/Support/Threading.cpp @@ -24,7 +24,7 @@ static bool multithreaded_mode = false;  static sys::Mutex* global_lock = 0;  bool llvm::llvm_start_multithreaded() { -#ifdef LLVM_MULTITHREADED +#if ENABLE_THREADS != 0    assert(!multithreaded_mode && "Already multithreaded!");    multithreaded_mode = true;    global_lock = new sys::Mutex(true); @@ -39,7 +39,7 @@ bool llvm::llvm_start_multithreaded() {  }  void llvm::llvm_stop_multithreaded() { -#ifdef LLVM_MULTITHREADED +#if ENABLE_THREADS != 0    assert(multithreaded_mode && "Not currently multithreaded!");    // We fence here to insure that all threaded operations are complete BEFORE we @@ -63,7 +63,7 @@ void llvm::llvm_release_global_lock() {    if (multithreaded_mode) global_lock->release();  } -#if defined(LLVM_MULTITHREADED) && defined(HAVE_PTHREAD_H) +#if ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)  #include <pthread.h>  struct ThreadInfo { @@ -102,13 +102,44 @@ void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,   error:    ::pthread_attr_destroy(&Attr);  } +#elif ENABLE_THREADS!=0 && defined(LLVM_ON_WIN32) +#include "Windows/Windows.h" +#include <process.h> -#else +struct ThreadInfo { +  void (*func)(void*); +  void *param; +}; -// No non-pthread implementation, currently. +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, +                                            ¶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 +// Support for non-Win32, non-pthread implementation. +void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData, +                                  unsigned RequestedStackSize) {    (void) RequestedStackSize;    Fn(UserData);  } | 
