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 #include "system_load.h"
16 
17 #include "dfs_error.h"
18 #include "parameters.h"
19 #include "task_state_manager.h"
20 #include "utils_log.h"
21 #include "res_sched_client.h"
22 
23 namespace OHOS::FileManagement::CloudSync {
24 
SetDataSycner(std::shared_ptr<CloudFile::DataSyncManager> dataSyncManager)25 void SystemLoadListener::SetDataSycner(std::shared_ptr<CloudFile::DataSyncManager> dataSyncManager)
26 {
27     dataSyncManager_ = dataSyncManager;
28 }
29 
RegisterSystemloadCallback(std::shared_ptr<CloudFile::DataSyncManager> dataSyncManager)30 void SystemLoadStatus::RegisterSystemloadCallback(std::shared_ptr<CloudFile::DataSyncManager> dataSyncManager)
31 {
32     sptr<SystemLoadListener> loadListener = new (std::nothrow) SystemLoadListener();
33     if (loadListener == nullptr) {
34         return;
35     }
36     loadListener->SetDataSycner(dataSyncManager);
37     ResourceSchedule::ResSchedClient::GetInstance().RegisterSystemloadNotifier(loadListener);
38 }
39 
OnSystemloadLevel(int32_t level)40 void SystemLoadListener::OnSystemloadLevel(int32_t level)
41 {
42     SystemLoadStatus::Setload(level);
43     if (level >= SYSTEMLOADLEVEL_HOT) {
44         LOGI("OnSystemloadLevel over warm");
45     } else if (dataSyncManager_) {
46         std::string systemLoadSync = system::GetParameter(TEMPERATURE_SYSPARAM_SYNC, "");
47         std::string systemLoadThumb = system::GetParameter(TEMPERATURE_SYSPARAM_THUMB, "");
48         LOGI("OnSystemloadLevel is normal, level:%{public}d", level);
49         if (systemLoadSync == "true") {
50             LOGI("SetParameter TEMPERATURE_SYSPARAM_SYNC false");
51             system::SetParameter(TEMPERATURE_SYSPARAM_SYNC, "false");
52             TaskStateManager::GetInstance().StartTask();
53             dataSyncManager_->TriggerRecoverySync(SyncTriggerType::SYSTEM_LOAD_TRIGGER);
54         }
55         if (systemLoadThumb == "true") {
56             LOGI("SetParameter TEMPERATURE_SYSPARAM_THUMB false");
57             system::SetParameter(TEMPERATURE_SYSPARAM_THUMB, "false");
58             TaskStateManager::GetInstance().StartTask();
59             dataSyncManager_->DownloadThumb();
60         }
61     }
62 }
63 
GetSystemloadLevel()64 void SystemLoadStatus::GetSystemloadLevel()
65 {
66     loadstatus_ = ResourceSchedule::ResSchedClient::GetInstance().GetSystemloadLevel();
67     LOGI("GetSystemloadLevel finish, loadstatus:%{public}d", loadstatus_);
68 }
69 
Setload(int32_t load)70 void SystemLoadStatus::Setload(int32_t load)
71 {
72     loadstatus_ = load;
73 }
74 
InitSystemload(std::shared_ptr<CloudFile::DataSyncManager> dataSyncManager)75 void SystemLoadStatus::InitSystemload(std::shared_ptr<CloudFile::DataSyncManager> dataSyncManager)
76 {
77     GetSystemloadLevel();
78     RegisterSystemloadCallback(dataSyncManager);
79 }
80 
IsLoadStatusUnderHot(STOPPED_TYPE process)81 bool SystemLoadStatus::IsLoadStatusUnderHot(STOPPED_TYPE process)
82 {
83     if (loadstatus_ > SYSTEMLOADLEVEL_HOT) {
84         if (process == STOPPED_IN_THUMB) {
85             LOGI("SetParameter TEMPERATURE_SYSPARAM_THUMB true");
86             system::SetParameter(TEMPERATURE_SYSPARAM_THUMB, "true");
87         } else if (process == STOPPED_IN_SYNC) {
88             LOGI("SetParameter TEMPERATURE_SYSPARAM_SYNC true");
89             system::SetParameter(TEMPERATURE_SYSPARAM_SYNC, "true");
90         }
91         return false;
92     }
93     return true;
94 }
95 }