Index: runtime/vm/freelist.cc |
diff --git a/runtime/vm/freelist.cc b/runtime/vm/freelist.cc |
index b8df85169f1d710eda0df3d953442e9bd93c42c6..b90f93fe79613d1003bbf2f5ea82f6f38e788616 100644 |
--- a/runtime/vm/freelist.cc |
+++ b/runtime/vm/freelist.cc |
@@ -4,13 +4,12 @@ |
#include "vm/freelist.h" |
-#include <map> |
- |
#include "vm/bit_set.h" |
+#include "vm/hash_map.h" |
#include "vm/lockers.h" |
#include "vm/object.h" |
-#include "vm/raw_object.h" |
#include "vm/os_thread.h" |
+#include "vm/raw_object.h" |
namespace dart { |
@@ -286,26 +285,53 @@ void FreeList::PrintSmall() const { |
} |
+class IntptrPair { |
+ public: |
+ IntptrPair() : first_(-1), second_(-1) {} |
+ IntptrPair(intptr_t first, intptr_t second) |
+ : first_(first), second_(second) {} |
+ |
+ intptr_t first() const { return first_; } |
+ intptr_t second() const { return second_; } |
+ void set_second(intptr_t s) { second_ = s; } |
+ |
+ bool operator==(const IntptrPair& other) { |
+ return (first_ == other.first_) && (second_ == other.second_); |
+ } |
+ |
+ bool operator!=(const IntptrPair& other) { |
+ return (first_ != other.first_) || (second_ != other.second_); |
+ } |
+ |
+ private: |
+ intptr_t first_; |
+ intptr_t second_; |
+}; |
+ |
+ |
void FreeList::PrintLarge() const { |
int large_sizes = 0; |
int large_objects = 0; |
intptr_t large_bytes = 0; |
- std::map<intptr_t, intptr_t> sorted; |
- std::map<intptr_t, intptr_t>::iterator it; |
+ MallocDirectChainedHashMap<NumbersKeyValueTrait<IntptrPair> > map; |
FreeListElement* node; |
for (node = free_lists_[kNumLists]; node != NULL; node = node->next()) { |
- it = sorted.find(node->Size()); |
- if (it != sorted.end()) { |
- it->second += 1; |
- } else { |
+ IntptrPair* pair = map.Lookup(node->Size()); |
+ if (pair == NULL) { |
large_sizes += 1; |
- sorted.insert(std::make_pair(node->Size(), 1)); |
+ map.Insert(IntptrPair(node->Size(), 1)); |
+ } else { |
+ pair->set_second(pair->second() + 1); |
} |
large_objects += 1; |
} |
- for (it = sorted.begin(); it != sorted.end(); ++it) { |
- intptr_t size = it->first; |
- intptr_t list_length = it->second; |
+ |
+ MallocDirectChainedHashMap<NumbersKeyValueTrait<IntptrPair> >::Iterator it = |
+ map.GetIterator(); |
+ IntptrPair* pair; |
+ while ((pair = it.Next()) != NULL) { |
+ intptr_t size = pair->first(); |
+ intptr_t list_length = pair->second(); |
intptr_t list_bytes = list_length * size; |
large_bytes += list_bytes; |
OS::Print("large %3" Pd " [%8" Pd " bytes] : " |