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