1ea497e4dSopenharmony_ci/*
2ea497e4dSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3ea497e4dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ea497e4dSopenharmony_ci * you may not use this file except in compliance with the License.
5ea497e4dSopenharmony_ci * You may obtain a copy of the License at
6ea497e4dSopenharmony_ci *
7ea497e4dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8ea497e4dSopenharmony_ci *
9ea497e4dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ea497e4dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ea497e4dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ea497e4dSopenharmony_ci * See the License for the specific language governing permissions and
13ea497e4dSopenharmony_ci * limitations under the License.
14ea497e4dSopenharmony_ci */
15ea497e4dSopenharmony_ci#include "thread_handler.h"
16ea497e4dSopenharmony_ci
17ea497e4dSopenharmony_ci#include <cstdint>
18ea497e4dSopenharmony_ci#include <functional>
19ea497e4dSopenharmony_ci#include <future>
20ea497e4dSopenharmony_ci#include <memory>
21ea497e4dSopenharmony_ci
22ea497e4dSopenharmony_ci#include "nocopyable.h"
23ea497e4dSopenharmony_ci#include "singleton.h"
24ea497e4dSopenharmony_ci#include "thread_pool.h"
25ea497e4dSopenharmony_ci
26ea497e4dSopenharmony_ci#include "iam_logger.h"
27ea497e4dSopenharmony_ci
28ea497e4dSopenharmony_ci#define LOG_TAG "FACE_AUTH_SA"
29ea497e4dSopenharmony_ci
30ea497e4dSopenharmony_cinamespace OHOS {
31ea497e4dSopenharmony_cinamespace UserIam {
32ea497e4dSopenharmony_cinamespace FaceAuth {
33ea497e4dSopenharmony_ciusing namespace OHOS;
34ea497e4dSopenharmony_ci
35ea497e4dSopenharmony_ciclass ThreadHandlerImpl : public ThreadHandler, public DelayedSingleton<ThreadHandlerImpl> {
36ea497e4dSopenharmony_cipublic:
37ea497e4dSopenharmony_ci    ThreadHandlerImpl();
38ea497e4dSopenharmony_ci    ~ThreadHandlerImpl() override;
39ea497e4dSopenharmony_ci    void PostTask(const Task &task) override;
40ea497e4dSopenharmony_ci    void EnsureTask(const Task &task) override;
41ea497e4dSopenharmony_ci
42ea497e4dSopenharmony_ciprivate:
43ea497e4dSopenharmony_ci    OHOS::ThreadPool pool_;
44ea497e4dSopenharmony_ci};
45ea497e4dSopenharmony_ci
46ea497e4dSopenharmony_ciThreadHandlerImpl::ThreadHandlerImpl()
47ea497e4dSopenharmony_ci{
48ea497e4dSopenharmony_ci    pool_.Start(1);
49ea497e4dSopenharmony_ci}
50ea497e4dSopenharmony_ci
51ea497e4dSopenharmony_ciThreadHandlerImpl::~ThreadHandlerImpl()
52ea497e4dSopenharmony_ci{
53ea497e4dSopenharmony_ci    pool_.Stop();
54ea497e4dSopenharmony_ci}
55ea497e4dSopenharmony_ci
56ea497e4dSopenharmony_civoid ThreadHandlerImpl::PostTask(const Task &task)
57ea497e4dSopenharmony_ci{
58ea497e4dSopenharmony_ci    pool_.AddTask(task);
59ea497e4dSopenharmony_ci}
60ea497e4dSopenharmony_ci
61ea497e4dSopenharmony_civoid ThreadHandlerImpl::EnsureTask(const Task &task)
62ea497e4dSopenharmony_ci{
63ea497e4dSopenharmony_ci    std::promise<void> ensure;
64ea497e4dSopenharmony_ci    auto callback = [&ensure]() {
65ea497e4dSopenharmony_ci        ensure.set_value();
66ea497e4dSopenharmony_ci        return;
67ea497e4dSopenharmony_ci    };
68ea497e4dSopenharmony_ci    pool_.AddTask(task);
69ea497e4dSopenharmony_ci    pool_.AddTask(callback);
70ea497e4dSopenharmony_ci    ensure.get_future().get();
71ea497e4dSopenharmony_ci}
72ea497e4dSopenharmony_ci
73ea497e4dSopenharmony_cistd::shared_ptr<ThreadHandler> ThreadHandler::GetSingleThreadInstance()
74ea497e4dSopenharmony_ci{
75ea497e4dSopenharmony_ci    return ThreadHandlerImpl::GetInstance();
76ea497e4dSopenharmony_ci}
77ea497e4dSopenharmony_ci} // namespace FaceAuth
78ea497e4dSopenharmony_ci} // namespace UserIam
79ea497e4dSopenharmony_ci} // namespace OHOS