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/simple_task_statistics_impl.h"
17 #include "libpandabase/taskmanager/task.h"
18
19 namespace panda::taskmanager {
20
SimpleTaskStatisticsImpl()21 SimpleTaskStatisticsImpl::SimpleTaskStatisticsImpl()
22 {
23 for (const auto &status : ALL_TASK_STATUSES) {
24 perStatusLock_[status]; // Here we use implicitly construction of mutex
25 for (const auto &properties : allTaskProperties_) {
26 taskPropertiesCounterMap_[status][properties] = 0;
27 }
28 }
29 }
30
IncrementCount(TaskStatus status,TaskProperties properties,size_t count)31 void SimpleTaskStatisticsImpl::IncrementCount(TaskStatus status, TaskProperties properties, size_t count)
32 {
33 os::memory::LockHolder lockHolder(perStatusLock_.at(status));
34 taskPropertiesCounterMap_.at(status)[properties] += count;
35 }
36
GetCount(TaskStatus status,TaskProperties properties) const37 size_t SimpleTaskStatisticsImpl::GetCount(TaskStatus status, TaskProperties properties) const
38 {
39 os::memory::LockHolder lockHolder(perStatusLock_.at(status));
40 return taskPropertiesCounterMap_.at(status).at(properties);
41 }
42
GetCountOfTaskInSystem() const43 size_t SimpleTaskStatisticsImpl::GetCountOfTaskInSystem() const
44 {
45 os::memory::LockHolder addedLockHolder(perStatusLock_.at(TaskStatus::ADDED));
46 os::memory::LockHolder executedLockHolder(perStatusLock_.at(TaskStatus::EXECUTED));
47 os::memory::LockHolder poppedLockHolder(perStatusLock_.at(TaskStatus::POPPED));
48
49 size_t inSystemTasksCount = 0;
50 for (const auto &properties : allTaskProperties_) {
51 size_t addedTaskCountVal = taskPropertiesCounterMap_.at(TaskStatus::ADDED).at(properties);
52 size_t executedTaskCountVal = taskPropertiesCounterMap_.at(TaskStatus::EXECUTED).at(properties);
53 size_t poppedTaskCountVal = taskPropertiesCounterMap_.at(TaskStatus::POPPED).at(properties);
54
55 ASSERT(addedTaskCountVal >= executedTaskCountVal + poppedTaskCountVal);
56 inSystemTasksCount += addedTaskCountVal - executedTaskCountVal - poppedTaskCountVal;
57 }
58 return inSystemTasksCount;
59 }
60
GetCountOfTasksInSystemWithTaskProperties(TaskProperties properties) const61 size_t SimpleTaskStatisticsImpl::GetCountOfTasksInSystemWithTaskProperties(TaskProperties properties) const
62 {
63 os::memory::LockHolder addedLockHolder(perStatusLock_.at(TaskStatus::ADDED));
64 os::memory::LockHolder executedLockHolder(perStatusLock_.at(TaskStatus::EXECUTED));
65 os::memory::LockHolder poppedLockHolder(perStatusLock_.at(TaskStatus::POPPED));
66
67 size_t addedTaskCountVal = taskPropertiesCounterMap_.at(TaskStatus::ADDED).at(properties);
68 size_t executedTaskCountVal = taskPropertiesCounterMap_.at(TaskStatus::EXECUTED).at(properties);
69 size_t poppedTaskCountVal = taskPropertiesCounterMap_.at(TaskStatus::POPPED).at(properties);
70
71 ASSERT(addedTaskCountVal >= executedTaskCountVal + poppedTaskCountVal);
72 return addedTaskCountVal - executedTaskCountVal - poppedTaskCountVal;
73 }
74
ResetAllCounters()75 void SimpleTaskStatisticsImpl::ResetAllCounters()
76 {
77 for (const auto &properties : allTaskProperties_) {
78 ResetCountersWithTaskProperties(properties);
79 }
80 }
81
ResetCountersWithTaskProperties(TaskProperties properties)82 void SimpleTaskStatisticsImpl::ResetCountersWithTaskProperties(TaskProperties properties)
83 {
84 // Getting locks for every state counter with specified properties
85 std::unordered_map<TaskStatus, os::memory::LockHolder<os::memory::Mutex>> lockHolderMap;
86 for (const auto &status : ALL_TASK_STATUSES) {
87 lockHolderMap.emplace(status, perStatusLock_.at(status));
88 }
89 for (const auto &status : ALL_TASK_STATUSES) {
90 taskPropertiesCounterMap_[status][properties] = 0;
91 }
92 }
93
94 } // namespace panda::taskmanager
95