This goes with the earlier commit to remove the static destructor from ManagedStatic.cpp by controlling the allocation and de-allocation of the mutex.
Summary: This is part of the ongoing work to remove static constructors and destructors.
Reviewers: chandlerc, rnk
Reviewed By: rnk
Subscribers: rnk, llvm-commits
Differential Revision: http://reviews.llvm.org/D5473
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219640
91177308-0d34-0410-b5e6-
96231b3b80d8
void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData,
unsigned RequestedStackSize = 0);
void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData,
unsigned RequestedStackSize = 0);
+/// \brief Execute the function specified as a template parameter once.
+///
+/// Calls \p UserFn once ever. The call uniqueness is based on the address of
+/// the function passed in via the template arguement. This means no matter how
+/// many times you call llvm_call_once<foo>() in the same or different
+/// locations, foo will only be called once.
+///
+/// Typical usage:
+/// \code
+/// void foo() {...};
+/// ...
+/// llvm_call_once<foo>();
+/// \endcode
+///
+/// \param UserFn Function to call once.
template <void (*UserFn)(void)> void llvm_call_once() {
template <void (*UserFn)(void)> void llvm_call_once() {
#if !defined(__MINGW__)
static std::once_flag flag;
std::call_once(flag, UserFn);
#if !defined(__MINGW__)
static std::once_flag flag;
std::call_once(flag, UserFn);
#else
struct InitOnceWrapper {
InitOnceWrapper() { UserFn(); }
#else
struct InitOnceWrapper {
InitOnceWrapper() { UserFn(); }