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