1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "process_priority_info.h"
17 #include "memmgr_log.h"
18 #include "reclaim_priority_constants.h"
19 
20 #include <sstream>
21 
22 namespace OHOS {
23 namespace Memory {
24 namespace {
25 const std::string TAG = "ProcessPriorityInfo";
26 } // namespace
27 
ProcessPriorityInfo(pid_t pid,int bundleUid,int priority,bool isImportant)28 ProcessPriorityInfo::ProcessPriorityInfo(pid_t pid, int bundleUid, int priority, bool isImportant)
29 {
30     this->uid_ = bundleUid;
31     this->pid_ = pid;
32     this->priority_ = priority;
33     this->priorityIfImportant_ = priority;
34     this->isImportant_ = isImportant;
35     this->isVisible_ = false;
36     this->isRender_ = false;
37     this->isFreground = (priority == RECLAIM_PRIORITY_FOREGROUND) ? true : false;
38     this->isBackgroundRunning = false;
39     this->isSuspendDelay = false;
40     this->isEventStart = false;
41     this->isDistDeviceConnected = false;
42     this->isExtension_ = false;
43     this->extensionBindStatus = EXTENSION_STATUS_BIND_UNKOWN;
44     this->isAbilityStarting_ = false;
45     this->startingAbilityTime_ = INVALID_TIME;
46 }
47 
ProcessPriorityInfo(const ProcessPriorityInfo & copyProcess)48 ProcessPriorityInfo::ProcessPriorityInfo(const ProcessPriorityInfo &copyProcess)
49 {
50     this->uid_ = copyProcess.uid_;
51     this->pid_ = copyProcess.pid_;
52     this->priority_ = copyProcess.priority_;
53     this->priorityIfImportant_ = copyProcess.priorityIfImportant_;
54     this->isImportant_ = copyProcess.isImportant_;
55     this->isVisible_ = copyProcess.isVisible_;
56     this->isRender_ = copyProcess.isRender_;
57     this->isFreground = copyProcess.isFreground;
58     this->isExtension_ = copyProcess.isExtension_;
59     this->isBackgroundRunning = copyProcess.isBackgroundRunning;
60     this->isSuspendDelay = copyProcess.isSuspendDelay;
61     this->isEventStart = copyProcess.isEventStart;
62     this->isDistDeviceConnected = copyProcess.isDistDeviceConnected;
63     this->extensionBindStatus = copyProcess.extensionBindStatus;
64     for (auto &pair : copyProcess.procsBindToMe_) {
65         this->procsBindToMe_.insert(std::make_pair(pair.first, pair.second));
66     }
67     for (auto &pair : copyProcess.procsBindFromMe_) {
68         this->procsBindFromMe_.insert(std::make_pair(pair.first, pair.second));
69     }
70 
71     this->isAbilityStarting_ = copyProcess.isAbilityStarting_;
72     this->startingAbilityTime_ = copyProcess.startingAbilityTime_;
73 }
74 
~ProcessPriorityInfo()75 ProcessPriorityInfo::~ProcessPriorityInfo()
76 {
77     procsBindToMe_.clear();
78     procsBindFromMe_.clear();
79 }
80 
SetPriority(int targetPriority)81 void ProcessPriorityInfo::SetPriority(int targetPriority)
82 {
83     priority_ = targetPriority;
84     HILOGD("set process[%{public}d] priority to %{public}d", pid_, priority_);
85 }
86 
ExtensionConnectorsCount()87 int32_t ProcessPriorityInfo::ExtensionConnectorsCount()
88 {
89     return procsBindToMe_.size();
90 }
91 
ProcBindToMe(int32_t pid,int32_t uid)92 void ProcessPriorityInfo::ProcBindToMe(int32_t pid, int32_t uid)
93 {
94     procsBindToMe_[pid] = uid;
95     HILOGE("insert process[pid=%{public}d, uid=%{public}d] to procsBindToMe_, map size = %{public}zu",
96         pid, uid, procsBindToMe_.size());
97 }
98 
ProcUnBindToMe(int32_t pid)99 void ProcessPriorityInfo::ProcUnBindToMe(int32_t pid)
100 {
101     procsBindToMe_.erase(pid);
102     HILOGE("remove process[pid=%{public}d] to procsBindToMe_, map size = %{public}zu",
103         pid, procsBindToMe_.size());
104 }
105 
ProcBindFromMe(int32_t pid,int32_t uid)106 void ProcessPriorityInfo::ProcBindFromMe(int32_t pid, int32_t uid)
107 {
108     procsBindFromMe_[pid] = uid;
109     HILOGE("insert process[pid=%{public}d, uid=%{public}d] to procsBindFromMe_, map size = %{public}zu",
110         pid, uid, procsBindFromMe_.size());
111 }
112 
ProcUnBindFromMe(int32_t pid)113 void ProcessPriorityInfo::ProcUnBindFromMe(int32_t pid)
114 {
115     procsBindFromMe_.erase(pid);
116     HILOGE("remove process[pid=%{public}d] to procsBindFromMe_, map size = %{public}zu",
117         pid, procsBindFromMe_.size());
118 }
119 
ProcsBindToMe()120 std::string ProcessPriorityInfo::ProcsBindToMe()
121 {
122     std::stringstream ss;
123     ss << "[";
124     for (auto &pair : procsBindToMe_) {
125         ss << "(pid=" << pair.first << ", uid=" << pair.second << ") ";
126     }
127     ss << "]";
128     return ss.str();
129 }
130 
ProcsBindFromMe()131 std::string ProcessPriorityInfo::ProcsBindFromMe()
132 {
133     std::stringstream ss;
134     ss << "[";
135     for (auto &pair : procsBindFromMe_) {
136         ss << "(pid=" << pair.first << ", uid=" << pair.second << ") ";
137     }
138     ss << "]";
139     return ss.str();
140 }
141 
IsAbilityStarting() const142 bool ProcessPriorityInfo::IsAbilityStarting() const
143 {
144     return isAbilityStarting_;
145 }
146 
SetIsAbilityStarting(bool isAbilityStarting)147 void ProcessPriorityInfo::SetIsAbilityStarting(bool isAbilityStarting)
148 {
149     isAbilityStarting_ = isAbilityStarting;
150 }
151 
SetStartingAbilityTime(int64_t time)152 void ProcessPriorityInfo::SetStartingAbilityTime(int64_t time)
153 {
154     startingAbilityTime_ = time;
155 }
156 
GetStartingAbilityTime() const157 int64_t ProcessPriorityInfo::GetStartingAbilityTime() const
158 {
159     return startingAbilityTime_;
160 }
161 
162 } // namespace Memory
163 } // namespace OHOS
164