OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef Persistent_h | 5 #ifndef Persistent_h |
6 #define Persistent_h | 6 #define Persistent_h |
7 | 7 |
8 #include "platform/heap/Heap.h" | 8 #include "platform/heap/Heap.h" |
| 9 #include "platform/heap/InlinedGlobalMarkingVisitor.h" |
9 #include "platform/heap/Member.h" | 10 #include "platform/heap/Member.h" |
10 #include "platform/heap/PersistentNode.h" | 11 #include "platform/heap/PersistentNode.h" |
11 #include "platform/heap/Visitor.h" | 12 #include "platform/heap/Visitor.h" |
12 #include "wtf/Allocator.h" | 13 #include "wtf/Allocator.h" |
13 #include "wtf/Atomics.h" | 14 #include "wtf/Atomics.h" |
| 15 #include "wtf/WeakPtr.h" |
14 | 16 |
15 namespace blink { | 17 namespace blink { |
16 | 18 |
17 // Marker used to annotate persistent objects and collections with, | 19 // Marker used to annotate persistent objects and collections with, |
18 // so as to enable reliable testing for persistent references via | 20 // so as to enable reliable testing for persistent references via |
19 // a type trait (see TypeTraits.h's IsPersistentReferenceType<>.) | 21 // a type trait (see TypeTraits.h's IsPersistentReferenceType<>.) |
20 #define IS_PERSISTENT_REFERENCE_TYPE() \ | 22 #define IS_PERSISTENT_REFERENCE_TYPE() \ |
21 public: \ | 23 public: \ |
22 using IsPersistentReferenceTypeMarker = int; \ | 24 using IsPersistentReferenceTypeMarker = int; \ |
23 private: | 25 private: |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
t Member<U>& b) { return a.get() == b.get(); } | 723 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
t Member<U>& b) { return a.get() == b.get(); } |
722 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
t Member<U>& b) { return a.get() != b.get(); } | 724 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
t Member<U>& b) { return a.get() != b.get(); } |
723 template<typename T, typename U> inline bool operator==(const Persistent<T>& a,
const Persistent<U>& b) { return a.get() == b.get(); } | 725 template<typename T, typename U> inline bool operator==(const Persistent<T>& a,
const Persistent<U>& b) { return a.get() == b.get(); } |
724 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a,
const Persistent<U>& b) { return a.get() != b.get(); } | 726 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a,
const Persistent<U>& b) { return a.get() != b.get(); } |
725 | 727 |
726 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
t Persistent<U>& b) { return a.get() == b.get(); } | 728 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
t Persistent<U>& b) { return a.get() == b.get(); } |
727 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
t Persistent<U>& b) { return a.get() != b.get(); } | 729 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
t Persistent<U>& b) { return a.get() != b.get(); } |
728 template<typename T, typename U> inline bool operator==(const Persistent<T>& a,
const Member<U>& b) { return a.get() == b.get(); } | 730 template<typename T, typename U> inline bool operator==(const Persistent<T>& a,
const Member<U>& b) { return a.get() == b.get(); } |
729 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a,
const Member<U>& b) { return a.get() != b.get(); } | 731 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a,
const Member<U>& b) { return a.get() != b.get(); } |
730 | 732 |
| 733 struct RevocableWeakPersistentTraits { |
| 734 template <typename T> |
| 735 struct PointerHolder { |
| 736 protected: |
| 737 PointerHolder(T* ptr) |
| 738 : m_ptr(ptr) |
| 739 { |
| 740 } |
| 741 void reset() { m_ptr = nullptr; } |
| 742 T* get() const { return m_ptr.get(); } |
| 743 private: |
| 744 WeakPersistent<T> m_ptr; |
| 745 }; |
| 746 }; |
| 747 struct RevocableCrossThreadWeakPersistentTraits { |
| 748 template <typename T> |
| 749 struct PointerHolder { |
| 750 protected: |
| 751 PointerHolder(T* ptr) |
| 752 : m_ptr(ptr) |
| 753 { |
| 754 } |
| 755 void reset() { m_ptr = nullptr; } |
| 756 T* get() const { return m_ptr.get(); } |
| 757 private: |
| 758 CrossThreadWeakPersistent<T> m_ptr; |
| 759 }; |
| 760 }; |
| 761 struct RevocableWeakMemberTraits { |
| 762 template <typename T> |
| 763 struct PointerHolder { |
| 764 DISALLOW_NEW(); |
| 765 |
| 766 protected: |
| 767 PointerHolder(T* ptr) |
| 768 : m_ptr(ptr) |
| 769 { |
| 770 } |
| 771 void reset() { m_ptr = nullptr; } |
| 772 T* get() const { return m_ptr.get(); } |
| 773 public: |
| 774 DEFINE_INLINE_TRACE() |
| 775 { |
| 776 visitor->trace(m_ptr); |
| 777 } |
| 778 |
| 779 private: |
| 780 WeakMember<T> m_ptr; |
| 781 }; |
| 782 }; |
| 783 |
| 784 template <typename T> |
| 785 using RevocableWeakPersistent = WTF::WeakPtr<T, RevocableWeakPersistentTraits>; |
| 786 template <typename T> |
| 787 using RevocableCrossThreadWeakPersistent = WTF::WeakPtr<T, RevocableCrossThreadW
eakPersistentTraits>; |
| 788 template <typename T> |
| 789 using RevocableWeakMember = WTF::WeakPtr<T, RevocableWeakMemberTraits>; |
| 790 |
| 791 template <typename T> |
| 792 using RevocableWeakPersistentFactory = WTF::WeakPtrFactory<T, RevocableWeakPersi
stentTraits>; |
| 793 template <typename T> |
| 794 using RevocableCrossThreadWeakPersistentFactory = WTF::WeakPtrFactory<T, Revocab
leCrossThreadWeakPersistentTraits>; |
| 795 template <typename T> |
| 796 using RevocableWeakMemberFactory = WTF::WeakPtrFactory<T, RevocableWeakMemberTra
its>; |
| 797 |
731 } // namespace blink | 798 } // namespace blink |
732 | 799 |
733 namespace WTF { | 800 namespace WTF { |
734 | 801 |
735 template <typename T> | 802 template <typename T> |
736 struct DefaultHash<blink::Persistent<T>> { | 803 struct DefaultHash<blink::Persistent<T>> { |
737 STATIC_ONLY(DefaultHash); | 804 STATIC_ONLY(DefaultHash); |
738 using Hash = MemberHash<T>; | 805 using Hash = MemberHash<T>; |
739 }; | 806 }; |
740 | 807 |
(...skipping 27 matching lines...) Expand all Loading... |
768 | 835 |
769 template <typename T> | 836 template <typename T> |
770 struct BindUnwrapTraits<blink::CrossThreadWeakPersistent<T>> { | 837 struct BindUnwrapTraits<blink::CrossThreadWeakPersistent<T>> { |
771 static blink::CrossThreadPersistent<T> Unwrap(const blink::CrossThreadWeakPe
rsistent<T>& wrapped) | 838 static blink::CrossThreadPersistent<T> Unwrap(const blink::CrossThreadWeakPe
rsistent<T>& wrapped) |
772 { | 839 { |
773 blink::CrossThreadPersistentRegion::LockScope persistentLock(blink::Proc
essHeap::crossThreadPersistentRegion()); | 840 blink::CrossThreadPersistentRegion::LockScope persistentLock(blink::Proc
essHeap::crossThreadPersistentRegion()); |
774 return blink::CrossThreadPersistent<T>(wrapped.get()); | 841 return blink::CrossThreadPersistent<T>(wrapped.get()); |
775 } | 842 } |
776 }; | 843 }; |
777 | 844 |
778 } | 845 } // namespace base |
779 | 846 |
780 #endif // Persistent_h | 847 #endif // Persistent_h |
OLD | NEW |