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#include "c/queue_ext.h"
16484543d1Sopenharmony_ci#include "cpp/queue.h"
17484543d1Sopenharmony_ci#include "util/event_handler_adapter.h"
18484543d1Sopenharmony_ci#include "dm/dependence_manager.h"
19484543d1Sopenharmony_ci#include "tm/queue_task.h"
20484543d1Sopenharmony_ci#include "queue_handler.h"
21484543d1Sopenharmony_ci
22484543d1Sopenharmony_ciusing namespace std;
23484543d1Sopenharmony_ciusing namespace ffrt;
24484543d1Sopenharmony_ci
25484543d1Sopenharmony_cinamespace {
26484543d1Sopenharmony_ciinline void ResetTimeoutCb(ffrt::queue_attr_private* p)
27484543d1Sopenharmony_ci{
28484543d1Sopenharmony_ci    if (p->timeoutCb_ == nullptr) {
29484543d1Sopenharmony_ci        return;
30484543d1Sopenharmony_ci    }
31484543d1Sopenharmony_ci    QueueTask* cbTask = GetQueueTaskByFuncStorageOffset(p->timeoutCb_);
32484543d1Sopenharmony_ci    cbTask->DecDeleteRef();
33484543d1Sopenharmony_ci    p->timeoutCb_ = nullptr;
34484543d1Sopenharmony_ci}
35484543d1Sopenharmony_ci
36484543d1Sopenharmony_ciinline QueueTask* ffrt_queue_submit_base(ffrt_queue_t queue, ffrt_function_header_t* f, bool withHandle,
37484543d1Sopenharmony_ci    bool insertHead, const ffrt_task_attr_t* attr)
38484543d1Sopenharmony_ci{
39484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return nullptr, "input invalid, queue == nullptr");
40484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(f == nullptr), return nullptr, "input invalid, function header == nullptr");
41484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
42484543d1Sopenharmony_ci    ffrt::task_attr_private *p = reinterpret_cast<ffrt::task_attr_private *>(const_cast<ffrt_task_attr_t *>(attr));
43484543d1Sopenharmony_ci    QueueTask* task = GetQueueTaskByFuncStorageOffset(f);
44484543d1Sopenharmony_ci    new (task)ffrt::QueueTask(handler, p, insertHead);
45484543d1Sopenharmony_ci    if (withHandle) {
46484543d1Sopenharmony_ci        task->IncDeleteRef();
47484543d1Sopenharmony_ci    }
48484543d1Sopenharmony_ci
49484543d1Sopenharmony_ci    handler->Submit(task);
50484543d1Sopenharmony_ci    return task;
51484543d1Sopenharmony_ci}
52484543d1Sopenharmony_ci} // namespace
53484543d1Sopenharmony_ci
54484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
55484543d1Sopenharmony_ciint ffrt_queue_attr_init(ffrt_queue_attr_t* attr)
56484543d1Sopenharmony_ci{
57484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return -1, "input invalid, attr == nullptr");
58484543d1Sopenharmony_ci    static_assert(sizeof(ffrt::queue_attr_private) <= ffrt_queue_attr_storage_size,
59484543d1Sopenharmony_ci        "size must be less than ffrt_queue_attr_storage_size");
60484543d1Sopenharmony_ci
61484543d1Sopenharmony_ci    new (attr) ffrt::queue_attr_private();
62484543d1Sopenharmony_ci    return 0;
63484543d1Sopenharmony_ci}
64484543d1Sopenharmony_ci
65484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
66484543d1Sopenharmony_civoid ffrt_queue_attr_destroy(ffrt_queue_attr_t* attr)
67484543d1Sopenharmony_ci{
68484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return, "input invalid, attr == nullptr");
69484543d1Sopenharmony_ci    auto p = reinterpret_cast<ffrt::queue_attr_private*>(attr);
70484543d1Sopenharmony_ci    ResetTimeoutCb(p);
71484543d1Sopenharmony_ci    p->~queue_attr_private();
72484543d1Sopenharmony_ci}
73484543d1Sopenharmony_ci
74484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
75484543d1Sopenharmony_civoid ffrt_queue_attr_set_qos(ffrt_queue_attr_t* attr, ffrt_qos_t qos)
76484543d1Sopenharmony_ci{
77484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return, "input invalid, attr == nullptr");
78484543d1Sopenharmony_ci
79484543d1Sopenharmony_ci    (reinterpret_cast<ffrt::queue_attr_private*>(attr))->qos_ = ffrt::GetFuncQosMap()(qos);
80484543d1Sopenharmony_ci}
81484543d1Sopenharmony_ci
82484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
83484543d1Sopenharmony_ciffrt_qos_t ffrt_queue_attr_get_qos(const ffrt_queue_attr_t* attr)
84484543d1Sopenharmony_ci{
85484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return ffrt_qos_default, "input invalid, attr == nullptr");
86484543d1Sopenharmony_ci    ffrt_queue_attr_t* p = const_cast<ffrt_queue_attr_t*>(attr);
87484543d1Sopenharmony_ci    return (reinterpret_cast<ffrt::queue_attr_private*>(p))->qos_;
88484543d1Sopenharmony_ci}
89484543d1Sopenharmony_ci
90484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
91484543d1Sopenharmony_civoid ffrt_queue_attr_set_timeout(ffrt_queue_attr_t* attr, uint64_t timeout_us)
92484543d1Sopenharmony_ci{
93484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return, "input invalid, attr == nullptr");
94484543d1Sopenharmony_ci    (reinterpret_cast<ffrt::queue_attr_private*>(attr))->timeout_ = timeout_us;
95484543d1Sopenharmony_ci}
96484543d1Sopenharmony_ci
97484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
98484543d1Sopenharmony_ciuint64_t ffrt_queue_attr_get_timeout(const ffrt_queue_attr_t* attr)
99484543d1Sopenharmony_ci{
100484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return 0, "input invalid, attr == nullptr");
101484543d1Sopenharmony_ci    ffrt_queue_attr_t* p = const_cast<ffrt_queue_attr_t*>(attr);
102484543d1Sopenharmony_ci    return (reinterpret_cast<ffrt::queue_attr_private*>(p))->timeout_;
103484543d1Sopenharmony_ci}
104484543d1Sopenharmony_ci
105484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
106484543d1Sopenharmony_civoid ffrt_queue_attr_set_callback(ffrt_queue_attr_t* attr, ffrt_function_header_t* f)
107484543d1Sopenharmony_ci{
108484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return, "input invalid, attr == nullptr");
109484543d1Sopenharmony_ci    ffrt::queue_attr_private* p = reinterpret_cast<ffrt::queue_attr_private*>(attr);
110484543d1Sopenharmony_ci    ResetTimeoutCb(p);
111484543d1Sopenharmony_ci    p->timeoutCb_ = f;
112484543d1Sopenharmony_ci    // the memory of timeoutCb are managed in the form of QueueTask
113484543d1Sopenharmony_ci    QueueTask* task = GetQueueTaskByFuncStorageOffset(f);
114484543d1Sopenharmony_ci    new (task)ffrt::QueueTask(nullptr);
115484543d1Sopenharmony_ci}
116484543d1Sopenharmony_ci
117484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
118484543d1Sopenharmony_ciffrt_function_header_t* ffrt_queue_attr_get_callback(const ffrt_queue_attr_t* attr)
119484543d1Sopenharmony_ci{
120484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return nullptr, "input invalid, attr == nullptr");
121484543d1Sopenharmony_ci    ffrt_queue_attr_t* p = const_cast<ffrt_queue_attr_t*>(attr);
122484543d1Sopenharmony_ci    return (reinterpret_cast<ffrt::queue_attr_private*>(p))->timeoutCb_;
123484543d1Sopenharmony_ci}
124484543d1Sopenharmony_ci
125484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
126484543d1Sopenharmony_civoid ffrt_queue_attr_set_max_concurrency(ffrt_queue_attr_t* attr, const int max_concurrency)
127484543d1Sopenharmony_ci{
128484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return, "input invalid, attr == nullptr");
129484543d1Sopenharmony_ci
130484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((max_concurrency <= 0), return,
131484543d1Sopenharmony_ci        "max concurrency should be a valid value");
132484543d1Sopenharmony_ci
133484543d1Sopenharmony_ci    (reinterpret_cast<ffrt::queue_attr_private*>(attr))->maxConcurrency_ = max_concurrency;
134484543d1Sopenharmony_ci}
135484543d1Sopenharmony_ci
136484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
137484543d1Sopenharmony_ciint ffrt_queue_attr_get_max_concurrency(const ffrt_queue_attr_t* attr)
138484543d1Sopenharmony_ci{
139484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((attr == nullptr), return 0, "input invalid, attr == nullptr");
140484543d1Sopenharmony_ci    ffrt_queue_attr_t* p = const_cast<ffrt_queue_attr_t*>(attr);
141484543d1Sopenharmony_ci    return (reinterpret_cast<ffrt::queue_attr_private*>(p))->maxConcurrency_;
142484543d1Sopenharmony_ci}
143484543d1Sopenharmony_ci
144484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
145484543d1Sopenharmony_ciffrt_queue_t ffrt_queue_create(ffrt_queue_type_t type, const char* name, const ffrt_queue_attr_t* attr)
146484543d1Sopenharmony_ci{
147484543d1Sopenharmony_ci    bool invalidType = (type == ffrt_queue_max) || (type < ffrt_queue_serial) ||
148484543d1Sopenharmony_ci        (type >= static_cast<ffrt_queue_type_t>(ffrt_queue_inner_max));
149484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(invalidType, return nullptr, "input invalid, type unsupport");
150484543d1Sopenharmony_ci    QueueHandler* handler = new (std::nothrow) QueueHandler(name, attr, type);
151484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handler == nullptr), return nullptr, "failed to construct QueueHandler");
152484543d1Sopenharmony_ci    return static_cast<ffrt_queue_t>(handler);
153484543d1Sopenharmony_ci}
154484543d1Sopenharmony_ci
155484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
156484543d1Sopenharmony_civoid ffrt_queue_destroy(ffrt_queue_t queue)
157484543d1Sopenharmony_ci{
158484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((queue == nullptr), return, "input invalid, queue is nullptr");
159484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
160484543d1Sopenharmony_ci    delete handler;
161484543d1Sopenharmony_ci}
162484543d1Sopenharmony_ci
163484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
164484543d1Sopenharmony_civoid ffrt_queue_submit(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr)
165484543d1Sopenharmony_ci{
166484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((f == nullptr), return, "input invalid, function is nullptr");
167484543d1Sopenharmony_ci    QueueTask* task = ffrt_queue_submit_base(queue, f, false, false, attr);
168484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((task == nullptr), return, "failed to submit serial task");
169484543d1Sopenharmony_ci}
170484543d1Sopenharmony_ci
171484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
172484543d1Sopenharmony_civoid ffrt_queue_submit_head(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr)
173484543d1Sopenharmony_ci{
174484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((f == nullptr), return, "input invalid, function is nullptr");
175484543d1Sopenharmony_ci    QueueTask* task = ffrt_queue_submit_base(queue, f, false, true, attr);
176484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((task == nullptr), return, "failed to submit serial task");
177484543d1Sopenharmony_ci}
178484543d1Sopenharmony_ci
179484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
180484543d1Sopenharmony_ciffrt_task_handle_t ffrt_queue_submit_h(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr)
181484543d1Sopenharmony_ci{
182484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((f == nullptr), return nullptr, "input invalid, function is nullptr");
183484543d1Sopenharmony_ci    QueueTask* task = ffrt_queue_submit_base(queue, f, true, false, attr);
184484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((task == nullptr), return nullptr, "failed to submit serial task");
185484543d1Sopenharmony_ci    return static_cast<ffrt_task_handle_t>(task);
186484543d1Sopenharmony_ci}
187484543d1Sopenharmony_ci
188484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
189484543d1Sopenharmony_ciffrt_task_handle_t ffrt_queue_submit_head_h(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr)
190484543d1Sopenharmony_ci{
191484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((f == nullptr), return nullptr, "input invalid, function is nullptr");
192484543d1Sopenharmony_ci    QueueTask* task = ffrt_queue_submit_base(queue, f, true, true, attr);
193484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((task == nullptr), return nullptr, "failed to submit serial task");
194484543d1Sopenharmony_ci    return static_cast<ffrt_task_handle_t>(task);
195484543d1Sopenharmony_ci}
196484543d1Sopenharmony_ci
197484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
198484543d1Sopenharmony_civoid ffrt_queue_wait(ffrt_task_handle_t handle)
199484543d1Sopenharmony_ci{
200484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handle == nullptr), return, "input invalid, task_handle is nullptr");
201484543d1Sopenharmony_ci    QueueTask* task = static_cast<QueueTask*>(handle);
202484543d1Sopenharmony_ci    task->Wait();
203484543d1Sopenharmony_ci}
204484543d1Sopenharmony_ci
205484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
206484543d1Sopenharmony_ciint ffrt_queue_cancel(ffrt_task_handle_t handle)
207484543d1Sopenharmony_ci{
208484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handle == nullptr), return -1, "input invalid, handle is nullptr");
209484543d1Sopenharmony_ci    QueueTask* task = reinterpret_cast<QueueTask*>(static_cast<CPUEUTask*>(handle));
210484543d1Sopenharmony_ci    QueueHandler* handler = task->GetHandler();
211484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handler == nullptr), return -1, "task handler is nullptr");
212484543d1Sopenharmony_ci    int ret = handler->Cancel(task);
213484543d1Sopenharmony_ci    return ret;
214484543d1Sopenharmony_ci}
215484543d1Sopenharmony_ci
216484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
217484543d1Sopenharmony_civoid ffrt_queue_cancel_all(ffrt_queue_t queue)
218484543d1Sopenharmony_ci{
219484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return, "input invalid, queue is nullptr");
220484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
221484543d1Sopenharmony_ci    handler->Cancel();
222484543d1Sopenharmony_ci}
223484543d1Sopenharmony_ci
224484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
225484543d1Sopenharmony_civoid ffrt_queue_cancel_and_wait(ffrt_queue_t queue)
226484543d1Sopenharmony_ci{
227484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return, "input invalid, queue is nullptr");
228484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
229484543d1Sopenharmony_ci    handler->CancelAndWait();
230484543d1Sopenharmony_ci}
231484543d1Sopenharmony_ci
232484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
233484543d1Sopenharmony_ciint ffrt_queue_cancel_by_name(ffrt_queue_t queue, const char* name)
234484543d1Sopenharmony_ci{
235484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return -1, "input invalid, queue is nullptr");
236484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(name == nullptr), return -1, "input invalid, name is nullptr");
237484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
238484543d1Sopenharmony_ci    return handler->Cancel(name);
239484543d1Sopenharmony_ci}
240484543d1Sopenharmony_ci
241484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
242484543d1Sopenharmony_cibool ffrt_queue_has_task(ffrt_queue_t queue, const char* name)
243484543d1Sopenharmony_ci{
244484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return false, "input invalid, queue is nullptr");
245484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(name == nullptr), return false, "input invalid, name is nullptr");
246484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
247484543d1Sopenharmony_ci    return handler->HasTask(name);
248484543d1Sopenharmony_ci}
249484543d1Sopenharmony_ci
250484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
251484543d1Sopenharmony_cibool ffrt_queue_is_idle(ffrt_queue_t queue)
252484543d1Sopenharmony_ci{
253484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return false, "input invalid, queue is nullptr");
254484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
255484543d1Sopenharmony_ci    return handler->IsIdle();
256484543d1Sopenharmony_ci}
257484543d1Sopenharmony_ci
258484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
259484543d1Sopenharmony_civoid ffrt_queue_set_eventhandler(ffrt_queue_t queue, void* eventhandler)
260484543d1Sopenharmony_ci{
261484543d1Sopenharmony_ci    FFRT_COND_DO_ERR(unlikely(queue == nullptr), return, "input invalid, queue is nullptr");
262484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
263484543d1Sopenharmony_ci    handler->SetEventHandler(eventhandler);
264484543d1Sopenharmony_ci}
265484543d1Sopenharmony_ci
266484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
267484543d1Sopenharmony_civoid* ffrt_get_current_queue_eventhandler()
268484543d1Sopenharmony_ci{
269484543d1Sopenharmony_ci    CPUEUTask* curTask = ffrt::ExecuteCtx::Cur()->task;
270484543d1Sopenharmony_ci    if (curTask == nullptr || curTask->type != ffrt_queue_task) {
271484543d1Sopenharmony_ci        FFRT_LOGW("Current task is nullptr or is not a serial task.");
272484543d1Sopenharmony_ci        return nullptr;
273484543d1Sopenharmony_ci    }
274484543d1Sopenharmony_ci
275484543d1Sopenharmony_ci    QueueHandler* handler = reinterpret_cast<QueueTask*>(curTask)->GetHandler();
276484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handler == nullptr), return nullptr, "task handler is nullptr");
277484543d1Sopenharmony_ci    return handler->GetEventHandler();
278484543d1Sopenharmony_ci}
279484543d1Sopenharmony_ci
280484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
281484543d1Sopenharmony_ciffrt_queue_t ffrt_get_main_queue()
282484543d1Sopenharmony_ci{
283484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((EventHandlerAdapter::Instance()->GetMainEventHandler == nullptr),
284484543d1Sopenharmony_ci        return nullptr, "failed to load GetMainEventHandler Func.");
285484543d1Sopenharmony_ci    void* mainHandler = EventHandlerAdapter::Instance()->GetMainEventHandler();
286484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((mainHandler == nullptr), return nullptr, "failed to get main queue.");
287484543d1Sopenharmony_ci    QueueHandler *handler = new (std::nothrow) QueueHandler(
288484543d1Sopenharmony_ci        "main_queue", nullptr, ffrt_queue_eventhandler_interactive);
289484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handler == nullptr), return nullptr, "failed to construct MainThreadQueueHandler");
290484543d1Sopenharmony_ci    handler->SetEventHandler(mainHandler);
291484543d1Sopenharmony_ci    return static_cast<ffrt_queue_t>(handler);
292484543d1Sopenharmony_ci}
293484543d1Sopenharmony_ci
294484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
295484543d1Sopenharmony_ciffrt_queue_t ffrt_get_current_queue()
296484543d1Sopenharmony_ci{
297484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((EventHandlerAdapter::Instance()->GetCurrentEventHandler == nullptr),
298484543d1Sopenharmony_ci        return nullptr, "failed to load GetCurrentEventHandler Func.");
299484543d1Sopenharmony_ci    void* workerHandler = EventHandlerAdapter::Instance()->GetCurrentEventHandler();
300484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((workerHandler == nullptr), return nullptr, "failed to get ArkTs worker queue.");
301484543d1Sopenharmony_ci    QueueHandler *handler = new (std::nothrow) QueueHandler(
302484543d1Sopenharmony_ci        "current_queue", nullptr, ffrt_queue_eventhandler_interactive);
303484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((handler == nullptr), return nullptr, "failed to construct WorkerThreadQueueHandler");
304484543d1Sopenharmony_ci    handler->SetEventHandler(workerHandler);
305484543d1Sopenharmony_ci    return static_cast<ffrt_queue_t>(handler);
306484543d1Sopenharmony_ci}
307484543d1Sopenharmony_ci
308484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
309484543d1Sopenharmony_ciint ffrt_queue_dump(ffrt_queue_t queue, const char* tag, char* buf, uint32_t len, bool history_info)
310484543d1Sopenharmony_ci{
311484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((queue == nullptr), return -1, "input invalid, queue is nullptr");
312484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((tag == nullptr || buf == nullptr), return -1, "input invalid, tag or buf is nullptr");
313484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
314484543d1Sopenharmony_ci    return handler->Dump(tag, buf, len, history_info);
315484543d1Sopenharmony_ci}
316484543d1Sopenharmony_ci
317484543d1Sopenharmony_ciAPI_ATTRIBUTE((visibility("default")))
318484543d1Sopenharmony_ciint ffrt_queue_size_dump(ffrt_queue_t queue, ffrt_inner_queue_priority_t priority)
319484543d1Sopenharmony_ci{
320484543d1Sopenharmony_ci    FFRT_COND_DO_ERR((queue == nullptr), return -1, "input invalid, queue is nullptr");
321484543d1Sopenharmony_ci    QueueHandler* handler = static_cast<QueueHandler*>(queue);
322484543d1Sopenharmony_ci    return handler->DumpSize(priority);
323484543d1Sopenharmony_ci}