1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <dlfcn.h>
16 #include "sched/task_scheduler.h"
17 #include "eu/co_routine.h"
18 #include "eu/execute_unit.h"
19 #include "eu/sexecute_unit.h"
20 #include "dm/dependence_manager.h"
21 #include "dm/sdependence_manager.h"
22 #include "dfx/log/ffrt_log_api.h"
23 #include "util/singleton_register.h"
24 #include "util/slab.h"
25 #include "tm/task_factory.h"
26 #include "tm/io_task.h"
27 #include "tm/queue_task.h"
28 #include "util/slab.h"
29 #include "qos.h"
30 #ifdef FFRT_ASYNC_STACKTRACE
31 #include "dfx/async_stack/ffrt_async_stack.h"
32 #endif
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
RegistCommonTaskFactory()37 void RegistCommonTaskFactory()
38 {
39 ffrt::TaskFactory<ffrt::QueueTask>::RegistCb(
40 [] () -> ffrt::QueueTask* {
41 return ffrt::SimpleAllocator<ffrt::QueueTask>::AllocMem();
42 },
43 [] (ffrt::QueueTask* task) {
44 ffrt::SimpleAllocator<ffrt::QueueTask>::FreeMem(task);
45 },
46 [] (ffrt::QueueTask* task) {
47 ffrt::SimpleAllocator<ffrt::QueueTask>::FreeMem_(task);
48 },
49 ffrt::SimpleAllocator<ffrt::QueueTask>::getUnfreedMem,
50 ffrt::SimpleAllocator<ffrt::QueueTask>::HasBeenFreed,
51 ffrt::SimpleAllocator<ffrt::QueueTask>::LockMem,
52 ffrt::SimpleAllocator<ffrt::QueueTask>::UnlockMem);
53
54 ffrt::TaskFactory<ffrt::IOTask>::RegistCb(
55 [] () -> ffrt::IOTask* {
56 return ffrt::SimpleAllocator<ffrt::IOTask>::AllocMem();
57 },
58 [] (ffrt::IOTask* task) {
59 ffrt::SimpleAllocator<ffrt::IOTask>::FreeMem(task);
60 },
61 [] (ffrt::IOTask* task) {
62 ffrt::SimpleAllocator<ffrt::IOTask>::FreeMem_(task);
63 },
64 ffrt::SimpleAllocator<ffrt::IOTask>::getUnfreedMem,
65 ffrt::SimpleAllocator<ffrt::IOTask>::HasBeenFreed,
66 ffrt::SimpleAllocator<ffrt::IOTask>::LockMem,
67 ffrt::SimpleAllocator<ffrt::IOTask>::UnlockMem);
68 }
69
ffrt_init()70 __attribute__((constructor)) static void ffrt_init()
71 {
72 RegistCommonTaskFactory();
73 ffrt::TaskFactory<ffrt::CPUEUTask>::RegistCb(
74 [] () -> ffrt::CPUEUTask* {
75 return static_cast<ffrt::CPUEUTask*>(ffrt::SimpleAllocator<ffrt::SCPUEUTask>::AllocMem());
76 },
77 [] (ffrt::CPUEUTask* task) {
78 ffrt::SimpleAllocator<ffrt::SCPUEUTask>::FreeMem(static_cast<ffrt::SCPUEUTask*>(task));
79 },
80 [] (ffrt::CPUEUTask* task) {
81 ffrt::SimpleAllocator<ffrt::SCPUEUTask>::
82 FreeMem_(static_cast<ffrt::SCPUEUTask*>(task));
83 },
84 ffrt::SimpleAllocator<ffrt::SCPUEUTask>::getUnfreedMem,
85 [] (ffrt::CPUEUTask* task) {
86 return ffrt::SimpleAllocator<ffrt::SCPUEUTask>::HasBeenFreed(static_cast<ffrt::SCPUEUTask*>(task));
87 },
88 ffrt::SimpleAllocator<ffrt::SCPUEUTask>::LockMem,
89 ffrt::SimpleAllocator<ffrt::SCPUEUTask>::UnlockMem);
90 ffrt::SchedulerFactory::RegistCb(
91 [] () -> ffrt::TaskScheduler* { return new ffrt::TaskScheduler{new ffrt::FIFOQueue()}; },
92 [] (ffrt::TaskScheduler* schd) { delete schd; });
93 CoRoutineFactory::RegistCb(
94 [] (ffrt::CPUEUTask* task, CoWakeType type) -> void {CoWake(task, type);});
95 ffrt::DependenceManager::RegistInsCb(ffrt::SDependenceManager::Instance);
96 ffrt::ExecuteUnit::RegistInsCb(ffrt::SExecuteUnit::Instance);
97 ffrt::FFRTScheduler::RegistInsCb(ffrt::SFFRTScheduler::Instance);
98 ffrt::SetFuncQosMap(ffrt::QoSMap);
99 ffrt::SetFuncQosMax(ffrt::QoSMax);
100 }
FfrtDeinit(void)101 __attribute__((destructor)) static void FfrtDeinit(void)
102 {
103 #ifdef FFRT_ASYNC_STACKTRACE
104 ffrt::CloseAsyncStackLibHandle();
105 #endif
106 }
107
ffrt_child_init(void)108 void ffrt_child_init(void)
109 {
110 ffrt_init();
111 }
112 #ifdef __cplusplus
113 }
114 #endif