13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Copyright (C) 2016 Rockchip Electronics Co., Ltd. 33d0407baSopenharmony_ci * Authors: 43d0407baSopenharmony_ci * Zhiqin Wei <wzq@rock-chips.com> 53d0407baSopenharmony_ci * 63d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 73d0407baSopenharmony_ci * you may not use this file except in compliance with the License. 83d0407baSopenharmony_ci * You may obtain a copy of the License at 93d0407baSopenharmony_ci * 103d0407baSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 113d0407baSopenharmony_ci * 123d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 133d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 143d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153d0407baSopenharmony_ci * See the License for the specific language governing permissions and 163d0407baSopenharmony_ci * limitations under the License. 173d0407baSopenharmony_ci */ 183d0407baSopenharmony_ci 193d0407baSopenharmony_ci#ifndef _LIBS_RGA_SINGLETON_H 203d0407baSopenharmony_ci#define _LIBS_RGA_SINGLETON_H 213d0407baSopenharmony_ci 223d0407baSopenharmony_ci#include "RgaMutex.h" 233d0407baSopenharmony_ci 243d0407baSopenharmony_ci#if defined(__clang__) 253d0407baSopenharmony_ci#pragma clang diagnostic push 263d0407baSopenharmony_ci#pragma clang diagnostic ignored "-Wundefined-var-template" 273d0407baSopenharmony_ci#endif 283d0407baSopenharmony_ci 293d0407baSopenharmony_citemplate <typename TYPE> class RgaSingleton { 303d0407baSopenharmony_cipublic: 313d0407baSopenharmony_ci static TYPE& getInstance() 323d0407baSopenharmony_ci { 333d0407baSopenharmony_ci RgaMutex::Autolock _l(sLock); 343d0407baSopenharmony_ci TYPE *instance = sInstance; 353d0407baSopenharmony_ci if (instance == nullptr) { 363d0407baSopenharmony_ci instance = new TYPE(); 373d0407baSopenharmony_ci sInstance = instance; 383d0407baSopenharmony_ci } 393d0407baSopenharmony_ci return *instance; 403d0407baSopenharmony_ci } 413d0407baSopenharmony_ci static bool hasInstance() 423d0407baSopenharmony_ci { 433d0407baSopenharmony_ci RgaMutex::Autolock _l(sLock); 443d0407baSopenharmony_ci return sInstance != nullptr; 453d0407baSopenharmony_ci } 463d0407baSopenharmony_ci 473d0407baSopenharmony_ciprotected: 483d0407baSopenharmony_ci ~RgaSingleton() 493d0407baSopenharmony_ci { 503d0407baSopenharmony_ci } 513d0407baSopenharmony_ci RgaSingleton() 523d0407baSopenharmony_ci { 533d0407baSopenharmony_ci } 543d0407baSopenharmony_ci 553d0407baSopenharmony_ciprivate: 563d0407baSopenharmony_ci RgaSingleton(const RgaSingleton &); 573d0407baSopenharmony_ci RgaSingleton &operator=(const RgaSingleton &); 583d0407baSopenharmony_ci static RgaMutex sLock; 593d0407baSopenharmony_ci static TYPE *sInstance; 603d0407baSopenharmony_ci}; 613d0407baSopenharmony_ci 623d0407baSopenharmony_ci#if defined(__clang__) 633d0407baSopenharmony_ci#pragma clang diagnostic pop 643d0407baSopenharmony_ci#endif 653d0407baSopenharmony_ci 663d0407baSopenharmony_ci#define RGA_SINGLETON_STATIC_INSTANCE(TYPE) \ 673d0407baSopenharmony_ci do { \ 683d0407baSopenharmony_ci template <>::RgaMutex(::RgaSingleton<TYPE>::sLock)(::RgaMutex::PRIVATE); \ 693d0407baSopenharmony_ci template <> TYPE * ::RgaSingleton<TYPE>::sInstance(nullptr); /* NOLINT */ \ 703d0407baSopenharmony_ci template class ::RgaSingleton<TYPE>; \ 713d0407baSopenharmony_ci } while (0) 723d0407baSopenharmony_ci 733d0407baSopenharmony_ci#endif // _LIBS_RGA_SINGLETON_H 74