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

Unified Diff: src/heap/store-buffer.h

Issue 2696563003: [heap] Ensure consistency between store buffer mode and moving all entries to remembered set. (Closed)
Patch Set: rename Created 3 years, 10 months 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 | « src/heap/heap.cc ('k') | src/heap/store-buffer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/store-buffer.h
diff --git a/src/heap/store-buffer.h b/src/heap/store-buffer.h
index 6c99e1f3dcf48ae7a1f937ab758b06308d3eba16..0ade9e020f5fc90462862bb8e98ac1b83266910f 100644
--- a/src/heap/store-buffer.h
+++ b/src/heap/store-buffer.h
@@ -24,6 +24,8 @@ namespace internal {
// slots are moved to the remembered set.
class StoreBuffer {
public:
+ enum StoreBufferMode { IN_GC, NOT_IN_GC };
+
static const int kStoreBufferSize = 1 << (11 + kPointerSizeLog2);
static const int kStoreBufferMask = kStoreBufferSize - 1;
static const int kStoreBuffers = 2;
@@ -74,7 +76,7 @@ class StoreBuffer {
Address start, Address end) {
// In GC the store buffer has to be empty at any time.
DCHECK(store_buffer->Empty());
- DCHECK(store_buffer->heap()->gc_state() != Heap::NOT_IN_GC);
+ DCHECK(store_buffer->mode() != StoreBuffer::NOT_IN_GC);
Page* page = Page::FromAddress(start);
if (end) {
RememberedSet<OLD_TO_NEW>::RemoveRange(page, start, end,
@@ -86,7 +88,7 @@ class StoreBuffer {
static void DeleteDuringRuntime(StoreBuffer* store_buffer, Address start,
Address end) {
- DCHECK(store_buffer->heap()->gc_state() == Heap::NOT_IN_GC);
+ DCHECK(store_buffer->mode() == StoreBuffer::NOT_IN_GC);
store_buffer->InsertDeletionIntoStoreBuffer(start, end);
}
@@ -102,12 +104,12 @@ class StoreBuffer {
static void InsertDuringGarbageCollection(StoreBuffer* store_buffer,
Address slot) {
- DCHECK(store_buffer->heap()->gc_state() != Heap::NOT_IN_GC);
+ DCHECK(store_buffer->mode() != StoreBuffer::NOT_IN_GC);
RememberedSet<OLD_TO_NEW>::Insert(Page::FromAddress(slot), slot);
}
static void InsertDuringRuntime(StoreBuffer* store_buffer, Address slot) {
- DCHECK(store_buffer->heap()->gc_state() == Heap::NOT_IN_GC);
+ DCHECK(store_buffer->mode() == StoreBuffer::NOT_IN_GC);
store_buffer->InsertIntoStoreBuffer(slot);
}
@@ -126,8 +128,9 @@ class StoreBuffer {
insertion_callback(this, slot);
}
- void SetMode(Heap::HeapState state) {
- if (state == Heap::NOT_IN_GC) {
+ void SetMode(StoreBufferMode mode) {
+ mode_ = mode;
+ if (mode == NOT_IN_GC) {
insertion_callback = &InsertDuringRuntime;
deletion_callback = &DeleteDuringRuntime;
} else {
@@ -175,6 +178,8 @@ class StoreBuffer {
DISALLOW_COPY_AND_ASSIGN(Task);
};
+ StoreBufferMode mode() const { return mode_; }
+
void FlipStoreBuffers();
Heap* heap_;
@@ -198,6 +203,11 @@ class StoreBuffer {
// Points to the current buffer in use.
int current_;
+ // During GC, entries are directly added to the remembered set without
+ // going through the store buffer. This is signaled by a special
+ // IN_GC mode.
+ StoreBufferMode mode_;
+
base::VirtualMemory* virtual_memory_;
// Callbacks are more efficient than reading out the gc state for every
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/store-buffer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698