• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "work_policy_manager.h"
17 
18 #include <string>
19 #include <hisysevent.h>
20 #include <if_system_ability_manager.h>
21 #include <ipc_skeleton.h>
22 #include <iservice_registry.h>
23 #include <system_ability_definition.h>
24 
25 #include "policy/app_data_clear_listener.h"
26 #include "policy/app_removed_listener.h"
27 #include "work_scheduler_service.h"
28 #include "work_event_handler.h"
29 #include "work_sched_hilog.h"
30 #include "work_sched_errors.h"
31 #include "watchdog.h"
32 
33 using namespace std;
34 using namespace OHOS::AppExecFwk;
35 using namespace OHOS::HiviewDFX;
36 
37 namespace OHOS {
38 namespace WorkScheduler {
39 namespace {
40 const int32_t MAX_RUNNING_COUNT = 3;
41 const uint32_t MAX_WORK_COUNT_PER_UID = 10;
42 const int32_t DELAY_TIME_LONG = 30000;
43 const int32_t DELAY_TIME_SHORT = 5000;
44 const uint32_t MAX_WATCHDOG_ID = 1000;
45 const uint32_t INIT_WATCHDOG_ID = 1;
46 const int32_t INIT_DUMP_SET_MEMORY = -1;
47 const int32_t WATCHDOG_TIME = 2 * 60 * 1000;
48 const int32_t MEDIUM_WATCHDOG_TIME = 10 * 60 * 1000;
49 const int32_t LONG_WATCHDOG_TIME = 20 * 60 * 1000;
50 static int32_t g_lastWatchdogTime = WATCHDOG_TIME;
51 }
52 
WorkPolicyManager(const wptr<WorkSchedulerService> & wss)53 WorkPolicyManager::WorkPolicyManager(const wptr<WorkSchedulerService>& wss) : wss_(wss)
54 {
55     std::lock_guard<std::mutex> lock(conditionReadyMutex_);
56     conditionReadyQueue_ = std::make_shared<WorkQueue>();
57     watchdogId_ = INIT_WATCHDOG_ID;
58     dumpSetMemory_ = INIT_DUMP_SET_MEMORY;
59     watchdogTime_ = WATCHDOG_TIME;
60 }
61 
Init()62 bool WorkPolicyManager::Init()
63 {
64     WS_HILOGD("Work policy manager init.");
65     workConnManager_ = make_shared<WorkConnManager>();
66     auto wmsptr = wss_.promote();
67     if (wmsptr == nullptr) {
68         WS_HILOGE("failed due to wmsptr is nullptr");
69         return false;
70     }
71     handler_ = wmsptr->GetHandler();
72     if (handler_ == nullptr) {
73         WS_HILOGE("failed due to handler_ is nullptr");
74         return false;
75     }
76     watchdog_ = std::make_shared<Watchdog>(wmsptr->GetWorkPolicyManager());
77     return true;
78 }
79 
AddPolicyFilter(shared_ptr<IPolicyFilter> filter)80 void WorkPolicyManager::AddPolicyFilter(shared_ptr<IPolicyFilter> filter)
81 {
82     policyFilters_.emplace_back(filter);
83 }
84 
AddAppRemoveListener(shared_ptr<AppRemovedListener> listener)85 void WorkPolicyManager::AddAppRemoveListener(shared_ptr<AppRemovedListener> listener)
86 {
87     appRemovedListener_ = listener;
88     appRemovedListener_->Start();
89 }
90 
AddAppDataClearListener(std::shared_ptr<AppDataClearListener> listener)91 void WorkPolicyManager::AddAppDataClearListener(std::shared_ptr<AppDataClearListener> listener)
92 {
93     appDataClearListener_ = listener;
94     appDataClearListener_->Start();
95 }
96 
AddWork(shared_ptr<WorkStatus> workStatus,int32_t uid)97 int32_t WorkPolicyManager::AddWork(shared_ptr<WorkStatus> workStatus, int32_t uid)
98 {
99     WS_HILOGD("Add work");
100     std::lock_guard<std::mutex> lock(uidMapMutex_);
101     if (uidQueueMap_.count(uid) > 0) {
102         if (uidQueueMap_.at(uid)->Contains(make_shared<string>(workStatus->workId_))) {
103             WS_HILOGE("Workid has been added, should remove first.");
104             return E_ADD_REPEAT_WORK_ERR;
105         } else if (uidQueueMap_.at(uid)->GetSize() >= MAX_WORK_COUNT_PER_UID) {
106             WS_HILOGE("each uid only can be added %{public}u works", MAX_WORK_COUNT_PER_UID);
107             return E_WORK_EXCEED_UPPER_LIMIT;
108         }
109         uidQueueMap_.at(uid)->Push(workStatus);
110     } else {
111         WS_HILOGD("uidQueue(%{public}d) not exists, create", uid);
112         uidQueueMap_.emplace(uid, make_shared<WorkQueue>());
113         uidQueueMap_.at(uid)->Push(workStatus);
114     }
115 
116     // Notify work add event to battery statistics
117     int32_t pid = IPCSkeleton::GetCallingPid();
118     string conditions = "";
119     if (workStatus->workInfo_->GetConditionMap()->count(WorkCondition::Type::NETWORK) > 0) {
120         conditions.append("NETWORK-");
121     }
122 
123     if (workStatus->workInfo_->GetConditionMap()->count(WorkCondition::Type::CHARGER) > 0) {
124         conditions.append("CHARGER-");
125     }
126 
127     if (workStatus->workInfo_->GetConditionMap()->count(WorkCondition::Type::BATTERY_STATUS) > 0) {
128         conditions.append("BATTERY_STATUS-");
129     }
130 
131     if (workStatus->workInfo_->GetConditionMap()->count(WorkCondition::Type::BATTERY_LEVEL) > 0) {
132         conditions.append("BATTERY_LEVEL-");
133     }
134 
135     if (workStatus->workInfo_->GetConditionMap()->count(WorkCondition::Type::STORAGE) > 0) {
136         conditions.append("STORAGE-");
137     }
138 
139     if (workStatus->workInfo_->GetConditionMap()->count(WorkCondition::Type::TIMER) > 0) {
140         conditions.append("TIMER-");
141     }
142     conditions.pop_back();
143 
144     string type = "Repeat";
145     if (!workStatus->workInfo_->IsRepeat()) {
146         type = "Not Repeat";
147     }
148 
149     HiSysEvent::Write("WORKSCHEDULER", "WORK_ADD", HiSysEvent::EventType::STATISTIC, "UID", uid,
150         "PID", pid, "NAME", workStatus->bundleName_, "WORKID", workStatus->workId_, "TRIGGER", conditions, "TYPE",
151         type, "INTERVAL", workStatus->workInfo_->GetTimeInterval());
152 
153     WS_HILOGI("push workStatus ID: %{public}s to uidQueue(%{public}d)", workStatus->workId_.c_str(), uid);
154     return ERR_OK;
155 }
156 
RemoveWork(shared_ptr<WorkStatus> workStatus,int32_t uid)157 bool WorkPolicyManager::RemoveWork(shared_ptr<WorkStatus> workStatus, int32_t uid)
158 {
159     WS_HILOGD("Remove work.");
160     bool ret = false;
161     std::lock_guard<std::mutex> lock(uidMapMutex_);
162     if (uidQueueMap_.count(uid) > 0) {
163         WS_HILOGD("Remove workStatus ID: %{public}s form uidQueue(%{public}d)", workStatus->workId_.c_str(), uid);
164         ret = uidQueueMap_.at(uid)->Remove(workStatus);
165         if (uidQueueMap_.count(uid) <= 0) {
166             uidQueueMap_.erase(uid);
167         }
168     }
169 
170     // Notify work remove event to battery statistics
171     int32_t pid = IPCSkeleton::GetCallingPid();
172     HiSysEvent::Write("WORKSCHEDULER", "WORK_REMOVE", HiSysEvent::EventType::STATISTIC, "UID", uid,
173         "PID", pid, "NAME", workStatus->bundleName_, "WORKID", workStatus->workId_);
174 
175     return ret;
176 }
177 
FindWorkStatus(WorkInfo & workInfo,int32_t uid)178 shared_ptr<WorkStatus> WorkPolicyManager::FindWorkStatus(WorkInfo& workInfo, int32_t uid)
179 {
180     WS_HILOGD("Find work status start.");
181     std::lock_guard<std::mutex> lock(uidMapMutex_);
182     if (uidQueueMap_.count(uid) > 0) {
183         return uidQueueMap_.at(uid)->Find(WorkStatus::MakeWorkId(workInfo.GetWorkId(), uid));
184     }
185     return nullptr;
186 }
187 
RemoveFromUidQueue(std::shared_ptr<WorkStatus> workStatus,int32_t uid)188 void WorkPolicyManager::RemoveFromUidQueue(std::shared_ptr<WorkStatus> workStatus, int32_t uid)
189 {
190     std::lock_guard<std::mutex> lock(uidMapMutex_);
191     if (uidQueueMap_.count(uid) > 0) {
192         uidQueueMap_.at(uid)->CancelWork(workStatus);
193         if (uidQueueMap_.at(uid)->GetSize() <= 0) {
194             uidQueueMap_.erase(uid);
195         }
196     }
197 }
198 
RemoveFromReadyQueue(std::shared_ptr<WorkStatus> workStatus)199 void WorkPolicyManager::RemoveFromReadyQueue(std::shared_ptr<WorkStatus> workStatus)
200 {
201     std::lock_guard<std::mutex> lock(conditionReadyMutex_);
202     conditionReadyQueue_->RemoveUnReady();
203 }
204 
StopWork(std::shared_ptr<WorkStatus> workStatus,int32_t uid,const bool needCancel,bool isTimeOut)205 bool WorkPolicyManager::StopWork(std::shared_ptr<WorkStatus> workStatus, int32_t uid,
206     const bool needCancel, bool isTimeOut)
207 {
208     WS_HILOGD("enter");
209     bool hasCanceled = false;
210     if (workStatus->IsRunning()) {
211         workStatus->lastTimeout_ = isTimeOut;
212         workConnManager_->StopWork(workStatus);
213         if (!workStatus->IsRepeating()) {
214             workStatus->MarkStatus(WorkStatus::Status::REMOVED);
215             RemoveFromUidQueue(workStatus, uid);
216             RemoveFromReadyQueue(workStatus);
217             hasCanceled = true;
218         } else {
219             workStatus->MarkStatus(WorkStatus::Status::WAIT_CONDITION);
220         }
221     }
222 
223     if (!hasCanceled && needCancel) {
224         RemoveFromUidQueue(workStatus, uid);
225         RemoveFromReadyQueue(workStatus);
226         hasCanceled = true;
227     }
228 
229     CheckWorkToRun();
230     return hasCanceled;
231 }
232 
StopAndClearWorks(int32_t uid)233 bool WorkPolicyManager::StopAndClearWorks(int32_t uid)
234 {
235     WS_HILOGD("enter");
236     std::lock_guard<std::mutex> lock(uidMapMutex_);
237     if (uidQueueMap_.count(uid) > 0) {
238         auto queue = uidQueueMap_.at(uid);
239         for (auto it : queue->GetWorkList()) {
240             workConnManager_->StopWork(it);
241             it->MarkStatus(WorkStatus::Status::REMOVED);
242             RemoveFromReadyQueue(it);
243         }
244         queue->ClearAll();
245         uidQueueMap_.erase(uid);
246     }
247     CheckWorkToRun();
248     return true;
249 }
250 
IsLastWorkTimeout(int32_t workId,int32_t uid,bool & result)251 int32_t WorkPolicyManager::IsLastWorkTimeout(int32_t workId, int32_t uid, bool &result)
252 {
253     std::lock_guard<std::mutex> lock(uidMapMutex_);
254     string workIdStr = WorkStatus::MakeWorkId(workId, uid);
255     if (uidQueueMap_.count(uid) > 0) {
256         shared_ptr<WorkStatus> workStatus = uidQueueMap_.at(uid)->Find(workIdStr);
257         if (workStatus != nullptr) {
258             return workStatus->IsLastWorkTimeout();
259         }
260     }
261     return E_WORK_NOT_EXIST_FAILED;
262 }
263 
OnConditionReady(shared_ptr<vector<shared_ptr<WorkStatus>>> workStatusVector)264 void WorkPolicyManager::OnConditionReady(shared_ptr<vector<shared_ptr<WorkStatus>>> workStatusVector)
265 {
266     WS_HILOGD("enter");
267     if (workStatusVector == nullptr) {
268         return;
269     }
270     AddToReadyQueue(workStatusVector);
271     CheckWorkToRun();
272 }
273 
AddToReadyQueue(shared_ptr<vector<shared_ptr<WorkStatus>>> workStatusVector)274 void WorkPolicyManager::AddToReadyQueue(shared_ptr<vector<shared_ptr<WorkStatus>>> workStatusVector)
275 {
276     std::lock_guard<std::mutex> lock(conditionReadyMutex_);
277     conditionReadyQueue_->Push(workStatusVector);
278 }
279 
GetMaxRunningCount()280 int32_t WorkPolicyManager::GetMaxRunningCount()
281 {
282     int32_t currentMaxRunning = MAX_RUNNING_COUNT;
283     for (auto policyFilter : policyFilters_) {
284         int32_t policyMaxRunning = policyFilter->GetPolicyMaxRunning();
285         if (policyMaxRunning < currentMaxRunning) {
286             currentMaxRunning = policyMaxRunning;
287         }
288     }
289     return currentMaxRunning;
290 }
291 
GetRunningCount()292 int32_t WorkPolicyManager::GetRunningCount()
293 {
294     WS_HILOGD("enter");
295     std::lock_guard<std::mutex> lock(uidMapMutex_);
296     int32_t count = 0;
297     auto it = uidQueueMap_.begin();
298     while (it != uidQueueMap_.end()) {
299         count += it->second->GetRunningCount();
300         it++;
301     }
302     return count;
303 }
304 
OnPolicyChanged(PolicyType policyType,shared_ptr<DetectorValue> detectorVal)305 void WorkPolicyManager::OnPolicyChanged(PolicyType policyType, shared_ptr<DetectorValue> detectorVal)
306 {
307     WS_HILOGD("enter");
308     switch (policyType) {
309         case PolicyType::APP_REMOVED: {
310             int32_t uid = detectorVal->intVal;
311             WorkStatus::ClearUidLastTimeMap(uid);
312             [[fallthrough]];
313         }
314         case PolicyType::APP_DATA_CLEAR: {
315             auto ws = wss_.promote();
316             ws->StopAndClearWorksByUid(detectorVal->intVal);
317             break;
318         }
319         default: {}
320     }
321     CheckWorkToRun();
322 }
323 
CheckWorkToRun()324 void WorkPolicyManager::CheckWorkToRun()
325 {
326     WS_HILOGD("Check work to run.");
327     RemoveAllUnReady();
328     if (handler_ == nullptr) {
329         WS_HILOGE("handler lock() returns nullptr");
330         return;
331     }
332     handler_->RemoveEvent(WorkEventHandler::RETRIGGER_MSG);
333     shared_ptr<WorkStatus> topWork = GetWorkToRun();
334     if (topWork == nullptr) {
335         WS_HILOGD("no condition ready work not running, return.");
336         return;
337     }
338     if (GetRunningCount() < GetMaxRunningCount()) {
339         WS_HILOGD("running count < max running count");
340         RealStartWork(topWork);
341         SendRetrigger(DELAY_TIME_SHORT);
342     } else {
343         WS_HILOGD("trigger delay: %{public}d", DELAY_TIME_LONG);
344         SendRetrigger(DELAY_TIME_LONG);
345     }
346     WS_HILOGD("out");
347 }
348 
RemoveAllUnReady()349 void WorkPolicyManager::RemoveAllUnReady()
350 {
351     std::lock_guard<std::mutex> lock(conditionReadyMutex_);
352     conditionReadyQueue_->RemoveUnReady();
353 }
354 
GetWorkToRun()355 std::shared_ptr<WorkStatus> WorkPolicyManager::GetWorkToRun()
356 {
357     std::lock_guard<std::mutex> lock(conditionReadyMutex_);
358     shared_ptr<WorkStatus> topWork = conditionReadyQueue_->GetWorkToRunByPriority();
359     return topWork;
360 }
361 
RealStartWork(std::shared_ptr<WorkStatus> topWork)362 void WorkPolicyManager::RealStartWork(std::shared_ptr<WorkStatus> topWork)
363 {
364     WS_HILOGD("RealStartWork topWork ID: %{public}s", topWork->workId_.c_str());
365     auto wmsptr = wss_.promote();
366     if (wmsptr == nullptr) {
367         WS_HILOGE("Workscheduler service is null");
368         return;
369     }
370     UpdateWatchdogTime(wmsptr, topWork);
371     topWork->MarkStatus(WorkStatus::Status::RUNNING);
372     wmsptr->UpdateWorkBeforeRealStart(topWork);
373     RemoveFromReadyQueue(topWork);
374     bool ret = workConnManager_->StartWork(topWork);
375     if (ret) {
376         AddWatchdogForWork(topWork);
377         topWork->UpdateUidLastTimeMap();
378     } else {
379         if (!topWork->IsRepeating()) {
380             topWork->MarkStatus(WorkStatus::Status::REMOVED);
381             RemoveFromUidQueue(topWork, topWork->uid_);
382         } else {
383             topWork->MarkStatus(WorkStatus::Status::WAIT_CONDITION);
384         }
385     }
386 }
387 
UpdateWatchdogTime(const wptr<WorkSchedulerService> & wmsptr,std::shared_ptr<WorkStatus> & topWork)388 void WorkPolicyManager::UpdateWatchdogTime(const wptr<WorkSchedulerService> &wmsptr,
389     std::shared_ptr<WorkStatus> &topWork)
390 {
391     if (!wmsptr->CheckEffiResApplyInfo(topWork->uid_)) {
392         SetWatchdogTime(g_lastWatchdogTime);
393         return;
394     }
395     int32_t chargerStatus = 0;
396     auto iter = topWork->conditionMap_.find(WorkCondition::Type::CHARGER);
397     if (iter != topWork->conditionMap_.end() && iter->second) {
398         chargerStatus = topWork->conditionMap_.at(WorkCondition::Type::CHARGER)->enumVal;
399     } else {
400         WS_HILOGD("charger is in CHARGING_UNKNOWN status");
401         chargerStatus = static_cast<int32_t>(WorkCondition::Charger::CHARGING_UNKNOWN);
402     }
403     if (chargerStatus == static_cast<int32_t>(WorkCondition::Charger::CHARGING_UNPLUGGED)
404         || chargerStatus == static_cast<int32_t>(WorkCondition::Charger::CHARGING_UNKNOWN)) {
405         WS_HILOGD("charger is in CHARGING_UNKNOWN or CHARGING_UNPLUGGED status");
406         SetWatchdogTime(MEDIUM_WATCHDOG_TIME);
407     } else {
408         WS_HILOGD("charger is in CHARGING status");
409         SetWatchdogTime(LONG_WATCHDOG_TIME);
410     }
411 }
412 
AddWatchdogForWork(std::shared_ptr<WorkStatus> workStatus)413 void WorkPolicyManager::AddWatchdogForWork(std::shared_ptr<WorkStatus> workStatus)
414 {
415     uint32_t watchId = NewWatchdogId();
416     watchdog_->AddWatchdog(watchId, watchdogTime_);
417     std::lock_guard<std::mutex> lock(watchdogIdMapMutex_);
418     watchdogIdMap_.emplace(watchId, workStatus);
419 }
420 
SendRetrigger(int32_t delaytime)421 void WorkPolicyManager::SendRetrigger(int32_t delaytime)
422 {
423     WS_HILOGD("enter");
424     if (handler_ == nullptr) {
425         return;
426     }
427     WS_HILOGD("delay = %{public}d", delaytime);
428     handler_->SendEvent(InnerEvent::Get(WorkEventHandler::RETRIGGER_MSG, 0), delaytime);
429 }
430 
WatchdogTimeOut(uint32_t watchdogId)431 void WorkPolicyManager::WatchdogTimeOut(uint32_t watchdogId)
432 {
433     WS_HILOGD("WatchdogTimeOut.");
434     std::shared_ptr<WorkStatus> workStatus = GetWorkFromWatchdog(watchdogId);
435     auto wmsptr = wss_.promote();
436     if (wmsptr == nullptr) {
437         WS_HILOGE("Workscheduler service is null");
438         return;
439     }
440     wmsptr->WatchdogTimeOut(workStatus);
441 }
442 
GetWorkFromWatchdog(uint32_t id)443 std::shared_ptr<WorkStatus> WorkPolicyManager::GetWorkFromWatchdog(uint32_t id)
444 {
445     std::lock_guard<std::mutex> lock(watchdogIdMapMutex_);
446     return watchdogIdMap_.at(id);
447 }
448 
ObtainAllWorks(int32_t & uid)449 list<shared_ptr<WorkInfo>> WorkPolicyManager::ObtainAllWorks(int32_t &uid)
450 {
451     WS_HILOGD("Wenter");
452     std::lock_guard<std::mutex> lock(uidMapMutex_);
453     list<shared_ptr<WorkInfo>> allWorks;
454     if (uidQueueMap_.count(uid) > 0) {
455         auto queue = uidQueueMap_.at(uid);
456         auto allWorkStatus = queue->GetWorkList();
457         std::transform(allWorkStatus.begin(), allWorkStatus.end(), std::back_inserter(allWorks),
458             [](std::shared_ptr<WorkStatus> it) { return it->workInfo_; });
459     }
460     return allWorks;
461 }
462 
GetWorkStatus(int32_t & uid,int32_t & workId)463 shared_ptr<WorkInfo> WorkPolicyManager::GetWorkStatus(int32_t &uid, int32_t &workId)
464 {
465     WS_HILOGD("enter");
466     std::lock_guard<std::mutex> lock(uidMapMutex_);
467     if (uidQueueMap_.count(uid) > 0) {
468         auto queue = uidQueueMap_.at(uid);
469         auto workStatus = queue->Find(string("u") + to_string(uid) + "_" + to_string(workId));
470         if (workStatus != nullptr) {
471             return workStatus->workInfo_;
472         }
473     }
474     return nullptr;
475 }
476 
GetAllWorkStatus(int32_t & uid)477 list<std::shared_ptr<WorkStatus>> WorkPolicyManager::GetAllWorkStatus(int32_t &uid)
478 {
479     WS_HILOGD("enter");
480     std::lock_guard<std::mutex> lock(uidMapMutex_);
481     list<shared_ptr<WorkStatus>> allWorks;
482     if (uidQueueMap_.count(uid) > 0) {
483         allWorks = uidQueueMap_.at(uid)->GetWorkList();
484     }
485     return allWorks;
486 }
487 
DumpConditionReadyQueue(string & result)488 void WorkPolicyManager::DumpConditionReadyQueue(string& result)
489 {
490     std::lock_guard<std::mutex> lock(conditionReadyMutex_);
491     conditionReadyQueue_->Dump(result);
492 }
493 
DumpUidQueueMap(string & result)494 void WorkPolicyManager::DumpUidQueueMap(string& result)
495 {
496     std::lock_guard<std::mutex> lock(uidMapMutex_);
497     for (auto it : uidQueueMap_) {
498         result.append("uid: " + std::to_string(it.first) + ":\n");
499         it.second->Dump(result);
500     }
501 }
502 
Dump(string & result)503 void WorkPolicyManager::Dump(string& result)
504 {
505     WS_HILOGI("enter");
506     result.append("1. workPolicyManager conditionReadyQueue:\n");
507     DumpConditionReadyQueue(result);
508     result.append("\n");
509 
510     result.append("2. workPolicyManager uidQueueMap:\n");
511     DumpUidQueueMap(result);
512 
513     result.append("3. GetMaxRunningCount:");
514     result.append(to_string(GetMaxRunningCount()) + "\n");
515 }
516 
NewWatchdogId()517 uint32_t WorkPolicyManager::NewWatchdogId()
518 {
519     if (watchdogId_ == MAX_WATCHDOG_ID) {
520         watchdogId_ = INIT_WATCHDOG_ID;
521     }
522     return watchdogId_++;
523 }
524 
GetDumpSetMemory()525 int32_t WorkPolicyManager::GetDumpSetMemory()
526 {
527     return dumpSetMemory_;
528 }
529 
SetMemoryByDump(int32_t memory)530 void WorkPolicyManager::SetMemoryByDump(int32_t memory)
531 {
532     dumpSetMemory_ = memory;
533 }
534 
SetWatchdogTimeByDump(int32_t time)535 void WorkPolicyManager::SetWatchdogTimeByDump(int32_t time)
536 {
537     WS_HILOGD("Set watchdog time by dump to %{public}d", time);
538     watchdogTime_ = time == 0 ? WATCHDOG_TIME : time;
539     g_lastWatchdogTime = watchdogTime_;
540 }
541 
SetWatchdogTime(int32_t time)542 void WorkPolicyManager::SetWatchdogTime(int32_t time)
543 {
544     watchdogTime_ = time;
545 }
546 
GetWatchdogTime()547 int32_t WorkPolicyManager::WorkPolicyManager::GetWatchdogTime()
548 {
549     return watchdogTime_;
550 }
551 } // namespace WorkScheduler
552 } // namespace OHOS
553