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_BASE_H_ 17484543d1Sopenharmony_ci#define _TASK_BASE_H_ 18484543d1Sopenharmony_ci#include <atomic> 19484543d1Sopenharmony_ci#include <vector> 20484543d1Sopenharmony_ci#include "eu/co_routine.h" 21484543d1Sopenharmony_ci#include "qos.h" 22484543d1Sopenharmony_ci#include "sched/execute_ctx.h" 23484543d1Sopenharmony_ci#include "util/task_deleter.h" 24484543d1Sopenharmony_ci 25484543d1Sopenharmony_cinamespace ffrt { 26484543d1Sopenharmony_cistatic std::atomic_uint64_t s_gid(0); 27484543d1Sopenharmony_ciclass TaskBase { 28484543d1Sopenharmony_cipublic: 29484543d1Sopenharmony_ci uintptr_t reserved = 0; 30484543d1Sopenharmony_ci uintptr_t type = 0; 31484543d1Sopenharmony_ci WaitEntry fq_we; // used on fifo fast que 32484543d1Sopenharmony_ci TaskBase(): gid(++s_gid) {} 33484543d1Sopenharmony_ci virtual ~TaskBase() = default; 34484543d1Sopenharmony_ci const uint64_t gid; // global unique id in this process 35484543d1Sopenharmony_ci#ifdef FFRT_ASYNC_STACKTRACE 36484543d1Sopenharmony_ci uint64_t stackId = 0; 37484543d1Sopenharmony_ci#endif 38484543d1Sopenharmony_ci 39484543d1Sopenharmony_ci virtual int GetQos() const 40484543d1Sopenharmony_ci { 41484543d1Sopenharmony_ci return qos_default; 42484543d1Sopenharmony_ci } 43484543d1Sopenharmony_ci 44484543d1Sopenharmony_ci#if (FFRT_TRACE_RECORD_LEVEL >= FFRT_TRACE_RECORD_LEVEL_1) 45484543d1Sopenharmony_ci uint64_t createTime; 46484543d1Sopenharmony_ci uint64_t executeTime; 47484543d1Sopenharmony_ci#endif 48484543d1Sopenharmony_ci int32_t fromTid; 49484543d1Sopenharmony_ci}; 50484543d1Sopenharmony_ci 51484543d1Sopenharmony_ciclass CoTask : public TaskBase, public TaskDeleter { 52484543d1Sopenharmony_cipublic: 53484543d1Sopenharmony_ci CoTask() = default; 54484543d1Sopenharmony_ci ~CoTask() override = default; 55484543d1Sopenharmony_ci virtual void Execute() = 0; 56484543d1Sopenharmony_ci 57484543d1Sopenharmony_ci std::string label; 58484543d1Sopenharmony_ci std::vector<std::string> traceTag; 59484543d1Sopenharmony_ci bool wakeupTimeOut = false; 60484543d1Sopenharmony_ci int cpuBoostCtxId = -1; 61484543d1Sopenharmony_ci WaitUntilEntry* wue = nullptr; 62484543d1Sopenharmony_ci // lifecycle connection between task and coroutine is shown as below: 63484543d1Sopenharmony_ci // |*task pending*|*task ready*|*task executing*|*task done*|*task release*| 64484543d1Sopenharmony_ci // |**********coroutine*********| 65484543d1Sopenharmony_ci CoRoutine* coRoutine = nullptr; 66484543d1Sopenharmony_ci uint64_t stack_size = STACK_SIZE; 67484543d1Sopenharmony_ci std::atomic<pthread_t> runningTid = 0; 68484543d1Sopenharmony_ci int legacyCountNum = 0; // dynamic switch controlled by set_legacy_mode api 69484543d1Sopenharmony_ci BlockType blockType { BlockType::BLOCK_COROUTINE }; // block type for lagacy mode changing 70484543d1Sopenharmony_ci std::mutex mutex_; // used in coroute 71484543d1Sopenharmony_ci std::condition_variable waitCond_; // cv for thread wait 72484543d1Sopenharmony_ci 73484543d1Sopenharmony_ci void SetTraceTag(const char* name) 74484543d1Sopenharmony_ci { 75484543d1Sopenharmony_ci traceTag.emplace_back(name); 76484543d1Sopenharmony_ci } 77484543d1Sopenharmony_ci 78484543d1Sopenharmony_ci void ClearTraceTag() 79484543d1Sopenharmony_ci { 80484543d1Sopenharmony_ci if (!traceTag.empty()) { 81484543d1Sopenharmony_ci traceTag.pop_back(); 82484543d1Sopenharmony_ci } 83484543d1Sopenharmony_ci } 84484543d1Sopenharmony_ci}; 85484543d1Sopenharmony_ci} 86484543d1Sopenharmony_ci#endif