Removing the static initializer in ManagedStatic.cpp by using llvm_call_once to initi...
[oota-llvm.git] / include / llvm / Support / Threading.h
index 7e8758407c7cb8d0abd4360858bf7f9bc4ccc337..d6d6da61f9efb35c4da5fb88348aa4bad950e01f 100644 (file)
 #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 <mutex>
+#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