static T& instance() { T * tmp = pInstance_.load(std::memory_order_acquire); if (tmp == nullptr) { std::lock_guard<std::mutex> lock(mutex_); tmp = pInstance_.load(std::memory_order_relaxed); if (tmp == nullptr) { if (destroyed_) { destroyed_ = false; onDeadReference(); } else { tmp = CreatePolicy<T>::create(); pInstance_.store(tmp, std::memory_order_release); #ifndef MAPNIK_NO_ATEXIT // register destruction std::atexit(&DestroySingleton); #endif } } } return *tmp; }
static T& instance() { if (! pInstance_) { #ifdef MAPNIK_THREADSAFE mapnik::scoped_lock lock(mutex_); #endif if (! pInstance_) { if (destroyed_) { destroyed_ = false; onDeadReference(); } else { pInstance_ = CreatePolicy<T>::create(); // register destruction std::atexit(&DestroySingleton); } } } return *pInstance_; }
PhoenixSingleton* getInstance() { if(!pInstance_) { if(isDestroyed_) onDeadReference(); } else createInstance(); return pInstance_; }