1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci#ifndef TASK_FACTORY_HPP
17484543d1Sopenharmony_ci#define TASK_FACTORY_HPP
18484543d1Sopenharmony_ci
19484543d1Sopenharmony_ci#include "tm/cpu_task.h"
20484543d1Sopenharmony_ci#include "util/cb_func.h"
21484543d1Sopenharmony_ci
22484543d1Sopenharmony_cinamespace ffrt {
23484543d1Sopenharmony_ci
24484543d1Sopenharmony_ciclass TaskFactory {
25484543d1Sopenharmony_cipublic:
26484543d1Sopenharmony_ci    static TaskFactory &Instance();
27484543d1Sopenharmony_ci
28484543d1Sopenharmony_ci    static CPUEUTask *Alloc()
29484543d1Sopenharmony_ci    {
30484543d1Sopenharmony_ci        return Instance().alloc_();
31484543d1Sopenharmony_ci    }
32484543d1Sopenharmony_ci
33484543d1Sopenharmony_ci    static void Free(CPUEUTask *task)
34484543d1Sopenharmony_ci    {
35484543d1Sopenharmony_ci        Instance().free_(task);
36484543d1Sopenharmony_ci    }
37484543d1Sopenharmony_ci
38484543d1Sopenharmony_ci    static std::vector<void *> GetUnfreedMem()
39484543d1Sopenharmony_ci    {
40484543d1Sopenharmony_ci        if (Instance().getUnfreedMem_ != nullptr) {
41484543d1Sopenharmony_ci            return Instance().getUnfreedMem_();
42484543d1Sopenharmony_ci        }
43484543d1Sopenharmony_ci        return {};
44484543d1Sopenharmony_ci    }
45484543d1Sopenharmony_ci
46484543d1Sopenharmony_ci    static void LockMem()
47484543d1Sopenharmony_ci    {
48484543d1Sopenharmony_ci        return Instance().lockMem_();
49484543d1Sopenharmony_ci    }
50484543d1Sopenharmony_ci    static void UnlockMem()
51484543d1Sopenharmony_ci    {
52484543d1Sopenharmony_ci        return Instance().unlockMem_();
53484543d1Sopenharmony_ci    }
54484543d1Sopenharmony_ci
55484543d1Sopenharmony_ci    static void RegistCb(TaskAllocCB<CPUEUTask>::Alloc &&alloc, TaskAllocCB<CPUEUTask>::Free &&free,
56484543d1Sopenharmony_ci        TaskAllocCB<CPUEUTask>::GetUnfreedMem &&getUnfreedMem = nullptr,
57484543d1Sopenharmony_ci        TaskAllocCB<CPUEUTask>::LockMem &&lockMem = nullptr,
58484543d1Sopenharmony_ci        TaskAllocCB<CPUEUTask>::UnlockMem &&unlockMem = nullptr)
59484543d1Sopenharmony_ci    {
60484543d1Sopenharmony_ci        Instance().alloc_ = std::move(alloc);
61484543d1Sopenharmony_ci        Instance().free_ = std::move(free);
62484543d1Sopenharmony_ci        Instance().getUnfreedMem_ = std::move(getUnfreedMem);
63484543d1Sopenharmony_ci        Instance().lockMem_ = std::move(lockMem);
64484543d1Sopenharmony_ci        Instance().unlockMem_ = std::move(unlockMem);
65484543d1Sopenharmony_ci    }
66484543d1Sopenharmony_ci
67484543d1Sopenharmony_ciprivate:
68484543d1Sopenharmony_ci    TaskAllocCB<CPUEUTask>::Free free_;
69484543d1Sopenharmony_ci    TaskAllocCB<CPUEUTask>::Alloc alloc_;
70484543d1Sopenharmony_ci    TaskAllocCB<CPUEUTask>::GetUnfreedMem getUnfreedMem_;
71484543d1Sopenharmony_ci    TaskAllocCB<CPUEUTask>::LockMem lockMem_;
72484543d1Sopenharmony_ci    TaskAllocCB<CPUEUTask>::UnlockMem unlockMem_;
73484543d1Sopenharmony_ci};
74484543d1Sopenharmony_ci
75484543d1Sopenharmony_ci} // namespace ffrt
76484543d1Sopenharmony_ci
77484543d1Sopenharmony_ci#endif