| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2014 Google Inc. All rights reserved. | 2  * Copyright (C) 2014 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 283 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 294 // between objects that are in the managed heap. They are only | 294 // between objects that are in the managed heap. They are only | 
| 295 // meant to point to managed heap objects from variables/members | 295 // meant to point to managed heap objects from variables/members | 
| 296 // outside the managed heap. | 296 // outside the managed heap. | 
| 297 // | 297 // | 
| 298 // A Persistent is always a GC root from the point of view of | 298 // A Persistent is always a GC root from the point of view of | 
| 299 // the garbage collector. | 299 // the garbage collector. | 
| 300 // | 300 // | 
| 301 // We have to construct and destruct Persistent with default RootsAccessor in | 301 // We have to construct and destruct Persistent with default RootsAccessor in | 
| 302 // the same thread. | 302 // the same thread. | 
| 303 template<typename T, typename RootsAccessor /* = ThreadLocalPersistents<Threadin
      gTrait<T>::Affinity > */ > | 303 template<typename T, typename RootsAccessor /* = ThreadLocalPersistents<Threadin
      gTrait<T>::Affinity > */ > | 
| 304 class Persistent : public PersistentBase<RootsAccessor, Persistent<T, RootsAcces
      sor> > { | 304 class Persistent : public PersistentBase<RootsAccessor, Persistent<T, RootsAcces
      sor>> { | 
| 305 public: | 305 public: | 
| 306     Persistent() : m_raw(nullptr) { } | 306     Persistent() : m_raw(nullptr) { } | 
| 307 | 307 | 
| 308     Persistent(std::nullptr_t) : m_raw(nullptr) { } | 308     Persistent(std::nullptr_t) : m_raw(nullptr) { } | 
| 309 | 309 | 
| 310     Persistent(T* raw) : m_raw(raw) | 310     Persistent(T* raw) : m_raw(raw) | 
| 311     { | 311     { | 
| 312         ASSERT_IS_VALID_PERSISTENT_POINTER(m_raw); | 312         ASSERT_IS_VALID_PERSISTENT_POINTER(m_raw); | 
| 313         recordBacktrace(); | 313         recordBacktrace(); | 
| 314     } | 314     } | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 433 public: | 433 public: | 
| 434     CrossThreadPersistent(T* raw) : Persistent<T, GlobalPersistents>(raw) { } | 434     CrossThreadPersistent(T* raw) : Persistent<T, GlobalPersistents>(raw) { } | 
| 435 | 435 | 
| 436     using Persistent<T, GlobalPersistents>::operator=; | 436     using Persistent<T, GlobalPersistents>::operator=; | 
| 437 }; | 437 }; | 
| 438 | 438 | 
| 439 // FIXME: derive affinity based on the collection. | 439 // FIXME: derive affinity based on the collection. | 
| 440 template<typename Collection, ThreadAffinity Affinity = AnyThread> | 440 template<typename Collection, ThreadAffinity Affinity = AnyThread> | 
| 441 class PersistentHeapCollectionBase | 441 class PersistentHeapCollectionBase | 
| 442     : public Collection | 442     : public Collection | 
| 443     , public PersistentBase<ThreadLocalPersistents<Affinity>, PersistentHeapColl
      ectionBase<Collection, Affinity> > { | 443     , public PersistentBase<ThreadLocalPersistents<Affinity>, PersistentHeapColl
      ectionBase<Collection, Affinity>> { | 
| 444     // We overload the various new and delete operators with using the WTF Defau
      ltAllocator to ensure persistent | 444     // We overload the various new and delete operators with using the WTF Defau
      ltAllocator to ensure persistent | 
| 445     // heap collections are always allocated off-heap. This allows persistent co
      llections to be used in | 445     // heap collections are always allocated off-heap. This allows persistent co
      llections to be used in | 
| 446     // DEFINE_STATIC_LOCAL et. al. | 446     // DEFINE_STATIC_LOCAL et. al. | 
| 447     WTF_USE_ALLOCATOR(PersistentHeapCollectionBase, WTF::DefaultAllocator); | 447     WTF_USE_ALLOCATOR(PersistentHeapCollectionBase, WTF::DefaultAllocator); | 
| 448 public: | 448 public: | 
| 449     PersistentHeapCollectionBase() { } | 449     PersistentHeapCollectionBase() { } | 
| 450 | 450 | 
| 451     template<typename OtherCollection> | 451     template<typename OtherCollection> | 
| 452     PersistentHeapCollectionBase(const OtherCollection& other) : Collection(othe
      r) { } | 452     PersistentHeapCollectionBase(const OtherCollection& other) : Collection(othe
      r) { } | 
| 453 | 453 | 
| 454     void trace(Visitor* visitor) | 454     void trace(Visitor* visitor) | 
| 455     { | 455     { | 
| 456 #if ENABLE(GC_PROFILE_MARKING) | 456 #if ENABLE(GC_PROFILE_MARKING) | 
| 457         visitor->setHostInfo(this, "PersistentHeapCollectionBase"); | 457         visitor->setHostInfo(this, "PersistentHeapCollectionBase"); | 
| 458 #endif | 458 #endif | 
| 459         visitor->trace(*static_cast<Collection*>(this)); | 459         visitor->trace(*static_cast<Collection*>(this)); | 
| 460     } | 460     } | 
| 461 }; | 461 }; | 
| 462 | 462 | 
| 463 template< | 463 template< | 
| 464     typename KeyArg, | 464     typename KeyArg, | 
| 465     typename MappedArg, | 465     typename MappedArg, | 
| 466     typename HashArg = typename DefaultHash<KeyArg>::Hash, | 466     typename HashArg = typename DefaultHash<KeyArg>::Hash, | 
| 467     typename KeyTraitsArg = HashTraits<KeyArg>, | 467     typename KeyTraitsArg = HashTraits<KeyArg>, | 
| 468     typename MappedTraitsArg = HashTraits<MappedArg> > | 468     typename MappedTraitsArg = HashTraits<MappedArg>> | 
| 469 class PersistentHeapHashMap : public PersistentHeapCollectionBase<HeapHashMap<Ke
      yArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg> > { }; | 469 class PersistentHeapHashMap : public PersistentHeapCollectionBase<HeapHashMap<Ke
      yArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>> { }; | 
| 470 | 470 | 
| 471 template< | 471 template< | 
| 472     typename ValueArg, | 472     typename ValueArg, | 
| 473     typename HashArg = typename DefaultHash<ValueArg>::Hash, | 473     typename HashArg = typename DefaultHash<ValueArg>::Hash, | 
| 474     typename TraitsArg = HashTraits<ValueArg> > | 474     typename TraitsArg = HashTraits<ValueArg>> | 
| 475 class PersistentHeapHashSet : public PersistentHeapCollectionBase<HeapHashSet<Va
      lueArg, HashArg, TraitsArg> > { }; | 475 class PersistentHeapHashSet : public PersistentHeapCollectionBase<HeapHashSet<Va
      lueArg, HashArg, TraitsArg>> { }; | 
| 476 | 476 | 
| 477 template< | 477 template< | 
| 478     typename ValueArg, | 478     typename ValueArg, | 
| 479     typename HashArg = typename DefaultHash<ValueArg>::Hash, | 479     typename HashArg = typename DefaultHash<ValueArg>::Hash, | 
| 480     typename TraitsArg = HashTraits<ValueArg> > | 480     typename TraitsArg = HashTraits<ValueArg>> | 
| 481 class PersistentHeapLinkedHashSet : public PersistentHeapCollectionBase<HeapLink
      edHashSet<ValueArg, HashArg, TraitsArg> > { }; | 481 class PersistentHeapLinkedHashSet : public PersistentHeapCollectionBase<HeapLink
      edHashSet<ValueArg, HashArg, TraitsArg>> { }; | 
| 482 | 482 | 
| 483 template< | 483 template< | 
| 484     typename ValueArg, | 484     typename ValueArg, | 
| 485     size_t inlineCapacity = 0, | 485     size_t inlineCapacity = 0, | 
| 486     typename HashArg = typename DefaultHash<ValueArg>::Hash> | 486     typename HashArg = typename DefaultHash<ValueArg>::Hash> | 
| 487 class PersistentHeapListHashSet : public PersistentHeapCollectionBase<HeapListHa
      shSet<ValueArg, inlineCapacity, HashArg> > { }; | 487 class PersistentHeapListHashSet : public PersistentHeapCollectionBase<HeapListHa
      shSet<ValueArg, inlineCapacity, HashArg>> { }; | 
| 488 | 488 | 
| 489 template<typename T, typename U, typename V> | 489 template<typename T, typename U, typename V> | 
| 490 class PersistentHeapHashCountedSet : public PersistentHeapCollectionBase<HeapHas
      hCountedSet<T, U, V> > { }; | 490 class PersistentHeapHashCountedSet : public PersistentHeapCollectionBase<HeapHas
      hCountedSet<T, U, V>> { }; | 
| 491 | 491 | 
| 492 template<typename T, size_t inlineCapacity = 0> | 492 template<typename T, size_t inlineCapacity = 0> | 
| 493 class PersistentHeapVector : public PersistentHeapCollectionBase<HeapVector<T, i
      nlineCapacity> > { | 493 class PersistentHeapVector : public PersistentHeapCollectionBase<HeapVector<T, i
      nlineCapacity>> { | 
| 494 public: | 494 public: | 
| 495     PersistentHeapVector() { } | 495     PersistentHeapVector() { } | 
| 496 | 496 | 
| 497     template<size_t otherCapacity> | 497     template<size_t otherCapacity> | 
| 498     PersistentHeapVector(const HeapVector<T, otherCapacity>& other) | 498     PersistentHeapVector(const HeapVector<T, otherCapacity>& other) | 
| 499         : PersistentHeapCollectionBase<HeapVector<T, inlineCapacity> >(other) | 499         : PersistentHeapCollectionBase<HeapVector<T, inlineCapacity>>(other) | 
| 500     { | 500     { | 
| 501     } | 501     } | 
| 502 }; | 502 }; | 
| 503 | 503 | 
| 504 template<typename T, size_t inlineCapacity = 0> | 504 template<typename T, size_t inlineCapacity = 0> | 
| 505 class PersistentHeapDeque : public PersistentHeapCollectionBase<HeapDeque<T, inl
      ineCapacity> > { | 505 class PersistentHeapDeque : public PersistentHeapCollectionBase<HeapDeque<T, inl
      ineCapacity>> { | 
| 506 public: | 506 public: | 
| 507     PersistentHeapDeque() { } | 507     PersistentHeapDeque() { } | 
| 508 | 508 | 
| 509     template<size_t otherCapacity> | 509     template<size_t otherCapacity> | 
| 510     PersistentHeapDeque(const HeapDeque<T, otherCapacity>& other) | 510     PersistentHeapDeque(const HeapDeque<T, otherCapacity>& other) | 
| 511         : PersistentHeapCollectionBase<HeapDeque<T, inlineCapacity> >(other) | 511         : PersistentHeapCollectionBase<HeapDeque<T, inlineCapacity>>(other) | 
| 512     { | 512     { | 
| 513     } | 513     } | 
| 514 }; | 514 }; | 
| 515 | 515 | 
| 516 // Members are used in classes to contain strong pointers to other oilpan heap | 516 // Members are used in classes to contain strong pointers to other oilpan heap | 
| 517 // allocated objects. | 517 // allocated objects. | 
| 518 // All Member fields of a class must be traced in the class' trace method. | 518 // All Member fields of a class must be traced in the class' trace method. | 
| 519 // During the mark phase of the GC all live objects are marked as live and | 519 // During the mark phase of the GC all live objects are marked as live and | 
| 520 // all Member fields of a live object will be traced marked as live as well. | 520 // all Member fields of a live object will be traced marked as live as well. | 
| 521 template<typename T> | 521 template<typename T> | 
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 644 // NeedsTracing<T>::value || IsWeakMember<T>::value. It should not need to test | 644 // NeedsTracing<T>::value || IsWeakMember<T>::value. It should not need to test | 
| 645 // raw pointer types. To remove these tests, we may need support for | 645 // raw pointer types. To remove these tests, we may need support for | 
| 646 // instantiating a template with a RawPtrOrMember'ish template. | 646 // instantiating a template with a RawPtrOrMember'ish template. | 
| 647 template<typename T> | 647 template<typename T> | 
| 648 struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || b
      link::IsGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename WTF
      ::RemovePointer<T>::Type>::Type>::value> { }; | 648 struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || b
      link::IsGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename WTF
      ::RemovePointer<T>::Type>::Type>::value> { }; | 
| 649 | 649 | 
| 650 // This trace trait for std::pair will null weak members if their referent is | 650 // This trace trait for std::pair will null weak members if their referent is | 
| 651 // collected. If you have a collection that contain weakness it does not remove | 651 // collected. If you have a collection that contain weakness it does not remove | 
| 652 // entries from the collection that contain nulled weak members. | 652 // entries from the collection that contain nulled weak members. | 
| 653 template<typename T, typename U> | 653 template<typename T, typename U> | 
| 654 class TraceTrait<std::pair<T, U> > { | 654 class TraceTrait<std::pair<T, U>> { | 
| 655 public: | 655 public: | 
| 656     static const bool firstNeedsTracing = WTF::NeedsTracing<T>::value || WTF::Is
      Weak<T>::value; | 656     static const bool firstNeedsTracing = WTF::NeedsTracing<T>::value || WTF::Is
      Weak<T>::value; | 
| 657     static const bool secondNeedsTracing = WTF::NeedsTracing<U>::value || WTF::I
      sWeak<U>::value; | 657     static const bool secondNeedsTracing = WTF::NeedsTracing<U>::value || WTF::I
      sWeak<U>::value; | 
| 658     static void trace(Visitor* visitor, std::pair<T, U>* pair) | 658     static void trace(Visitor* visitor, std::pair<T, U>* pair) | 
| 659     { | 659     { | 
| 660         TraceIfEnabled<T, firstNeedsTracing>::trace(visitor, &pair->first); | 660         TraceIfEnabled<T, firstNeedsTracing>::trace(visitor, &pair->first); | 
| 661         TraceIfEnabled<U, secondNeedsTracing>::trace(visitor, &pair->second); | 661         TraceIfEnabled<U, secondNeedsTracing>::trace(visitor, &pair->second); | 
| 662     } | 662     } | 
| 663 }; | 663 }; | 
| 664 | 664 | 
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 931     static const bool value = TraceEagerlyTrait<T>::value; | 931     static const bool value = TraceEagerlyTrait<T>::value; | 
| 932 }; | 932 }; | 
| 933 | 933 | 
| 934 template<typename T> | 934 template<typename T> | 
| 935 class TraceEagerlyTrait<CrossThreadPersistent<T>> { | 935 class TraceEagerlyTrait<CrossThreadPersistent<T>> { | 
| 936 public: | 936 public: | 
| 937     static const bool value = TraceEagerlyTrait<T>::value; | 937     static const bool value = TraceEagerlyTrait<T>::value; | 
| 938 }; | 938 }; | 
| 939 | 939 | 
| 940 template<typename T, typename U, typename V, typename W, typename X> | 940 template<typename T, typename U, typename V, typename W, typename X> | 
| 941 class TraceEagerlyTrait<HeapHashMap<T, U, V, W, X> > { | 941 class TraceEagerlyTrait<HeapHashMap<T, U, V, W, X>> { | 
| 942 public: | 942 public: | 
| 943     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e || TraceEagerlyTrait<U>::value; | 943     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e || TraceEagerlyTrait<U>::value; | 
| 944 }; | 944 }; | 
| 945 | 945 | 
| 946 template<typename T, typename U, typename V> | 946 template<typename T, typename U, typename V> | 
| 947 class TraceEagerlyTrait<HeapHashSet<T, U, V> > { | 947 class TraceEagerlyTrait<HeapHashSet<T, U, V>> { | 
| 948 public: | 948 public: | 
| 949     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 949     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 
| 950 }; | 950 }; | 
| 951 | 951 | 
| 952 template<typename T, typename U, typename V> | 952 template<typename T, typename U, typename V> | 
| 953 class TraceEagerlyTrait<HeapLinkedHashSet<T, U, V> > { | 953 class TraceEagerlyTrait<HeapLinkedHashSet<T, U, V>> { | 
| 954 public: | 954 public: | 
| 955     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 955     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 
| 956 }; | 956 }; | 
| 957 | 957 | 
| 958 template<typename T, size_t inlineCapacity, typename U> | 958 template<typename T, size_t inlineCapacity, typename U> | 
| 959 class TraceEagerlyTrait<HeapListHashSet<T, inlineCapacity, U> > { | 959 class TraceEagerlyTrait<HeapListHashSet<T, inlineCapacity, U>> { | 
| 960 public: | 960 public: | 
| 961     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 961     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 
| 962 }; | 962 }; | 
| 963 | 963 | 
| 964 template<typename T, size_t inlineCapacity> | 964 template<typename T, size_t inlineCapacity> | 
| 965 class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inli
      neCapacity>>> { | 965 class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inli
      neCapacity>>> { | 
| 966 public: | 966 public: | 
| 967     static const bool value = false; | 967     static const bool value = false; | 
| 968 }; | 968 }; | 
| 969 | 969 | 
| 970 template<typename T, size_t inlineCapacity> | 970 template<typename T, size_t inlineCapacity> | 
| 971 class TraceEagerlyTrait<HeapVector<T, inlineCapacity> > { | 971 class TraceEagerlyTrait<HeapVector<T, inlineCapacity>> { | 
| 972 public: | 972 public: | 
| 973     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 973     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 
| 974 }; | 974 }; | 
| 975 | 975 | 
| 976 template<typename T, typename U> | 976 template<typename T, typename U> | 
| 977 class TraceEagerlyTrait<HeapVectorBacking<T, U>> { | 977 class TraceEagerlyTrait<HeapVectorBacking<T, U>> { | 
| 978 public: | 978 public: | 
| 979     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 979     static const bool value = MARKER_EAGER_TRACING || TraceEagerlyTrait<T>::valu
      e; | 
| 980 }; | 980 }; | 
| 981 | 981 | 
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1181 template<typename T> | 1181 template<typename T> | 
| 1182 struct ParamStorageTraits<RawPtr<T>> : public PointerParamStorageTraits<T*, blin
      k::IsGarbageCollectedType<T>::value> { | 1182 struct ParamStorageTraits<RawPtr<T>> : public PointerParamStorageTraits<T*, blin
      k::IsGarbageCollectedType<T>::value> { | 
| 1183 }; | 1183 }; | 
| 1184 | 1184 | 
| 1185 template<typename T> | 1185 template<typename T> | 
| 1186 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; | 1186 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; | 
| 1187 | 1187 | 
| 1188 } // namespace WTF | 1188 } // namespace WTF | 
| 1189 | 1189 | 
| 1190 #endif | 1190 #endif | 
| OLD | NEW | 
|---|