From 0df98b68211439c0d883de38bfaffdf619d408cc Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Mon, 13 Oct 2014 23:03:45 +0000 Subject: [PATCH] Updating documentation as per Chandler's feedback. 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 --- include/llvm/Support/Threading.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/include/llvm/Support/Threading.h b/include/llvm/Support/Threading.h index 247c49c34e4..343acda8f84 100644 --- a/include/llvm/Support/Threading.h +++ b/include/llvm/Support/Threading.h @@ -38,12 +38,25 @@ namespace llvm { 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() in the same or different +/// locations, foo will only be called once. +/// +/// Typical usage: +/// \code +/// void foo() {...}; +/// ... +/// llvm_call_once(); +/// \endcode +/// +/// \param UserFn Function to call once. template void llvm_call_once() { - #if !defined(__MINGW__) static std::once_flag flag; std::call_once(flag, UserFn); - #else struct InitOnceWrapper { InitOnceWrapper() { UserFn(); }