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}