142103316Sopenharmony_ci/* 242103316Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 342103316Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 442103316Sopenharmony_ci * you may not use this file except in compliance with the License. 542103316Sopenharmony_ci * You may obtain a copy of the License at 642103316Sopenharmony_ci * 742103316Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 842103316Sopenharmony_ci * 942103316Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1042103316Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1142103316Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1242103316Sopenharmony_ci * See the License for the specific language governing permissions and 1342103316Sopenharmony_ci * limitations under the License. 1442103316Sopenharmony_ci */ 1542103316Sopenharmony_ci 1642103316Sopenharmony_ci#ifndef DELAYED_SP_SINGLETON_H 1742103316Sopenharmony_ci#define DELAYED_SP_SINGLETON_H 1842103316Sopenharmony_ci 1942103316Sopenharmony_ci#include <memory> 2042103316Sopenharmony_ci#include <mutex> 2142103316Sopenharmony_ci#include <refbase.h> 2242103316Sopenharmony_ci#include "nocopyable.h" 2342103316Sopenharmony_ci#include "hilog_wrapper.h" 2442103316Sopenharmony_ci 2542103316Sopenharmony_cinamespace OHOS { 2642103316Sopenharmony_cinamespace USB { 2742103316Sopenharmony_ci#define DECLARE_DELAYED_SP_SINGLETON(MyClass) \ 2842103316Sopenharmony_cipublic: \ 2942103316Sopenharmony_ci ~MyClass(); \ 3042103316Sopenharmony_ci \ 3142103316Sopenharmony_ciprivate: \ 3242103316Sopenharmony_ci friend DelayedSpSingleton<MyClass>; \ 3342103316Sopenharmony_ci MyClass() 3442103316Sopenharmony_ci 3542103316Sopenharmony_citemplate <typename T> class DelayedSpSingleton : public NoCopyable { 3642103316Sopenharmony_cipublic: 3742103316Sopenharmony_ci static sptr<T> GetInstance(); 3842103316Sopenharmony_ci static void DestroyInstance(); 3942103316Sopenharmony_ci 4042103316Sopenharmony_ciprivate: 4142103316Sopenharmony_ci static sptr<T> instance_; 4242103316Sopenharmony_ci static std::mutex mutex_; 4342103316Sopenharmony_ci}; 4442103316Sopenharmony_ci 4542103316Sopenharmony_citemplate <typename T> sptr<T> DelayedSpSingleton<T>::instance_ = nullptr; 4642103316Sopenharmony_ci 4742103316Sopenharmony_citemplate <typename T> std::mutex DelayedSpSingleton<T>::mutex_; 4842103316Sopenharmony_ci 4942103316Sopenharmony_citemplate <typename T> sptr<T> DelayedSpSingleton<T>::GetInstance() 5042103316Sopenharmony_ci{ 5142103316Sopenharmony_ci if (instance_ != nullptr) { 5242103316Sopenharmony_ci return instance_; 5342103316Sopenharmony_ci } 5442103316Sopenharmony_ci 5542103316Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 5642103316Sopenharmony_ci if (instance_ == nullptr) { 5742103316Sopenharmony_ci instance_ = new(std::nothrow) T(); 5842103316Sopenharmony_ci if (instance_ == nullptr) { 5942103316Sopenharmony_ci USB_HILOGI(MODULE_USB_SERVICE, "get instance failed\n"); 6042103316Sopenharmony_ci } 6142103316Sopenharmony_ci } 6242103316Sopenharmony_ci 6342103316Sopenharmony_ci return instance_; 6442103316Sopenharmony_ci} 6542103316Sopenharmony_ci 6642103316Sopenharmony_citemplate <typename T> void DelayedSpSingleton<T>::DestroyInstance() 6742103316Sopenharmony_ci{ 6842103316Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 6942103316Sopenharmony_ci if (instance_) { 7042103316Sopenharmony_ci instance_.clear(); 7142103316Sopenharmony_ci instance_ = nullptr; 7242103316Sopenharmony_ci } 7342103316Sopenharmony_ci} 7442103316Sopenharmony_ci} // namespace USB 7542103316Sopenharmony_ci} // namespace OHOS 7642103316Sopenharmony_ci#endif // DELAYED_SP_SINGLETON_H 77