1 /*
2  * Copyright (C) 2023 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 #define MLOG_TAG "MultiStagesCaptureDfxRequestPolicy"
17 
18 #include "multistages_capture_dfx_request_policy.h"
19 
20 #include <cstdlib>
21 
22 #include "media_file_utils.h"
23 #include "media_log.h"
24 #include "post_event_utils.h"
25 
26 namespace OHOS {
27 namespace Media {
28 const int64_t REPORT_TIME_INTERVAL = 24 * 60 * 60 * 1000L; // 24 hour in milliseconds
29 
MultiStagesCaptureDfxRequestPolicy()30 MultiStagesCaptureDfxRequestPolicy::MultiStagesCaptureDfxRequestPolicy() {}
31 
~MultiStagesCaptureDfxRequestPolicy()32 MultiStagesCaptureDfxRequestPolicy::~MultiStagesCaptureDfxRequestPolicy() {}
33 
GetInstance()34 MultiStagesCaptureDfxRequestPolicy& MultiStagesCaptureDfxRequestPolicy::GetInstance()
35 {
36     static MultiStagesCaptureDfxRequestPolicy instance;
37     return instance;
38 }
39 
GetCount(const RequestPolicy policy,RequestCount & count)40 void MultiStagesCaptureDfxRequestPolicy::GetCount(const RequestPolicy policy, RequestCount &count)
41 {
42     switch (policy) {
43         case RequestPolicy::HIGH_QUALITY_MODE:
44             count.highQualityCount += 1;
45             break;
46         case RequestPolicy::BALANCE_MODE:
47             count.balanceQualityCount += 1;
48             break;
49         case RequestPolicy::FAST_MODE:
50             count.emergencyQualityCount += 1;
51             break;
52         default:
53             break;
54     }
55 }
56 
SetPolicy(const std::string & callingPackage,const RequestPolicy policy)57 void MultiStagesCaptureDfxRequestPolicy::SetPolicy(const std::string &callingPackage, const RequestPolicy policy)
58 {
59     RequestCount requestCountForEachCaller { 0, 0, 0 };
60     if (requestCountMap_.find(callingPackage) != requestCountMap_.end()) {
61         requestCountForEachCaller = requestCountMap_[callingPackage];
62         GetCount(policy, requestCountForEachCaller);
63         requestCountMap_[callingPackage] = requestCountForEachCaller;
64     } else {
65         GetCount(policy, requestCountForEachCaller);
66         requestCountMap_.emplace(callingPackage, requestCountForEachCaller);
67     }
68 
69     if (ShouldReport()) {
70         Report();
71     }
72 }
73 
ShouldReport()74 bool MultiStagesCaptureDfxRequestPolicy::ShouldReport()
75 {
76     std::lock_guard<std::mutex> lock(shouldReportMutex_);
77     if (isReporting_) {
78         return false;
79     }
80 
81     int64_t currentTime = MediaFileUtils::UTCTimeMilliSeconds();
82     if ((currentTime - lastReportTime_) < REPORT_TIME_INTERVAL) {
83         return false;
84     }
85 
86     isReporting_ = true;
87     return true;
88 }
89 
Report()90 void MultiStagesCaptureDfxRequestPolicy::Report()
91 {
92     if (requestCountMap_.empty()) {
93         return;
94     }
95 
96     for (auto iter = requestCountMap_.begin(); iter != requestCountMap_.end(); iter++) {
97         VariantMap map = {{ KEY_CALLING_PACKAGE, iter->first },
98             { KEY_HIGH_QUALITY_COUNT, iter->second.highQualityCount },
99             { KEY_BALANCE_QUALITY_COUNT, iter->second.balanceQualityCount },
100             { KEY_EMERGENCY_QUALITY_COUNT, iter->second.emergencyQualityCount }};
101 
102         MEDIA_INFO_LOG("Report caller:%{public}s, high: %{public}d, balance: %{public}d, emergency: %{public}d",
103             iter->first.c_str(), iter->second.highQualityCount, iter->second.balanceQualityCount,
104             iter->second.emergencyQualityCount);
105         PostEventUtils::GetInstance().PostStatProcess(StatType::MSC_REQUEST_POLICY_STAT, map);
106     }
107 
108     requestCountMap_.clear();
109     lastReportTime_ = MediaFileUtils::UTCTimeMilliSeconds();
110     isReporting_ = false;
111 }
112 
113 } // namespace Media
114 } // namespace OHOS