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