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

Unified Diff: Source/platform/heap/Heap.h

Issue 1138663002: Oilpan: support eager finalization/sweeping. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase + introduce OILPAN_EAGERLY_SWEEP() Created 5 years, 7 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 | « no previous file | Source/platform/heap/HeapTest.cpp » ('j') | Source/platform/heap/ThreadState.cpp » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/Heap.h
diff --git a/Source/platform/heap/Heap.h b/Source/platform/heap/Heap.h
index f9384ce98365ec54e5f4deec163a847bad2ad868..b086849ef880016e6545961dffe2ec6e057db246 100644
--- a/Source/platform/heap/Heap.h
+++ b/Source/platform/heap/Heap.h
@@ -1075,23 +1075,47 @@ protected:
}
};
-// We use sized heaps for normal pages to improve memory locality.
+// Assigning class types to their heaps.
+//
+// We use sized heaps for most 'normal' objcts to improve memory locality.
// It seems that the same type of objects are likely to be accessed together,
-// which means that we want to group objects by type. That's why we provide
-// dedicated heaps for popular types (e.g., Node, CSSValue), but it's not
-// practical to prepare dedicated heaps for all types. Thus we group objects
-// by their sizes, hoping that it will approximately group objects
-// by their types.
-static int heapIndexForNormalHeap(size_t size)
-{
- if (size < 64) {
- if (size < 32)
+// which means that we want to group objects by type. That's one reason
+// why we provide dedicated heaps for popular types (e.g., Node, CSSValue),
+// but it's not practical to prepare dedicated heaps for all types.
+// Thus we group objects by their sizes, hoping that this will approximately
+// group objects by their types.
+//
+// An exception to the use of sized heaps is made for class types that
+// require prompt finalization after a garbage collection. That is, their
+// instances have to be finalized early and cannot be delayed until lazy
+// sweeping kicks in for their heap and page. The OILPAN_EAGERLY_SWEEP()
+// macro is used to declare a class (and its derived classes) as being
+// in need of 'eager sweeping'.
+//
+template<typename T, typename Enabled = void>
+class HeapIndexTrait {
+public:
+ static int heapIndexForObject(size_t size)
+ {
+ if (size < 64) {
+ if (size < 32)
return NormalPage1HeapIndex;
- return NormalPage2HeapIndex;
- }
- if (size < 128)
+ return NormalPage2HeapIndex;
haraken 2015/05/19 23:23:37 Fix indentation. Or: return size < 32 ? NormalP
sof 2015/05/20 09:43:01 Done; sorry, bad editor configuration.
+ }
+ if (size < 128)
return NormalPage3HeapIndex;
- return NormalPage4HeapIndex;
+ return NormalPage4HeapIndex;
haraken 2015/05/19 23:23:37 Ditto.
+ }
+};
+
+#define OILPAN_EAGERLY_SWEEP(TYPE) \
haraken 2015/05/19 23:23:37 Add a TODO to mention that the eager sweeping is a
haraken 2015/05/19 23:23:37 Hmm, we don't use a OILPAN_ prefix in other macros
sof 2015/05/20 09:43:00 That would the ideal outcome, but it is not clear
sof 2015/05/20 09:43:01 Not worth the time trying to change your mind abou
+template<typename T> \
+class HeapIndexTrait<T, typename WTF::EnableIf<WTF::IsSubclass<T, TYPE>::value>::Type> { \
+public: \
+ static int heapIndexForObject(size_t) \
+ { \
+ return EagerSweepHeapIndex; \
+ } \
}
NO_SANITIZE_ADDRESS inline
@@ -1212,7 +1236,7 @@ template<typename T>
Address Heap::allocate(size_t size)
{
ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
- return Heap::allocateOnHeapIndex(state, size, heapIndexForNormalHeap(size), GCInfoTrait<T>::index());
+ return Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::heapIndexForObject(size), GCInfoTrait<T>::index());
}
template<typename T>
@@ -1226,7 +1250,7 @@ Address Heap::reallocate(void* previous, size_t size)
ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
// TODO(haraken): reallocate() should use the heap that the original object
// is using. This won't be a big deal since reallocate() is rarely used.
- Address address = Heap::allocateOnHeapIndex(state, size, heapIndexForNormalHeap(size), GCInfoTrait<T>::index());
+ Address address = Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::heapIndexForObject(size), GCInfoTrait<T>::index());
if (!previous) {
// This is equivalent to malloc(size).
return address;
« no previous file with comments | « no previous file | Source/platform/heap/HeapTest.cpp » ('j') | Source/platform/heap/ThreadState.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698