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