• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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