[llvm] r219638 - Removing the static destructor from ManagedStatic.cpp by controlling the allocation and de-allocation of the mutex.
Justin Bogner
mail at justinbogner.com
Tue Oct 14 00:05:42 PDT 2014
Chris Bieneman <beanz at apple.com> writes:
> Author: cbieneman
> Date: Mon Oct 13 17:37:25 2014
> New Revision: 219638
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219638&view=rev
> Log:
> Removing the static destructor from ManagedStatic.cpp by controlling
> the allocation and de-allocation of the mutex.
>
> This patch adds a new llvm_call_once function which is used by the
> ManagedStatic implementation to safely initialize a global to avoid
> static construction and destruction.
>
> Modified:
> llvm/trunk/include/llvm/Support/Threading.h
> llvm/trunk/lib/Support/ManagedStatic.cpp
>
> Modified: llvm/trunk/include/llvm/Support/Threading.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=219638&r1=219637&r2=219638&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Threading.h (original)
> +++ llvm/trunk/include/llvm/Support/Threading.h Mon Oct 13 17:37:25 2014
> @@ -15,6 +15,10 @@
> #ifndef LLVM_SUPPORT_THREADING_H
> #define LLVM_SUPPORT_THREADING_H
>
> +#if !defined(__MINGW__)
> +#include <mutex>
> +#endif
> +
> namespace llvm {
> /// Returns true if LLVM is compiled with support for multi-threading, and
> /// false otherwise.
> @@ -33,6 +37,20 @@ namespace llvm {
> /// the thread stack.
> void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData,
> unsigned RequestedStackSize = 0);
> +
> +template <void (*UserFn)(void)> void llvm_call_once() {
> +
> +#if !defined(__MINGW__)
> + static std::once_flag flag;
> + std::call_once(flag, UserFn);
> +
> +#else
> + struct InitOnceWrapper {
> + InitOnceWrapper() { UserFn(); }
> + };
> + static InitOnceWrapper InitOnceVar;
> +#endif
> +}
> }
>
> #endif
>
> Modified: llvm/trunk/lib/Support/ManagedStatic.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ManagedStatic.cpp?rev=219638&r1=219637&r2=219638&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/ManagedStatic.cpp (original)
> +++ llvm/trunk/lib/Support/ManagedStatic.cpp Mon Oct 13 17:37:25 2014
> @@ -16,16 +16,22 @@
> #include "llvm/Support/Atomic.h"
> #include "llvm/Support/Mutex.h"
> #include "llvm/Support/MutexGuard.h"
> +#include "llvm/Support/Threading.h"
> #include <cassert>
> using namespace llvm;
>
> static const ManagedStaticBase *StaticList = nullptr;
> +static sys::Mutex *ManagedStaticMutex = nullptr;
>
> -static sys::Mutex& getManagedStaticMutex() {
> +static void initializeMutex() {
> + ManagedStaticMutex = new sys::Mutex();
> +}
> +
> +static sys::Mutex* getManagedStaticMutex() {
> // We need to use a function local static here, since this can get called
> // during a static constructor and we need to guarantee that it's initialized
> // correctly.
This comment's gone stale.
> - static sys::Mutex ManagedStaticMutex;
> + llvm_call_once<initializeMutex>();
> return ManagedStaticMutex;
> }
>
> @@ -33,7 +39,7 @@ void ManagedStaticBase::RegisterManagedS
> void (*Deleter)(void*)) const {
> assert(Creator);
> if (llvm_is_multithreaded()) {
> - MutexGuard Lock(getManagedStaticMutex());
> + MutexGuard Lock(*getManagedStaticMutex());
>
> if (!Ptr) {
> void* tmp = Creator();
> @@ -83,8 +89,13 @@ void ManagedStaticBase::destroy() const
>
> /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables.
> void llvm::llvm_shutdown() {
> - MutexGuard Lock(getManagedStaticMutex());
> + {
> + MutexGuard Lock(*getManagedStaticMutex());
> +
> + while (StaticList)
> + StaticList->destroy();
> + }
>
> - while (StaticList)
> - StaticList->destroy();
> + delete ManagedStaticMutex;
> + ManagedStaticMutex = nullptr;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list