mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Back out the thread-safe ManagedStatic for now. Too many people have too many problems with it for the moment.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71931 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -14,8 +14,6 @@
 | 
				
			|||||||
#ifndef LLVM_SUPPORT_MANAGED_STATIC_H
 | 
					#ifndef LLVM_SUPPORT_MANAGED_STATIC_H
 | 
				
			||||||
#define LLVM_SUPPORT_MANAGED_STATIC_H
 | 
					#define LLVM_SUPPORT_MANAGED_STATIC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "llvm/System/Atomic.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace llvm {
 | 
					namespace llvm {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// object_deleter - Helper method for ManagedStatic.
 | 
					/// object_deleter - Helper method for ManagedStatic.
 | 
				
			||||||
@@ -28,8 +26,6 @@ void object_deleter(void *Ptr) {
 | 
				
			|||||||
/// ManagedStaticBase - Common base class for ManagedStatic instances.
 | 
					/// ManagedStaticBase - Common base class for ManagedStatic instances.
 | 
				
			||||||
class ManagedStaticBase {
 | 
					class ManagedStaticBase {
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
  mutable sys::cas_flag InitFlag;
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  // This should only be used as a static variable, which guarantees that this
 | 
					  // This should only be used as a static variable, which guarantees that this
 | 
				
			||||||
  // will be zero initialized.
 | 
					  // will be zero initialized.
 | 
				
			||||||
  mutable void *Ptr;
 | 
					  mutable void *Ptr;
 | 
				
			||||||
@@ -51,35 +47,23 @@ public:
 | 
				
			|||||||
///
 | 
					///
 | 
				
			||||||
template<class C>
 | 
					template<class C>
 | 
				
			||||||
class ManagedStatic : public ManagedStaticBase {
 | 
					class ManagedStatic : public ManagedStaticBase {
 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
  void checkInit() {
 | 
					 | 
				
			||||||
    sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0);
 | 
					 | 
				
			||||||
    if (OldFlag == 0) {
 | 
					 | 
				
			||||||
      LazyInit();
 | 
					 | 
				
			||||||
      sys::MemoryFence();
 | 
					 | 
				
			||||||
      InitFlag = 2;
 | 
					 | 
				
			||||||
    } else if (OldFlag == 1) {
 | 
					 | 
				
			||||||
      while (InitFlag == 1) ;
 | 
					 | 
				
			||||||
      sys::MemoryFence();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Accessors.
 | 
					  // Accessors.
 | 
				
			||||||
  C &operator*() {
 | 
					  C &operator*() {
 | 
				
			||||||
    checkInit();
 | 
					    if (!Ptr) LazyInit();
 | 
				
			||||||
    return *static_cast<C*>(Ptr);
 | 
					    return *static_cast<C*>(Ptr);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  C *operator->() {
 | 
					  C *operator->() {
 | 
				
			||||||
    checkInit();
 | 
					    if (!Ptr) LazyInit();
 | 
				
			||||||
    return static_cast<C*>(Ptr);
 | 
					    return static_cast<C*>(Ptr);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  const C &operator*() const {
 | 
					  const C &operator*() const {
 | 
				
			||||||
    checkInit();
 | 
					    if (!Ptr) LazyInit();
 | 
				
			||||||
    return *static_cast<C*>(Ptr);
 | 
					    return *static_cast<C*>(Ptr);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  const C *operator->() const {
 | 
					  const C *operator->() const {
 | 
				
			||||||
    checkInit();
 | 
					    if (!Ptr) LazyInit();
 | 
				
			||||||
    return static_cast<C*>(Ptr);
 | 
					    return static_cast<C*>(Ptr);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user