X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FThreading.h;h=d6d6da61f9efb35c4da5fb88348aa4bad950e01f;hp=7e8758407c7cb8d0abd4360858bf7f9bc4ccc337;hb=8744520b533617fbbd55ef12ea936961f5225cf5;hpb=76ebe3d35c5af5f9a0ed44deee53bbe7add06993 diff --git a/include/llvm/Support/Threading.h b/include/llvm/Support/Threading.h index 7e8758407c7..d6d6da61f9e 100644 --- a/include/llvm/Support/Threading.h +++ b/include/llvm/Support/Threading.h @@ -15,6 +15,14 @@ #ifndef LLVM_SUPPORT_THREADING_H #define LLVM_SUPPORT_THREADING_H +#include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX + +#if defined(LLVM_ON_UNIX) +#include +#else +#include "llvm/Support/Atomic.h" +#endif + namespace llvm { /// Returns true if LLVM is compiled with support for multi-threading, and /// false otherwise. @@ -33,6 +41,35 @@ namespace llvm { /// the thread stack. void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData, unsigned RequestedStackSize = 0); + +#if defined(LLVM_ON_UNIX) +typedef std::once_flag once_flag; +#define LLVM_DEFINE_ONCE_FLAG(flag) static once_flag flag +#else +enum InitStatus { + Done = -1, + Uninitialized = 0, + Wait = 1 +}; +typedef volatile sys::cas_flag once_flag; + +#define LLVM_DEFINE_ONCE_FLAG(flag) static once_flag flag = Uninitialized +#endif + +/// \brief Execute the function specified as a parameter once. +/// +/// Typical usage: +/// \code +/// void foo() {...}; +/// ... +/// LLVM_DEFINE_ONCE_FLAG(flag); +/// call_once(flag, foo); +/// \endcode +/// +/// \param flag Flag used for tracking whether or not this has run. +/// \param UserFn Function to call once. +void call_once(once_flag&, void (*)(void)); + } #endif