| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_TRACE_EVENT_MEMORY_USAGE_ESTIMATOR_H_ | 5 #ifndef BASE_TRACE_EVENT_MEMORY_USAGE_ESTIMATOR_H_ |
| 6 #define BASE_TRACE_EVENT_MEMORY_USAGE_ESTIMATOR_H_ | 6 #define BASE_TRACE_EVENT_MEMORY_USAGE_ESTIMATOR_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <array> | 10 #include <array> |
| 11 #include <deque> | 11 #include <deque> |
| 12 #include <list> | 12 #include <list> |
| 13 #include <map> | 13 #include <map> |
| 14 #include <memory> | 14 #include <memory> |
| 15 #include <queue> | 15 #include <queue> |
| 16 #include <set> | 16 #include <set> |
| 17 #include <stack> | 17 #include <stack> |
| 18 #include <string> | 18 #include <string> |
| 19 #include <type_traits> | 19 #include <type_traits> |
| 20 #include <unordered_map> | 20 #include <unordered_map> |
| 21 #include <unordered_set> | 21 #include <unordered_set> |
| 22 #include <vector> | 22 #include <vector> |
| 23 | 23 |
| 24 #include "base/base_export.h" | 24 #include "base/base_export.h" |
| 25 #include "base/containers/linked_list.h" |
| 25 #include "base/strings/string16.h" | 26 #include "base/strings/string16.h" |
| 26 #include "base/template_util.h" | 27 #include "base/template_util.h" |
| 27 | 28 |
| 28 // Composable memory usage estimators. | 29 // Composable memory usage estimators. |
| 29 // | 30 // |
| 30 // This file defines set of EstimateMemoryUsage(object) functions that return | 31 // This file defines set of EstimateMemoryUsage(object) functions that return |
| 31 // approximate memory usage of their argument. | 32 // approximate memory usage of their argument. |
| 32 // | 33 // |
| 33 // The ultimate goal is to make memory usage estimation for a class simply a | 34 // The ultimate goal is to make memory usage estimation for a class simply a |
| 34 // matter of aggregating EstimateMemoryUsage() results over all fields. | 35 // matter of aggregating EstimateMemoryUsage() results over all fields. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 | 105 |
| 105 template <class F, class S> | 106 template <class F, class S> |
| 106 size_t EstimateMemoryUsage(const std::pair<F, S>& pair); | 107 size_t EstimateMemoryUsage(const std::pair<F, S>& pair); |
| 107 | 108 |
| 108 template <class T, class A> | 109 template <class T, class A> |
| 109 size_t EstimateMemoryUsage(const std::vector<T, A>& vector); | 110 size_t EstimateMemoryUsage(const std::vector<T, A>& vector); |
| 110 | 111 |
| 111 template <class T, class A> | 112 template <class T, class A> |
| 112 size_t EstimateMemoryUsage(const std::list<T, A>& list); | 113 size_t EstimateMemoryUsage(const std::list<T, A>& list); |
| 113 | 114 |
| 115 template <class T> |
| 116 size_t EstimateMemoryUsage(const base::LinkedList<T>& list); |
| 117 |
| 114 template <class T, class C, class A> | 118 template <class T, class C, class A> |
| 115 size_t EstimateMemoryUsage(const std::set<T, C, A>& set); | 119 size_t EstimateMemoryUsage(const std::set<T, C, A>& set); |
| 116 | 120 |
| 117 template <class T, class C, class A> | 121 template <class T, class C, class A> |
| 118 size_t EstimateMemoryUsage(const std::multiset<T, C, A>& set); | 122 size_t EstimateMemoryUsage(const std::multiset<T, C, A>& set); |
| 119 | 123 |
| 120 template <class K, class V, class C, class A> | 124 template <class K, class V, class C, class A> |
| 121 size_t EstimateMemoryUsage(const std::map<K, V, C, A>& map); | 125 size_t EstimateMemoryUsage(const std::map<K, V, C, A>& map); |
| 122 | 126 |
| 123 template <class K, class V, class C, class A> | 127 template <class K, class V, class C, class A> |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 using value_type = typename std::list<T, A>::value_type; | 349 using value_type = typename std::list<T, A>::value_type; |
| 346 struct Node { | 350 struct Node { |
| 347 Node* prev; | 351 Node* prev; |
| 348 Node* next; | 352 Node* next; |
| 349 value_type value; | 353 value_type value; |
| 350 }; | 354 }; |
| 351 return sizeof(Node) * list.size() + | 355 return sizeof(Node) * list.size() + |
| 352 EstimateIterableMemoryUsage(list); | 356 EstimateIterableMemoryUsage(list); |
| 353 } | 357 } |
| 354 | 358 |
| 359 template <class T> |
| 360 size_t EstimateMemoryUsage(const base::LinkedList<T>& list) { |
| 361 size_t memory_usage = 0u; |
| 362 for (base::LinkNode<T>* node = list.head(); node != list.end(); |
| 363 node = node->next()) { |
| 364 // Since we increment by calling node = node->next() we know that node |
| 365 // isn't nullptr. |
| 366 memory_usage += EstimateMemoryUsage(*node->value()) + sizeof(T); |
| 367 } |
| 368 return memory_usage; |
| 369 } |
| 370 |
| 355 // Tree containers | 371 // Tree containers |
| 356 | 372 |
| 357 template <class V> | 373 template <class V> |
| 358 size_t EstimateTreeMemoryUsage(size_t size) { | 374 size_t EstimateTreeMemoryUsage(size_t size) { |
| 359 // Tree containers are modeled after libc++ | 375 // Tree containers are modeled after libc++ |
| 360 // (__tree_node from include/__tree) | 376 // (__tree_node from include/__tree) |
| 361 struct Node { | 377 struct Node { |
| 362 Node* left; | 378 Node* left; |
| 363 Node* right; | 379 Node* right; |
| 364 Node* parent; | 380 Node* parent; |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 | 540 |
| 525 template <class T, class C> | 541 template <class T, class C> |
| 526 size_t EstimateMemoryUsage(const std::stack<T, C>& stack) { | 542 size_t EstimateMemoryUsage(const std::stack<T, C>& stack) { |
| 527 return EstimateMemoryUsage(internal::GetUnderlyingContainer(stack)); | 543 return EstimateMemoryUsage(internal::GetUnderlyingContainer(stack)); |
| 528 } | 544 } |
| 529 | 545 |
| 530 } // namespace trace_event | 546 } // namespace trace_event |
| 531 } // namespace base | 547 } // namespace base |
| 532 | 548 |
| 533 #endif // BASE_TRACE_EVENT_MEMORY_USAGE_ESTIMATOR_H_ | 549 #endif // BASE_TRACE_EVENT_MEMORY_USAGE_ESTIMATOR_H_ |
| OLD | NEW |