diff options
author | Owen Anderson <resistor@mac.com> | 2009-05-15 08:22:07 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-05-15 08:22:07 +0000 |
commit | 0e4b4929fc356bec7a757d9550820cfe86aebca7 (patch) | |
tree | f90e6ff0f7744cf709efa90babdf1303d53c4674 /llvm | |
parent | 2e38cb19a4400c4f7028fe049b8c48544ffce145 (diff) | |
download | bcm5719-llvm-0e4b4929fc356bec7a757d9550820cfe86aebca7.tar.gz bcm5719-llvm-0e4b4929fc356bec7a757d9550820cfe86aebca7.zip |
Factor out some common code, fix more typoes, and add a memory fence that might be needed.
llvm-svn: 71853
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/Support/ManagedStatic.h | 46 |
1 files changed, 15 insertions, 31 deletions
diff --git a/llvm/include/llvm/Support/ManagedStatic.h b/llvm/include/llvm/Support/ManagedStatic.h index c1ff0fef935..a504be31d8a 100644 --- a/llvm/include/llvm/Support/ManagedStatic.h +++ b/llvm/include/llvm/Support/ManagedStatic.h @@ -51,51 +51,35 @@ public: /// template<class C> class ManagedStatic : public ManagedStaticBase { -public: - - // Accessors. - C &operator*() { +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 (OldFlag == 1) ; - + } else if (OldFlag == 1) { + while (InitFlag == 1) ; + sys::MemoryFence(); + } + } +public: + + // Accessors. + C &operator*() { + checkInit(); return *static_cast<C*>(Ptr); } C *operator->() { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (OldFlag == 1) ; - + checkInit(); return static_cast<C*>(Ptr); } const C &operator*() const { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (InitFlag == 1) ; - + checkInit(); return *static_cast<C*>(Ptr); } const C *operator->() const { - sys::cas_flag OldFlag = sys::CompareAndSwap(&InitFlag, 1, 0); - if (OldFlag == 0) { - LazyInit(); - sys::MemoryFence(); - InitFlag = 2; - } else if (OldFlag == 1) - while (OldFlag == 1) ; - + checkInit(); return static_cast<C*>(Ptr); } |