1eace7efcSopenharmony_ci/*
2eace7efcSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3eace7efcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4eace7efcSopenharmony_ci * you may not use this file except in compliance with the License.
5eace7efcSopenharmony_ci * You may obtain a copy of the License at
6eace7efcSopenharmony_ci *
7eace7efcSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8eace7efcSopenharmony_ci *
9eace7efcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10eace7efcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11eace7efcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12eace7efcSopenharmony_ci * See the License for the specific language governing permissions and
13eace7efcSopenharmony_ci * limitations under the License.
14eace7efcSopenharmony_ci */
15eace7efcSopenharmony_ci
16eace7efcSopenharmony_ci#ifndef OHOS_ABILITY_RUNTIME_APPFREEZE_MAMAGER_H
17eace7efcSopenharmony_ci#define OHOS_ABILITY_RUNTIME_APPFREEZE_MAMAGER_H
18eace7efcSopenharmony_ci
19eace7efcSopenharmony_ci#include <sys/types.h>
20eace7efcSopenharmony_ci
21eace7efcSopenharmony_ci#include <fstream>
22eace7efcSopenharmony_ci#include <map>
23eace7efcSopenharmony_ci#include <memory>
24eace7efcSopenharmony_ci#include <set>
25eace7efcSopenharmony_ci#include <string>
26eace7efcSopenharmony_ci#include <vector>
27eace7efcSopenharmony_ci
28eace7efcSopenharmony_ci#include "cpp/mutex.h"
29eace7efcSopenharmony_ci#include "cpp/condition_variable.h"
30eace7efcSopenharmony_ci#include "fault_data.h"
31eace7efcSopenharmony_ci#include "freeze_util.h"
32eace7efcSopenharmony_ci
33eace7efcSopenharmony_cinamespace OHOS {
34eace7efcSopenharmony_ciusing AbilityRuntime::FreezeUtil;
35eace7efcSopenharmony_cinamespace AppExecFwk {
36eace7efcSopenharmony_ciclass AppfreezeManager : public std::enable_shared_from_this<AppfreezeManager> {
37eace7efcSopenharmony_cipublic:
38eace7efcSopenharmony_ci    struct AppInfo {
39eace7efcSopenharmony_ci        int pid;
40eace7efcSopenharmony_ci        int uid;
41eace7efcSopenharmony_ci        std::string bundleName;
42eace7efcSopenharmony_ci        std::string processName;
43eace7efcSopenharmony_ci    };
44eace7efcSopenharmony_ci
45eace7efcSopenharmony_ci    enum TypeAttribute {
46eace7efcSopenharmony_ci        NORMAL_TIMEOUT = 0,
47eace7efcSopenharmony_ci        CRITICAL_TIMEOUT = 1,
48eace7efcSopenharmony_ci    };
49eace7efcSopenharmony_ci
50eace7efcSopenharmony_ci    enum AppFreezeState {
51eace7efcSopenharmony_ci        APPFREEZE_STATE_IDLE = 0,
52eace7efcSopenharmony_ci        APPFREEZE_STATE_FREEZE = 1,
53eace7efcSopenharmony_ci        APPFREEZE_STATE_CANCELING = 2,
54eace7efcSopenharmony_ci        APPFREEZE_STATE_CANCELED = 3,
55eace7efcSopenharmony_ci    };
56eace7efcSopenharmony_ci
57eace7efcSopenharmony_ci    struct AppFreezeInfo {
58eace7efcSopenharmony_ci        int32_t pid = 0;
59eace7efcSopenharmony_ci        int state = 0;
60eace7efcSopenharmony_ci        int64_t occurTime = 0;
61eace7efcSopenharmony_ci    };
62eace7efcSopenharmony_ci
63eace7efcSopenharmony_ci    struct ParamInfo {
64eace7efcSopenharmony_ci        int typeId = TypeAttribute::NORMAL_TIMEOUT;
65eace7efcSopenharmony_ci        int32_t pid = 0;
66eace7efcSopenharmony_ci        std::string eventName;
67eace7efcSopenharmony_ci        std::string bundleName;
68eace7efcSopenharmony_ci        std::string msg;
69eace7efcSopenharmony_ci    };
70eace7efcSopenharmony_ci
71eace7efcSopenharmony_ci    AppfreezeManager();
72eace7efcSopenharmony_ci    ~AppfreezeManager();
73eace7efcSopenharmony_ci
74eace7efcSopenharmony_ci    static std::shared_ptr<AppfreezeManager> GetInstance();
75eace7efcSopenharmony_ci    static void DestroyInstance();
76eace7efcSopenharmony_ci    int AppfreezeHandle(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo);
77eace7efcSopenharmony_ci    int AppfreezeHandleWithStack(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo);
78eace7efcSopenharmony_ci    int LifecycleTimeoutHandle(const ParamInfo& info, FreezeUtil::LifecycleFlow flow = FreezeUtil::LifecycleFlow());
79eace7efcSopenharmony_ci    std::string WriteToFile(const std::string& fileName, std::string& content);
80eace7efcSopenharmony_ci    bool IsHandleAppfreeze(const std::string& bundleName);
81eace7efcSopenharmony_ci    bool IsProcessDebug(int32_t pid, std::string bundleName);
82eace7efcSopenharmony_ci    bool IsNeedIgnoreFreezeEvent(int32_t pid);
83eace7efcSopenharmony_ci    void DeleteStack(int pid);
84eace7efcSopenharmony_ci    bool CancelAppFreezeDetect(int32_t pid, const std::string& bundleName);
85eace7efcSopenharmony_ci    void RemoveDeathProcess(std::string bundleName);
86eace7efcSopenharmony_ci    void ResetAppfreezeState(int32_t pid, const std::string& bundleName);
87eace7efcSopenharmony_ci    bool IsValidFreezeFilter(int32_t pid, const std::string& bundleName);
88eace7efcSopenharmony_ci
89eace7efcSopenharmony_ciprivate:
90eace7efcSopenharmony_ci    AppfreezeManager& operator=(const AppfreezeManager&) = delete;
91eace7efcSopenharmony_ci    AppfreezeManager(const AppfreezeManager&) = delete;
92eace7efcSopenharmony_ci    uint64_t GetMilliseconds();
93eace7efcSopenharmony_ci    std::map<int, std::set<int>> BinderParser(std::ifstream& fin, std::string& stack) const;
94eace7efcSopenharmony_ci    void ParseBinderPids(const std::map<int, std::set<int>>& binderInfo, std::set<int>& pids, int pid, int layer) const;
95eace7efcSopenharmony_ci    std::set<int> GetBinderPeerPids(std::string& stack, int pid) const;
96eace7efcSopenharmony_ci    void FindStackByPid(std::string& ret, int pid) const;
97eace7efcSopenharmony_ci    std::string CatchJsonStacktrace(int pid, const std::string& faultType) const;
98eace7efcSopenharmony_ci    std::string CatcherStacktrace(int pid) const;
99eace7efcSopenharmony_ci    int AcquireStack(const FaultData& faultData, const AppInfo& appInfo, const std::string& memoryContent);
100eace7efcSopenharmony_ci    int NotifyANR(const FaultData& faultData, const AppfreezeManager::AppInfo& appInfo,
101eace7efcSopenharmony_ci        const std::string& binderInfo, const std::string& memoryContent);
102eace7efcSopenharmony_ci    int64_t GetFreezeCurrentTime();
103eace7efcSopenharmony_ci    void SetFreezeState(int32_t pid, int state);
104eace7efcSopenharmony_ci    int GetFreezeState(int32_t pid);
105eace7efcSopenharmony_ci    int64_t GetFreezeTime(int32_t pid);
106eace7efcSopenharmony_ci    void ClearOldInfo();
107eace7efcSopenharmony_ci    void CollectFreezeSysMemory(std::string& memoryContent);
108eace7efcSopenharmony_ci
109eace7efcSopenharmony_ci    static const inline std::string LOGGER_DEBUG_PROC_PATH = "/proc/transaction_proc";
110eace7efcSopenharmony_ci    std::string name_;
111eace7efcSopenharmony_ci    static ffrt::mutex singletonMutex_;
112eace7efcSopenharmony_ci    static std::shared_ptr<AppfreezeManager> instance_;
113eace7efcSopenharmony_ci    static ffrt::mutex freezeMutex_;
114eace7efcSopenharmony_ci    std::map<int32_t, AppFreezeInfo> appfreezeInfo_;
115eace7efcSopenharmony_ci    static ffrt::mutex catchStackMutex_;
116eace7efcSopenharmony_ci    static std::map<int, std::string> catchStackMap_;
117eace7efcSopenharmony_ci    static ffrt::mutex freezeFilterMutex_;
118eace7efcSopenharmony_ci    std::map<std::string, AppFreezeInfo> appfreezeFilterMap_;
119eace7efcSopenharmony_ci};
120eace7efcSopenharmony_ci}  // namespace AppExecFwk
121eace7efcSopenharmony_ci}  // namespace OHOS
122eace7efcSopenharmony_ci#endif  // OHOS_ABILITY_RUNTIME_APPFREEZE_MAMAGER_H