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> 303d0407baSopenharmony_ciclass RgaSingleton { 313d0407baSopenharmony_cipublic: 323d0407baSopenharmony_ci static TYPE& getInstance() 333d0407baSopenharmony_ci { 343d0407baSopenharmony_ci Mutex::Autolock _l(sLock); 353d0407baSopenharmony_ci TYPE* instance = sInstance; 363d0407baSopenharmony_ci if (instance == nullptr) { 373d0407baSopenharmony_ci instance = new TYPE(); 383d0407baSopenharmony_ci sInstance = instance; 393d0407baSopenharmony_ci } 403d0407baSopenharmony_ci return *instance; 413d0407baSopenharmony_ci } 423d0407baSopenharmony_ci static bool hasInstance() 433d0407baSopenharmony_ci { 443d0407baSopenharmony_ci Mutex::Autolock _l(sLock); 453d0407baSopenharmony_ci return sInstance != nullptr; 463d0407baSopenharmony_ci } 473d0407baSopenharmony_ci 483d0407baSopenharmony_ciprotected: 493d0407baSopenharmony_ci ~RgaSingleton() { } 503d0407baSopenharmony_ci RgaSingleton() { } 513d0407baSopenharmony_ci 523d0407baSopenharmony_ciprivate: 533d0407baSopenharmony_ci RgaSingleton(const RgaSingleton&); 543d0407baSopenharmony_ci RgaSingleton& operator = (const RgaSingleton&); 553d0407baSopenharmony_ci static Mutex sLock; 563d0407baSopenharmony_ci static TYPE* sInstance; 573d0407baSopenharmony_ci}; 583d0407baSopenharmony_ci 593d0407baSopenharmony_ci#if defined(__clang__) 603d0407baSopenharmony_ci#pragma clang diagnostic pop 613d0407baSopenharmony_ci#endif 623d0407baSopenharmony_ci 633d0407baSopenharmony_ci#define RGA_SINGLETON_STATIC_INSTANCE(TYPE) do { \ 643d0407baSopenharmony_ci template<> ::RgaMutex \ 653d0407baSopenharmony_ci (::RgaSingleton< TYPE >::sLock)(::RgaMutex::PRIVATE); \ 663d0407baSopenharmony_ci template<> TYPE* ::RgaSingleton< TYPE >::sInstance(nullptr); /* NOLINT */ \ 673d0407baSopenharmony_ci template class ::RgaSingleton< TYPE >; \ 683d0407baSopenharmony_ci} while (0) 693d0407baSopenharmony_ci 703d0407baSopenharmony_ci#endif // _LIBS_RGA_SINGLETON_H 71