Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(767)

Unified Diff: runtime/vm/object_set.h

Issue 11428067: Merge the Merlin heap tracing to top-of-trunk. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address review comments Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/heap_trace_test.cc ('k') | runtime/vm/pages.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object_set.h
diff --git a/runtime/vm/object_set.h b/runtime/vm/object_set.h
index 159a09218e60bf3eef201ec76842ca867b4e4448..6f687a9663af987907ae5376147e8e83dffbf09f 100644
--- a/runtime/vm/object_set.h
+++ b/runtime/vm/object_set.h
@@ -5,13 +5,29 @@
#ifndef VM_OBJECT_SET_H_
#define VM_OBJECT_SET_H_
+#include "platform/utils.h"
#include "vm/globals.h"
+#include "vm/raw_object.h"
namespace dart {
class ObjectSet {
public:
- ObjectSet(uword start, uword end) : start_(start), end_(end) {
+ ObjectSet() {
+ Init(0, 0);
+ }
+
+ ObjectSet(uword start, uword end) {
+ Init(start, end);
+ }
+
+ ~ObjectSet() {
+ delete[] allocation_;
+ }
+
+ void Init(uword start, uword end) {
+ start_ = start;
+ end_ = end;
ASSERT(start_ <= end_);
size_ = SizeFor((end_ - start_) >> kWordSizeLog2);
allocation_ = new uword[size_];
@@ -20,10 +36,6 @@ class ObjectSet {
Clear();
}
- ~ObjectSet() {
- delete[] allocation_;
- }
-
bool Contains(RawObject* raw_obj) const {
uword raw_addr = RawObject::ToAddr(raw_obj);
ASSERT(raw_addr >= start_);
@@ -39,10 +51,30 @@ class ObjectSet {
ASSERT(raw_addr < end_);
uword i = raw_addr >> kWordSizeLog2;
data_[i / kBitsPerWord] |= (static_cast<uword>(1) << (i % kBitsPerWord));
+ min_ = Utils::Minimum(raw_addr, min_);
+ max_ = Utils::Maximum(raw_addr, max_);
+ }
+
+ void Resize(uword start, uword end) {
+ if (start_ != start || end_ != end) {
+ delete[] allocation_;
+ Init(start, end);
+ }
}
void Clear() {
memset(allocation_, 0, (size_ * sizeof(allocation_[0])));
+ min_ = end_;
+ max_ = start_;
+ }
+
+ void FastClear() {
+ uword i = min_ >> kWordSizeLog2;
+ memset(&data_[i / kBitsPerWord],
+ 0,
+ sizeof(uword) * SizeFor((max_ + 1 - min_) >> kWordSizeLog2));
+ min_ = end_;
+ max_ = start_;
}
private:
@@ -66,7 +98,15 @@ class ObjectSet {
// Highest possible heap address, exclusive.
uword end_;
- DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectSet);
+ // The inclusive minimum address set in this ObjectMap.
+ // Used by FastClear
+ uword min_;
+
+ // The inclusive maximum address in this ObjectMap.
+ // Used by FastClear
+ uword max_;
+
+ DISALLOW_COPY_AND_ASSIGN(ObjectSet);
};
} // namespace dart
« no previous file with comments | « runtime/vm/heap_trace_test.cc ('k') | runtime/vm/pages.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698