summaryrefslogtreecommitdiffstats
path: root/libutils/include/utils/Singleton.h
diff options
context:
space:
mode:
authorVijay Venkatraman <vijaykv@google.com>2017-01-26 02:03:45 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-01-26 02:03:45 +0000
commita040114bcba4b202a289a6e8fafd808f779f865c (patch)
treedadf435a27ba8b3ac32996e39af86a6353c67396 /libutils/include/utils/Singleton.h
parenta867efaed83fb3dab038e3fbe0cf608407678cb0 (diff)
parent5a8f555e493803f4bff4a402d36d11b5cd81498f (diff)
downloadsystem_core-a040114bcba4b202a289a6e8fafd808f779f865c.tar.gz
system_core-a040114bcba4b202a289a6e8fafd808f779f865c.tar.bz2
system_core-a040114bcba4b202a289a6e8fafd808f779f865c.zip
Merge "Exporting C++ headers from system/core" am: 812b7d5d52 am: f484dd3401 am: a252f11da3
am: 5a8f555e49 Change-Id: Id449aadc3b9e6e263d351ce031b1f7f7bb4672b8
Diffstat (limited to 'libutils/include/utils/Singleton.h')
-rw-r--r--libutils/include/utils/Singleton.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/libutils/include/utils/Singleton.h b/libutils/include/utils/Singleton.h
new file mode 100644
index 000000000..7cc4c18be
--- /dev/null
+++ b/libutils/include/utils/Singleton.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_UTILS_SINGLETON_H
+#define ANDROID_UTILS_SINGLETON_H
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <utils/Mutex.h>
+#include <utils/threads.h>
+#include <cutils/compiler.h>
+
+namespace android {
+// ---------------------------------------------------------------------------
+
+template <typename TYPE>
+class ANDROID_API Singleton
+{
+public:
+ static TYPE& getInstance() {
+ Mutex::Autolock _l(sLock);
+ TYPE* instance = sInstance;
+ if (instance == 0) {
+ instance = new TYPE();
+ sInstance = instance;
+ }
+ return *instance;
+ }
+
+ static bool hasInstance() {
+ Mutex::Autolock _l(sLock);
+ return sInstance != 0;
+ }
+
+protected:
+ ~Singleton() { }
+ Singleton() { }
+
+private:
+ Singleton(const Singleton&);
+ Singleton& operator = (const Singleton&);
+ static Mutex sLock;
+ static TYPE* sInstance;
+};
+
+template <typename TYPE>
+Mutex Singleton<TYPE>::sLock;
+
+template <typename TYPE>
+TYPE* Singleton<TYPE>::sInstance;
+
+/*
+ * use ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) in your implementation file
+ * (eg: <TYPE>.cpp) to create the static instance of Singleton<>'s attributes,
+ * and avoid to have a copy of them in each compilation units Singleton<TYPE>
+ * is used.
+ * NOTE: we use a version of Mutex ctor that takes a parameter, because
+ * for some unknown reason using the default ctor doesn't emit the variable!
+ */
+
+#define ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) \
+ template<> ::android::Mutex \
+ (::android::Singleton< TYPE >::sLock)(::android::Mutex::PRIVATE); \
+ template<> TYPE* ::android::Singleton< TYPE >::sInstance(0); \
+ template class ::android::Singleton< TYPE >;
+
+
+// ---------------------------------------------------------------------------
+}; // namespace android
+
+#endif // ANDROID_UTILS_SINGLETON_H
+