1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_UTILS_SINGLETON_H 18 #define ANDROID_UTILS_SINGLETON_H 19 20 #include <stdint.h> 21 22 // some vendor code assumes they have atoi() after including this file. 23 #include <stdlib.h> 24 25 #include <sys/types.h> 26 #include <utils/Mutex.h> 27 #include <cutils/compiler.h> 28 29 namespace android { 30 // --------------------------------------------------------------------------- 31 32 // Singleton<TYPE> may be used in multiple libraries, only one of which should 33 // define the static member variables using ANDROID_SINGLETON_STATIC_INSTANCE. 34 // Turn off -Wundefined-var-template so other users don't get: 35 // instantiation of variable 'android::Singleton<TYPE>::sLock' required here, 36 // but no definition is available 37 #if defined(__clang__) 38 #pragma clang diagnostic push 39 #pragma clang diagnostic ignored "-Wundefined-var-template" 40 #endif 41 42 template <typename TYPE> 43 class ANDROID_API Singleton 44 { 45 public: getInstance()46 static TYPE& getInstance() { 47 Mutex::Autolock _l(sLock); 48 TYPE* instance = sInstance; 49 if (instance == 0) { 50 instance = new TYPE(); 51 sInstance = instance; 52 } 53 return *instance; 54 } 55 hasInstance()56 static bool hasInstance() { 57 Mutex::Autolock _l(sLock); 58 return sInstance != 0; 59 } 60 61 protected: ~Singleton()62 ~Singleton() { } Singleton()63 Singleton() { } 64 65 private: 66 Singleton(const Singleton&); 67 Singleton& operator = (const Singleton&); 68 static Mutex sLock; 69 static TYPE* sInstance; 70 }; 71 72 #if defined(__clang__) 73 #pragma clang diagnostic pop 74 #endif 75 76 /* 77 * use ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) in your implementation file 78 * (eg: <TYPE>.cpp) to create the static instance of Singleton<>'s attributes, 79 * and avoid to have a copy of them in each compilation units Singleton<TYPE> 80 * is used. 81 * NOTE: we use a version of Mutex ctor that takes a parameter, because 82 * for some unknown reason using the default ctor doesn't emit the variable! 83 */ 84 85 #define ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) \ 86 template<> ::android::Mutex \ 87 (::android::Singleton< TYPE >::sLock)(::android::Mutex::PRIVATE); \ 88 template<> TYPE* ::android::Singleton< TYPE >::sInstance(0); \ 89 template class ::android::Singleton< TYPE >; 90 91 92 // --------------------------------------------------------------------------- 93 }; // namespace android 94 95 #endif // ANDROID_UTILS_SINGLETON_H 96 97