1/* 2 * Copyright (c) 2023-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 "freeze_util.h" 17 18#include "hilog_tag_wrapper.h" 19#include "time_util.h" 20 21namespace OHOS::AbilityRuntime { 22FreezeUtil& FreezeUtil::GetInstance() 23{ 24 static FreezeUtil instance; 25 return instance; 26} 27 28void FreezeUtil::AddLifecycleEvent(const LifecycleFlow &flow, const std::string &entry) 29{ 30 auto newEntry = TimeUtil::DefaultCurrentTimeStr() + "; " + entry; 31 std::lock_guard lock(mutex_); 32 auto iter = lifecycleFlow_.find(flow); 33 if (iter != lifecycleFlow_.end()) { 34 iter->second += "\n" + newEntry; 35 } else { 36 lifecycleFlow_.emplace(flow, newEntry); 37 } 38} 39 40bool FreezeUtil::AppendLifecycleEvent(const LifecycleFlow &flow, const std::string &entry) 41{ 42 std::lock_guard lock(mutex_); 43 auto iter = lifecycleFlow_.find(flow); 44 if (iter == lifecycleFlow_.end()) { 45 return false; 46 } 47 auto newEntry = TimeUtil::DefaultCurrentTimeStr() + "; " + entry; 48 iter->second += "\n" + newEntry; 49 return true; 50} 51 52std::string FreezeUtil::GetLifecycleEvent(const LifecycleFlow &flow) 53{ 54 std::lock_guard lock(mutex_); 55 auto search = lifecycleFlow_.find(flow); 56 if (search != lifecycleFlow_.end()) { 57 return search->second; 58 } 59 return ""; 60} 61 62void FreezeUtil::DeleteLifecycleEvent(const LifecycleFlow &flow) 63{ 64 std::lock_guard lock(mutex_); 65 DeleteLifecycleEventInner(flow); 66} 67 68void FreezeUtil::DeleteLifecycleEvent(sptr<IRemoteObject> token) 69{ 70 std::lock_guard lock(mutex_); 71 if (lifecycleFlow_.empty()) { 72 return; 73 } 74 LifecycleFlow foregroundFlow = { token, TimeoutState::FOREGROUND }; 75 DeleteLifecycleEventInner(foregroundFlow); 76 77 LifecycleFlow backgroundFlow = { token, TimeoutState::BACKGROUND }; 78 DeleteLifecycleEventInner(backgroundFlow); 79} 80 81void FreezeUtil::DeleteLifecycleEventInner(const LifecycleFlow &flow) 82{ 83 if (lifecycleFlow_.count(flow)) { 84 lifecycleFlow_.erase(flow); 85 } 86 TAG_LOGD(AAFwkTag::DEFAULT, "lifecycleFlow size: %{public}zu", lifecycleFlow_.size()); 87} 88 89void FreezeUtil::AddAppLifecycleEvent(pid_t pid, const std::string &entry) 90{ 91 std::lock_guard lock(mutex_); 92 auto newEntry = TimeUtil::DefaultCurrentTimeStr() + "; " + entry; 93 auto iter = appLifeCycleFlow_.find(pid); 94 if (iter != appLifeCycleFlow_.end()) { 95 iter->second += "\n" + newEntry; 96 } else { 97 appLifeCycleFlow_.emplace(pid, newEntry); 98 } 99} 100 101void FreezeUtil::DeleteAppLifecycleEvent(pid_t pid) 102{ 103 std::lock_guard lock(mutex_); 104 appLifeCycleFlow_.erase(pid); 105} 106 107std::string FreezeUtil::GetAppLifecycleEvent(pid_t pid) 108{ 109 std::lock_guard lock(mutex_); 110 auto search = appLifeCycleFlow_.find(pid); 111 if (search != appLifeCycleFlow_.end()) { 112 return search->second; 113 } 114 return ""; 115} 116} // namespace OHOS::AbilityRuntime 117