[llvm] r219638 - Removing the static destructor from ManagedStatic.cpp by controlling the allocation and de-allocation of the mutex.

Chris Bieneman beanz at apple.com
Tue Oct 14 08:38:47 PDT 2014


I'm trying to catch all MingW variants with that. Obviously it doesn't. I'm on my way into work now. I should be online in about 30 minutes and I'll see if I can sort this out.

Sorry for the breakage.

-Chris



> On Oct 14, 2014, at 6:51 AM, Iain Sandoe <iain at codesourcery.com> wrote:
> 
> Hi Chris,
> 
>> On 13 Oct 2014, at 23:37, Chris Bieneman wrote:
>> 
>> 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__)
> 
> did you mean __MINGW__ here ^  or __MINGW32__ ?
> 
>> +#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__)
> .. likewise here ^
>> +  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.
>> -  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