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 FFRT_THREAD_GROUP_H 17484543d1Sopenharmony_ci#define FFRT_THREAD_GROUP_H 18484543d1Sopenharmony_ci 19484543d1Sopenharmony_ci#include "eu/rtg_ioctl.h" 20484543d1Sopenharmony_ci 21484543d1Sopenharmony_cinamespace ffrt { 22484543d1Sopenharmony_ciclass ThreadGroup { 23484543d1Sopenharmony_cipublic: 24484543d1Sopenharmony_ci int Id() const 25484543d1Sopenharmony_ci { 26484543d1Sopenharmony_ci return tgid; 27484543d1Sopenharmony_ci } 28484543d1Sopenharmony_ci 29484543d1Sopenharmony_ci bool Enabled() const 30484543d1Sopenharmony_ci { 31484543d1Sopenharmony_ci return tgid >= 0 && RTGCtrl::Instance().Enabled(); 32484543d1Sopenharmony_ci } 33484543d1Sopenharmony_ci 34484543d1Sopenharmony_ci bool Init() 35484543d1Sopenharmony_ci { 36484543d1Sopenharmony_ci if (Enabled()) { 37484543d1Sopenharmony_ci return true; 38484543d1Sopenharmony_ci } 39484543d1Sopenharmony_ci 40484543d1Sopenharmony_ci tgid = RTGCtrl::Instance().GetThreadGroup(); 41484543d1Sopenharmony_ci return tgid >= 0; 42484543d1Sopenharmony_ci } 43484543d1Sopenharmony_ci 44484543d1Sopenharmony_ci bool Release() 45484543d1Sopenharmony_ci { 46484543d1Sopenharmony_ci if (!Enabled()) { 47484543d1Sopenharmony_ci return true; 48484543d1Sopenharmony_ci } 49484543d1Sopenharmony_ci 50484543d1Sopenharmony_ci if (!RTGCtrl::Instance().PutThreadGroup(tgid)) { 51484543d1Sopenharmony_ci return false; 52484543d1Sopenharmony_ci } 53484543d1Sopenharmony_ci 54484543d1Sopenharmony_ci tgid = -1; 55484543d1Sopenharmony_ci return true; 56484543d1Sopenharmony_ci } 57484543d1Sopenharmony_ci 58484543d1Sopenharmony_ci void Begin() 59484543d1Sopenharmony_ci { 60484543d1Sopenharmony_ci if (!Enabled() || isBegin()) { 61484543d1Sopenharmony_ci return; 62484543d1Sopenharmony_ci } 63484543d1Sopenharmony_ci 64484543d1Sopenharmony_ci isbegin = true; 65484543d1Sopenharmony_ci RTGCtrl::Instance().Begin(tgid); 66484543d1Sopenharmony_ci } 67484543d1Sopenharmony_ci 68484543d1Sopenharmony_ci void End() 69484543d1Sopenharmony_ci { 70484543d1Sopenharmony_ci if (!Enabled() || !isBegin()) { 71484543d1Sopenharmony_ci return; 72484543d1Sopenharmony_ci } 73484543d1Sopenharmony_ci RTGCtrl::Instance().End(tgid); 74484543d1Sopenharmony_ci isbegin = false; 75484543d1Sopenharmony_ci } 76484543d1Sopenharmony_ci 77484543d1Sopenharmony_ci bool Join() 78484543d1Sopenharmony_ci { 79484543d1Sopenharmony_ci if (!Enabled()) { 80484543d1Sopenharmony_ci return false; 81484543d1Sopenharmony_ci } 82484543d1Sopenharmony_ci return RTGCtrl::Instance().JoinThread(tgid, RTGCtrl::GetTID()); 83484543d1Sopenharmony_ci } 84484543d1Sopenharmony_ci 85484543d1Sopenharmony_ci bool Join(pid_t tid) 86484543d1Sopenharmony_ci { 87484543d1Sopenharmony_ci if (!Enabled()) { 88484543d1Sopenharmony_ci return false; 89484543d1Sopenharmony_ci } 90484543d1Sopenharmony_ci return RTGCtrl::Instance().JoinThread(tgid, tid); 91484543d1Sopenharmony_ci } 92484543d1Sopenharmony_ci 93484543d1Sopenharmony_ci bool Leave() 94484543d1Sopenharmony_ci { 95484543d1Sopenharmony_ci if (!Enabled()) { 96484543d1Sopenharmony_ci return false; 97484543d1Sopenharmony_ci } 98484543d1Sopenharmony_ci return RTGCtrl::Instance().RemoveThread(tgid, RTGCtrl::GetTID()); 99484543d1Sopenharmony_ci } 100484543d1Sopenharmony_ci 101484543d1Sopenharmony_ci bool Leave(pid_t tid) 102484543d1Sopenharmony_ci { 103484543d1Sopenharmony_ci if (!Enabled()) { 104484543d1Sopenharmony_ci return false; 105484543d1Sopenharmony_ci } 106484543d1Sopenharmony_ci return RTGCtrl::Instance().RemoveThread(tgid, tid); 107484543d1Sopenharmony_ci } 108484543d1Sopenharmony_ci 109484543d1Sopenharmony_ci bool UpdateFreq(int64_t freq) 110484543d1Sopenharmony_ci { 111484543d1Sopenharmony_ci if (!Enabled()) { 112484543d1Sopenharmony_ci return false; 113484543d1Sopenharmony_ci } 114484543d1Sopenharmony_ci return RTGCtrl::Instance().UpdatePerfFreq(tgid, freq); 115484543d1Sopenharmony_ci } 116484543d1Sopenharmony_ci 117484543d1Sopenharmony_ci bool UpdateUitl(int64_t util) 118484543d1Sopenharmony_ci { 119484543d1Sopenharmony_ci if (!Enabled()) { 120484543d1Sopenharmony_ci return false; 121484543d1Sopenharmony_ci } 122484543d1Sopenharmony_ci return RTGCtrl::Instance().UpdatePerfUtil(tgid, util); 123484543d1Sopenharmony_ci } 124484543d1Sopenharmony_ci 125484543d1Sopenharmony_ci RTGLoadInfo GetLoad() 126484543d1Sopenharmony_ci { 127484543d1Sopenharmony_ci if (!Enabled()) { 128484543d1Sopenharmony_ci return RTGLoadInfo(); 129484543d1Sopenharmony_ci } 130484543d1Sopenharmony_ci return RTGCtrl::Instance().UpdateAndGetLoad(tgid); 131484543d1Sopenharmony_ci } 132484543d1Sopenharmony_ci 133484543d1Sopenharmony_ci RTGLoadInfo GetLoad(pid_t tid) 134484543d1Sopenharmony_ci { 135484543d1Sopenharmony_ci if (!Enabled()) { 136484543d1Sopenharmony_ci return RTGLoadInfo(); 137484543d1Sopenharmony_ci } 138484543d1Sopenharmony_ci return RTGCtrl::Instance().UpdateAndGetLoad(tgid, tid); 139484543d1Sopenharmony_ci } 140484543d1Sopenharmony_ci 141484543d1Sopenharmony_ci bool SetWindowSize(uint64_t size) 142484543d1Sopenharmony_ci { 143484543d1Sopenharmony_ci if (!Enabled()) { 144484543d1Sopenharmony_ci return false; 145484543d1Sopenharmony_ci } 146484543d1Sopenharmony_ci return RTGCtrl::Instance().SetGroupWindowSize(tgid, size); 147484543d1Sopenharmony_ci } 148484543d1Sopenharmony_ci 149484543d1Sopenharmony_ci bool SetInvalidInterval(uint64_t invalidMs) 150484543d1Sopenharmony_ci { 151484543d1Sopenharmony_ci if (!Enabled()) { 152484543d1Sopenharmony_ci return false; 153484543d1Sopenharmony_ci } 154484543d1Sopenharmony_ci return RTGCtrl::Instance().SetInvalidInterval(tgid, invalidMs); 155484543d1Sopenharmony_ci } 156484543d1Sopenharmony_ci 157484543d1Sopenharmony_ci static pid_t GetTID() 158484543d1Sopenharmony_ci { 159484543d1Sopenharmony_ci return RTGCtrl::GetTID(); 160484543d1Sopenharmony_ci } 161484543d1Sopenharmony_ci 162484543d1Sopenharmony_ci bool isBegin() 163484543d1Sopenharmony_ci { 164484543d1Sopenharmony_ci return isbegin; 165484543d1Sopenharmony_ci } 166484543d1Sopenharmony_ciprivate: 167484543d1Sopenharmony_ci int tgid = -1; 168484543d1Sopenharmony_ci bool isbegin = false; 169484543d1Sopenharmony_ci}; 170484543d1Sopenharmony_ci}; // namespace ffrt 171484543d1Sopenharmony_ci 172484543d1Sopenharmony_ci#endif