Ttantingtingfix log
4d6e224d创建于 2024年8月31日历史提交
/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "recovery_info_timer.h"
#include "app_exit_reason_data_manager.h"

namespace OHOS {
namespace AAFwk {
constexpr int32_t HOURS_TO_SECOND = 60 * 60;
constexpr int32_t TIMEOUT_DELETE_TIME = 168;
constexpr int32_t RESERVE_NUM = 5;

RecoveryInfoTimer& RecoveryInfoTimer::GetInstance()
{
    static RecoveryInfoTimer instance;
    return instance;
}
void RecoveryInfoTimer::SubmitSaveRecoveryInfo(RecoveryInfo recoveryInfo)
{
    std::lock_guard<std::mutex> lock(recoveryInfoQueueLock_);
    auto findByInfo = [&recoveryInfo](RecoveryInfo& item) {
        return item.abilityName == recoveryInfo.abilityName && item.bundleName == recoveryInfo.bundleName &&
            item.moduleName == recoveryInfo.moduleName;
    };
    auto i = find_if(recoveryInfoQueue_.begin(), recoveryInfoQueue_.end(), findByInfo);
    if (i != recoveryInfoQueue_.end()) {
        recoveryInfoQueue_.erase(i);
    }
    recoveryInfoQueue_.push_back(recoveryInfo);

    int64_t now = recoveryInfo.time;
    auto timeoutDeleteTime = TIMEOUT_DELETE_TIME * HOURS_TO_SECOND;
    auto reserveNumber = RESERVE_NUM;
    int timeoutCount = 0;
    for (auto p = recoveryInfoQueue_.begin(); p != recoveryInfoQueue_.end(); p++) {
        if (now - p->time >= timeoutDeleteTime) {
            timeoutCount++;
        }
    }

    timeoutCount -= reserveNumber;
    for (; timeoutCount > 0; timeoutCount--) {
        auto recoveryInfo = recoveryInfoQueue_.begin();
        TAG_LOGI(AAFwkTag::ABILITYMGR, "clearRecoveryInfo bundleName: %{public}s, abilityName: %{public}s",
            recoveryInfo->bundleName.c_str(), recoveryInfo->abilityName.c_str());
        (void)DelayedSingleton<AbilityRuntime::AppExitReasonDataManager>::GetInstance()->
            DeleteAbilityRecoverInfo(recoveryInfo->tokenId, recoveryInfo->moduleName, recoveryInfo->abilityName);
        recoveryInfoQueue_.pop_front();
    }
}
}
}