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

Side by Side Diff: Source/platform/heap/Heap.h

Issue 260713004: Add HeapHashCountedSet (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix nit Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/heap/Handle.h ('k') | Source/platform/heap/HeapTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 19 matching lines...) Expand all
30 30
31 #ifndef Heap_h 31 #ifndef Heap_h
32 #define Heap_h 32 #define Heap_h
33 33
34 #include "platform/PlatformExport.h" 34 #include "platform/PlatformExport.h"
35 #include "platform/heap/AddressSanitizer.h" 35 #include "platform/heap/AddressSanitizer.h"
36 #include "platform/heap/ThreadState.h" 36 #include "platform/heap/ThreadState.h"
37 #include "platform/heap/Visitor.h" 37 #include "platform/heap/Visitor.h"
38 38
39 #include "wtf/Assertions.h" 39 #include "wtf/Assertions.h"
40 #include "wtf/HashCountedSet.h"
40 #include "wtf/LinkedHashSet.h" 41 #include "wtf/LinkedHashSet.h"
41 #include "wtf/OwnPtr.h" 42 #include "wtf/OwnPtr.h"
42 #include "wtf/PassRefPtr.h" 43 #include "wtf/PassRefPtr.h"
43 44
44 #include <stdint.h> 45 #include <stdint.h>
45 46
46 namespace WebCore { 47 namespace WebCore {
47 48
48 const size_t blinkPageSizeLog2 = 17; 49 const size_t blinkPageSizeLog2 = 17;
49 const size_t blinkPageSize = 1 << blinkPageSizeLog2; 50 const size_t blinkPageSize = 1 << blinkPageSizeLog2;
(...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 typename HashArg = typename DefaultHash<ValueArg>::Hash, 1440 typename HashArg = typename DefaultHash<ValueArg>::Hash,
1440 typename TraitsArg = HashTraits<ValueArg> > 1441 typename TraitsArg = HashTraits<ValueArg> >
1441 class HeapHashSet : public HashSet<ValueArg, HashArg, TraitsArg, HeapAllocator> { }; 1442 class HeapHashSet : public HashSet<ValueArg, HashArg, TraitsArg, HeapAllocator> { };
1442 1443
1443 template< 1444 template<
1444 typename ValueArg, 1445 typename ValueArg,
1445 typename HashArg = typename DefaultHash<ValueArg>::Hash, 1446 typename HashArg = typename DefaultHash<ValueArg>::Hash,
1446 typename TraitsArg = HashTraits<ValueArg> > 1447 typename TraitsArg = HashTraits<ValueArg> >
1447 class HeapLinkedHashSet : public LinkedHashSet<ValueArg, HashArg, TraitsArg, Hea pAllocator> { }; 1448 class HeapLinkedHashSet : public LinkedHashSet<ValueArg, HashArg, TraitsArg, Hea pAllocator> { };
1448 1449
1450 template<
1451 typename Value,
1452 typename HashFunctions = typename DefaultHash<Value>::Hash,
1453 typename Traits = HashTraits<Value> >
1454 class HeapHashCountedSet : public HashCountedSet<Value, HashFunctions, Traits, H eapAllocator> { };
1455
1449 template<typename T, size_t inlineCapacity = 0> 1456 template<typename T, size_t inlineCapacity = 0>
1450 class HeapVector : public Vector<T, inlineCapacity, HeapAllocator> { 1457 class HeapVector : public Vector<T, inlineCapacity, HeapAllocator> {
1451 public: 1458 public:
1452 HeapVector() { } 1459 HeapVector() { }
1453 1460
1454 explicit HeapVector(size_t size) : Vector<T, inlineCapacity, HeapAllocator>( size) 1461 explicit HeapVector(size_t size) : Vector<T, inlineCapacity, HeapAllocator>( size)
1455 { 1462 {
1456 } 1463 }
1457 1464
1458 HeapVector(size_t size, const T& val) : Vector<T, inlineCapacity, HeapAlloca tor>(size, val) 1465 HeapVector(size_t size, const T& val) : Vector<T, inlineCapacity, HeapAlloca tor>(size, val)
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 template<typename T, typename Traits> 1570 template<typename T, typename Traits>
1564 struct ThreadingTrait<HeapVectorBacking<T, Traits> > { 1571 struct ThreadingTrait<HeapVectorBacking<T, Traits> > {
1565 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; 1572 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
1566 }; 1573 };
1567 1574
1568 template<typename T, size_t inlineCapacity> 1575 template<typename T, size_t inlineCapacity>
1569 struct ThreadingTrait<Deque<T, inlineCapacity, HeapAllocator> > { 1576 struct ThreadingTrait<Deque<T, inlineCapacity, HeapAllocator> > {
1570 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; 1577 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
1571 }; 1578 };
1572 1579
1580 template<typename T, typename U, typename V>
1581 struct ThreadingTrait<HashCountedSet<T, U, V, HeapAllocator> > {
1582 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
1583 };
1584
1573 template<typename Table> 1585 template<typename Table>
1574 struct ThreadingTrait<HeapHashTableBacking<Table> > { 1586 struct ThreadingTrait<HeapHashTableBacking<Table> > {
1575 typedef typename Table::KeyType Key; 1587 typedef typename Table::KeyType Key;
1576 typedef typename Table::ValueType Value; 1588 typedef typename Table::ValueType Value;
1577 static const ThreadAffinity Affinity = 1589 static const ThreadAffinity Affinity =
1578 (ThreadingTrait<Key>::Affinity == MainThreadOnly) 1590 (ThreadingTrait<Key>::Affinity == MainThreadOnly)
1579 && (ThreadingTrait<Value>::Affinity == MainThreadOnly) ? MainThreadOnly : AnyThread; 1591 && (ThreadingTrait<Value>::Affinity == MainThreadOnly) ? MainThreadOnly : AnyThread;
1580 }; 1592 };
1581 1593
1582 template<typename T, typename U, typename V, typename W, typename X> 1594 template<typename T, typename U, typename V, typename W, typename X>
1583 struct ThreadingTrait<HeapHashMap<T, U, V, W, X> > : public ThreadingTrait<HashM ap<T, U, V, W, X, HeapAllocator> > { }; 1595 struct ThreadingTrait<HeapHashMap<T, U, V, W, X> > : public ThreadingTrait<HashM ap<T, U, V, W, X, HeapAllocator> > { };
1584 1596
1585 template<typename T, typename U, typename V> 1597 template<typename T, typename U, typename V>
1586 struct ThreadingTrait<HeapHashSet<T, U, V> > : public ThreadingTrait<HashSet<T, U, V, HeapAllocator> > { }; 1598 struct ThreadingTrait<HeapHashSet<T, U, V> > : public ThreadingTrait<HashSet<T, U, V, HeapAllocator> > { };
1587 1599
1588 template<typename T, size_t inlineCapacity> 1600 template<typename T, size_t inlineCapacity>
1589 struct ThreadingTrait<HeapVector<T, inlineCapacity> > : public ThreadingTrait<Ve ctor<T, inlineCapacity, HeapAllocator> > { }; 1601 struct ThreadingTrait<HeapVector<T, inlineCapacity> > : public ThreadingTrait<Ve ctor<T, inlineCapacity, HeapAllocator> > { };
1590 1602
1591 template<typename T, size_t inlineCapacity> 1603 template<typename T, size_t inlineCapacity>
1592 struct ThreadingTrait<HeapDeque<T, inlineCapacity> > : public ThreadingTrait<Deq ue<T, inlineCapacity, HeapAllocator> > { }; 1604 struct ThreadingTrait<HeapDeque<T, inlineCapacity> > : public ThreadingTrait<Deq ue<T, inlineCapacity, HeapAllocator> > { };
1593 1605
1606 template<typename T, typename U, typename V>
1607 struct ThreadingTrait<HeapHashCountedSet<T, U, V> > : public ThreadingTrait<Hash CountedSet<T, U, V, HeapAllocator> > { };
1608
1594 // The standard implementation of GCInfoTrait<T>::get() just returns a static 1609 // The standard implementation of GCInfoTrait<T>::get() just returns a static
1595 // from the class T, but we can't do that for HashMap, HashSet, Deque and 1610 // from the class T, but we can't do that for HashMap, HashSet, Vector, etc.
1596 // Vector because they are in WTF and know nothing of GCInfos. Instead we have 1611 // because they are in WTF and know nothing of GCInfos. Instead we have a
1597 // a specialization of GCInfoTrait for these four classes here. 1612 // specialization of GCInfoTrait for these four classes here.
1598 1613
1599 template<typename Key, typename Value, typename T, typename U, typename V> 1614 template<typename Key, typename Value, typename T, typename U, typename V>
1600 struct GCInfoTrait<HashMap<Key, Value, T, U, V, HeapAllocator> > { 1615 struct GCInfoTrait<HashMap<Key, Value, T, U, V, HeapAllocator> > {
1601 static const GCInfo* get() 1616 static const GCInfo* get()
1602 { 1617 {
1603 typedef HashMap<Key, Value, T, U, V, HeapAllocator> TargetType; 1618 typedef HashMap<Key, Value, T, U, V, HeapAllocator> TargetType;
1604 static const GCInfo info = { 1619 static const GCInfo info = {
1605 TraceTrait<TargetType>::trace, 1620 TraceTrait<TargetType>::trace,
1606 0, 1621 0,
1607 false, // HashMap needs no finalizer. 1622 false, // HashMap needs no finalizer.
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 VTableTrait<TargetType>::hasVTable, 1718 VTableTrait<TargetType>::hasVTable,
1704 #if ENABLE(GC_TRACING) 1719 #if ENABLE(GC_TRACING)
1705 TypenameStringTrait<TargetType>::get() 1720 TypenameStringTrait<TargetType>::get()
1706 #endif 1721 #endif
1707 }; 1722 };
1708 return &info; 1723 return &info;
1709 } 1724 }
1710 static const GCInfo info; 1725 static const GCInfo info;
1711 }; 1726 };
1712 1727
1728 template<typename T, typename U, typename V>
1729 struct GCInfoTrait<HashCountedSet<T, U, V, HeapAllocator> > {
1730 static const GCInfo* get()
1731 {
1732 typedef HashCountedSet<T, U, V, HeapAllocator> TargetType;
1733 static const GCInfo info = {
1734 TraceTrait<TargetType>::trace,
1735 0,
1736 false, // HashCountedSet is just a HashTable, and needs no finalizer .
1737 VTableTrait<TargetType>::hasVTable,
1738 #if ENABLE(GC_TRACING)
1739 TypenameStringTrait<TargetType>::get()
1740 #endif
1741 };
1742 return &info;
1743 }
1744 static const GCInfo info;
1745 };
1746
1713 template<typename T, size_t inlineCapacity> 1747 template<typename T, size_t inlineCapacity>
1714 struct FinalizerTrait<Deque<T, inlineCapacity, HeapAllocator> > : public Finaliz erTraitImpl<Deque<T, inlineCapacity, HeapAllocator>, true> { }; 1748 struct FinalizerTrait<Deque<T, inlineCapacity, HeapAllocator> > : public Finaliz erTraitImpl<Deque<T, inlineCapacity, HeapAllocator>, true> { };
1715 1749
1716 template<typename T, size_t inlineCapacity> 1750 template<typename T, size_t inlineCapacity>
1717 struct GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > { 1751 struct GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > {
1718 static const GCInfo* get() 1752 static const GCInfo* get()
1719 { 1753 {
1720 typedef Deque<T, inlineCapacity, HeapAllocator> TargetType; 1754 typedef Deque<T, inlineCapacity, HeapAllocator> TargetType;
1721 static const GCInfo info = { 1755 static const GCInfo info = {
1722 TraceTrait<TargetType>::trace, 1756 TraceTrait<TargetType>::trace,
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1996 template<typename T, typename U, typename V, typename W, typename X> 2030 template<typename T, typename U, typename V, typename W, typename X>
1997 struct GCInfoTrait<HeapHashMap<T, U, V, W, X> > : public GCInfoTrait<HashMap<T, U, V, W, X, HeapAllocator> > { }; 2031 struct GCInfoTrait<HeapHashMap<T, U, V, W, X> > : public GCInfoTrait<HashMap<T, U, V, W, X, HeapAllocator> > { };
1998 template<typename T, typename U, typename V> 2032 template<typename T, typename U, typename V>
1999 struct GCInfoTrait<HeapHashSet<T, U, V> > : public GCInfoTrait<HashSet<T, U, V, HeapAllocator> > { }; 2033 struct GCInfoTrait<HeapHashSet<T, U, V> > : public GCInfoTrait<HashSet<T, U, V, HeapAllocator> > { };
2000 template<typename T, typename U, typename V> 2034 template<typename T, typename U, typename V>
2001 struct GCInfoTrait<HeapLinkedHashSet<T, U, V> > : public GCInfoTrait<LinkedHashS et<T, U, V, HeapAllocator> > { }; 2035 struct GCInfoTrait<HeapLinkedHashSet<T, U, V> > : public GCInfoTrait<LinkedHashS et<T, U, V, HeapAllocator> > { };
2002 template<typename T, size_t inlineCapacity> 2036 template<typename T, size_t inlineCapacity>
2003 struct GCInfoTrait<HeapVector<T, inlineCapacity> > : public GCInfoTrait<Vector<T , inlineCapacity, HeapAllocator> > { }; 2037 struct GCInfoTrait<HeapVector<T, inlineCapacity> > : public GCInfoTrait<Vector<T , inlineCapacity, HeapAllocator> > { };
2004 template<typename T, size_t inlineCapacity> 2038 template<typename T, size_t inlineCapacity>
2005 struct GCInfoTrait<HeapDeque<T, inlineCapacity> > : public GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > { }; 2039 struct GCInfoTrait<HeapDeque<T, inlineCapacity> > : public GCInfoTrait<Deque<T, inlineCapacity, HeapAllocator> > { };
2040 template<typename T, typename U, typename V>
2041 struct GCInfoTrait<HeapHashCountedSet<T, U, V> > : public GCInfoTrait<HashCounte dSet<T, U, V, HeapAllocator> > { };
2006 2042
2007 template<typename T> 2043 template<typename T>
2008 struct IfWeakMember; 2044 struct IfWeakMember;
2009 2045
2010 template<typename T> 2046 template<typename T>
2011 struct IfWeakMember { 2047 struct IfWeakMember {
2012 template<typename U> 2048 template<typename U>
2013 static bool isDead(Visitor*, const U&) { return false; } 2049 static bool isDead(Visitor*, const U&) { return false; }
2014 }; 2050 };
2015 2051
2016 template<typename T> 2052 template<typename T>
2017 struct IfWeakMember<WeakMember<T> > { 2053 struct IfWeakMember<WeakMember<T> > {
2018 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit or->isAlive(t.get()); } 2054 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit or->isAlive(t.get()); }
2019 }; 2055 };
2020 2056
2021 #if COMPILER(CLANG) 2057 #if COMPILER(CLANG)
2022 // Clang does not export the symbols that we have explicitly asked it 2058 // Clang does not export the symbols that we have explicitly asked it
2023 // to export. This forces it to export all the methods from ThreadHeap. 2059 // to export. This forces it to export all the methods from ThreadHeap.
2024 template<> void ThreadHeap<FinalizedHeapObjectHeader>::addPageToHeap(const GCInf o*); 2060 template<> void ThreadHeap<FinalizedHeapObjectHeader>::addPageToHeap(const GCInf o*);
2025 template<> void ThreadHeap<HeapObjectHeader>::addPageToHeap(const GCInfo*); 2061 template<> void ThreadHeap<HeapObjectHeader>::addPageToHeap(const GCInfo*);
2026 extern template class PLATFORM_EXPORT ThreadHeap<FinalizedHeapObjectHeader>; 2062 extern template class PLATFORM_EXPORT ThreadHeap<FinalizedHeapObjectHeader>;
2027 extern template class PLATFORM_EXPORT ThreadHeap<HeapObjectHeader>; 2063 extern template class PLATFORM_EXPORT ThreadHeap<HeapObjectHeader>;
2028 #endif 2064 #endif
2029 2065
2030 } 2066 }
2031 2067
2032 #endif // Heap_h 2068 #endif // Heap_h
OLDNEW
« no previous file with comments | « Source/platform/heap/Handle.h ('k') | Source/platform/heap/HeapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698