1 /*
2  * Copyright (c) 2024 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 "recovery_info_timer.h"
17 #include "app_exit_reason_data_manager.h"
18 
19 namespace OHOS {
20 namespace AAFwk {
21 constexpr int32_t HOURS_TO_SECOND = 60 * 60;
22 constexpr int32_t TIMEOUT_DELETE_TIME = 168;
23 constexpr int32_t RESERVE_NUM = 5;
24 
GetInstance()25 RecoveryInfoTimer& RecoveryInfoTimer::GetInstance()
26 {
27     static RecoveryInfoTimer instance;
28     return instance;
29 }
SubmitSaveRecoveryInfo(RecoveryInfo recoveryInfo)30 void RecoveryInfoTimer::SubmitSaveRecoveryInfo(RecoveryInfo recoveryInfo)
31 {
32     std::lock_guard<std::mutex> lock(recoveryInfoQueueLock_);
33     auto findByInfo = [&recoveryInfo](RecoveryInfo& item) {
34         return item.abilityName == recoveryInfo.abilityName && item.bundleName == recoveryInfo.bundleName &&
35             item.moduleName == recoveryInfo.moduleName;
36     };
37     auto i = find_if(recoveryInfoQueue_.begin(), recoveryInfoQueue_.end(), findByInfo);
38     if (i != recoveryInfoQueue_.end()) {
39         recoveryInfoQueue_.erase(i);
40     }
41     recoveryInfoQueue_.push_back(recoveryInfo);
42 
43     int64_t now = recoveryInfo.time;
44     auto timeoutDeleteTime = TIMEOUT_DELETE_TIME * HOURS_TO_SECOND;
45     auto reserveNumber = RESERVE_NUM;
46     int timeoutCount = 0;
47     for (auto p = recoveryInfoQueue_.begin(); p != recoveryInfoQueue_.end(); p++) {
48         if (now - p->time >= timeoutDeleteTime) {
49             timeoutCount++;
50         }
51     }
52 
53     timeoutCount -= reserveNumber;
54     for (; timeoutCount > 0; timeoutCount--) {
55         auto recoveryInfo = recoveryInfoQueue_.begin();
56         TAG_LOGI(AAFwkTag::ABILITYMGR, "clearRecoveryInfo bundleName = %{public}s, abilityName = %{public}s",
57             recoveryInfo->bundleName.c_str(), recoveryInfo->abilityName.c_str());
58         (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
59             DeleteAbilityRecoverInfo(recoveryInfo->tokenId, recoveryInfo->moduleName, recoveryInfo->abilityName);
60         recoveryInfoQueue_.pop_front();
61     }
62 }
63 }
64 }