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 #include "libpandabase/taskmanager/task_statistics/fine_grained_task_statistics_impl.h"
17 #include "libpandabase/taskmanager/task.h"
18
19 namespace panda::taskmanager {
20
FineGrainedTaskStatisticsImpl()21 FineGrainedTaskStatisticsImpl::FineGrainedTaskStatisticsImpl()
22 {
23 for (const auto &status : ALL_TASK_STATUSES) {
24 for (const auto &properties : allTaskProperties_) {
25 taskPropertiesCounterMap_[status].emplace(properties, 0);
26 }
27 }
28 }
29
IncrementCount(TaskStatus status,TaskProperties properties,size_t count)30 void FineGrainedTaskStatisticsImpl::IncrementCount(TaskStatus status, TaskProperties properties, size_t count)
31 {
32 taskPropertiesCounterMap_.at(status)[properties] += count;
33 }
34
GetCount(TaskStatus status,TaskProperties properties) const35 size_t FineGrainedTaskStatisticsImpl::GetCount(TaskStatus status, TaskProperties properties) const
36 {
37 return taskPropertiesCounterMap_.at(status).at(properties).GetValue();
38 }
39
GetCountOfTaskInSystem() const40 size_t FineGrainedTaskStatisticsImpl::GetCountOfTaskInSystem() const
41 {
42 size_t inSystemTasksCount = 0;
43 for (const auto &properties : allTaskProperties_) {
44 inSystemTasksCount +=
45 CalcCountOfTasksInSystem(taskPropertiesCounterMap_.at(TaskStatus::ADDED).at(properties),
46 taskPropertiesCounterMap_.at(TaskStatus::EXECUTED).at(properties),
47 taskPropertiesCounterMap_.at(TaskStatus::POPPED).at(properties));
48 }
49 return inSystemTasksCount;
50 }
51
GetCountOfTasksInSystemWithTaskProperties(TaskProperties properties) const52 size_t FineGrainedTaskStatisticsImpl::GetCountOfTasksInSystemWithTaskProperties(TaskProperties properties) const
53 {
54 return CalcCountOfTasksInSystem(taskPropertiesCounterMap_.at(TaskStatus::ADDED).at(properties),
55 taskPropertiesCounterMap_.at(TaskStatus::EXECUTED).at(properties),
56 taskPropertiesCounterMap_.at(TaskStatus::POPPED).at(properties));
57 }
58
ResetAllCounters()59 void FineGrainedTaskStatisticsImpl::ResetAllCounters()
60 {
61 for (const auto &properties : allTaskProperties_) {
62 ResetCountersWithTaskProperties(properties);
63 }
64 }
65
ResetCountersWithTaskProperties(TaskProperties properties)66 void FineGrainedTaskStatisticsImpl::ResetCountersWithTaskProperties(TaskProperties properties)
67 {
68 // Getting locks for every state counter with specified properties
69 std::unordered_map<TaskStatus, os::memory::LockHolder<os::memory::Mutex>> lockHolderMap;
70 for (const auto &status : ALL_TASK_STATUSES) {
71 lockHolderMap.emplace(status, taskPropertiesCounterMap_[status][properties].GetMutex());
72 }
73 for (const auto &status : ALL_TASK_STATUSES) {
74 taskPropertiesCounterMap_[status][properties].NoGuardedSetValue(0);
75 }
76 }
77
78 } // namespace panda::taskmanager
79