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 ©Process)
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