OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 template <typename T> | 64 template <typename T> |
65 struct CrossThreadCopierPassThrough { | 65 struct CrossThreadCopierPassThrough { |
66 STATIC_ONLY(CrossThreadCopierPassThrough); | 66 STATIC_ONLY(CrossThreadCopierPassThrough); |
67 typedef T Type; | 67 typedef T Type; |
68 static Type copy(const T& parameter) | 68 static Type copy(const T& parameter) |
69 { | 69 { |
70 return parameter; | 70 return parameter; |
71 } | 71 } |
72 }; | 72 }; |
73 | 73 |
74 template <typename T, bool isArithmeticOrEnum, bool isThreadSafeRefCounted, bool
isGarbageCollected> | 74 template <typename T, bool isArithmeticOrEnum, bool isThreadSafeRefCounted> |
75 struct CrossThreadCopierBase; | 75 struct CrossThreadCopierBase; |
76 | 76 |
77 // Arithmetic values (integers or floats) and enums can be safely copied. | 77 // Arithmetic values (integers or floats) and enums can be safely copied. |
78 template <typename T, bool isThreadSafeRefCounted, bool isGarbageCollected> | 78 template <typename T, bool isThreadSafeRefCounted> |
79 struct CrossThreadCopierBase<T, true, isThreadSafeRefCounted, isGarbageCollected
> : public CrossThreadCopierPassThrough<T> { | 79 struct CrossThreadCopierBase<T, true, isThreadSafeRefCounted> : public CrossThre
adCopierPassThrough<T> { |
80 STATIC_ONLY(CrossThreadCopierBase); | 80 STATIC_ONLY(CrossThreadCopierBase); |
81 }; | 81 }; |
82 | 82 |
83 // Custom copy method for ThreadSafeRefCounted. | 83 // Custom copy method for ThreadSafeRefCounted. |
84 template <typename T, bool isGarbageCollected> | 84 template <typename T> |
85 struct CrossThreadCopierBase<T, false, true, isGarbageCollected> { | 85 struct CrossThreadCopierBase<T, false, true> { |
86 STATIC_ONLY(CrossThreadCopierBase); | 86 STATIC_ONLY(CrossThreadCopierBase); |
87 typedef typename WTF::RemoveTemplate<T, RefPtr>::Type TypeWithoutRefPtr; | 87 typedef typename WTF::RemoveTemplate<T, RefPtr>::Type TypeWithoutRefPtr; |
88 typedef typename WTF::RemoveTemplate<TypeWithoutRefPtr, PassRefPtr>::Type Ty
peWithoutPassRefPtr; | 88 typedef typename WTF::RemoveTemplate<TypeWithoutRefPtr, PassRefPtr>::Type Ty
peWithoutPassRefPtr; |
89 typedef typename std::remove_pointer<TypeWithoutPassRefPtr>::type RefCounted
Type; | 89 typedef typename std::remove_pointer<TypeWithoutPassRefPtr>::type RefCounted
Type; |
90 | 90 |
91 // Verify that only one of the above did a change. | 91 // Verify that only one of the above did a change. |
92 static_assert((std::is_same<RefPtr<RefCountedType>, T>::value | 92 static_assert((std::is_same<RefPtr<RefCountedType>, T>::value |
93 || std::is_same<PassRefPtr<RefCountedType>, T>::value | 93 || std::is_same<PassRefPtr<RefCountedType>, T>::value |
94 || std::is_same<RefCountedType*, T>::value), | 94 || std::is_same<RefCountedType*, T>::value), |
95 "only one type modification should be allowed"); | 95 "only one type modification should be allowed"); |
96 | 96 |
97 typedef PassRefPtr<RefCountedType> Type; | 97 typedef PassRefPtr<RefCountedType> Type; |
98 static Type copy(const T& refPtr) | 98 static Type copy(const T& refPtr) |
99 { | 99 { |
100 return refPtr; | 100 return refPtr; |
101 } | 101 } |
102 }; | 102 }; |
103 | 103 |
104 // A pointer to GarbageCollected. | |
105 template <typename T> | |
106 struct CrossThreadCopierBase<T, false, false, true> { | |
107 STATIC_ONLY(CrossThreadCopierBase); | |
108 typedef typename std::remove_pointer<T>::type TypeWithoutPointer; | |
109 typedef TypeWithoutPointer* Type; | |
110 static Type copy(const T& ptr) | |
111 { | |
112 return ptr; | |
113 } | |
114 }; | |
115 | |
116 template <typename T> | 104 template <typename T> |
117 struct CrossThreadCopier : public CrossThreadCopierBase< | 105 struct CrossThreadCopier : public CrossThreadCopierBase< |
118 T, | 106 T, |
119 std::is_arithmetic<T>::value || std::is_enum<T>::value, | 107 std::is_arithmetic<T>::value || std::is_enum<T>::value, |
120 WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, Thr
eadSafeRefCounted>::value | 108 WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, Thr
eadSafeRefCounted>::value |
121 || WTF::IsSubclassOfTemplate<typename std::remove_pointer<T>::type, ThreadSa
feRefCounted>::value | 109 || WTF::IsSubclassOfTemplate<typename std::remove_pointer<T>::type, ThreadSa
feRefCounted>::value |
122 || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Ty
pe, ThreadSafeRefCounted>::value | 110 || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Ty
pe, ThreadSafeRefCounted>::value |
123 || std::is_base_of<SkRefCnt, typename WTF::RemoveTemplate<T, RefPtr>::Type>:
:value | 111 || std::is_base_of<SkRefCnt, typename WTF::RemoveTemplate<T, RefPtr>::Type>:
:value |
124 || std::is_base_of<SkRefCnt, typename std::remove_pointer<T>::type>::value | 112 || std::is_base_of<SkRefCnt, typename std::remove_pointer<T>::type>::value |
125 || std::is_base_of<SkRefCnt, typename WTF::RemoveTemplate<T, PassRefPtr>::Ty
pe>::value, | 113 || std::is_base_of<SkRefCnt, typename WTF::RemoveTemplate<T, PassRefPtr>::Ty
pe>::value> { |
126 WTF::IsSubclassOfTemplate<typename std::remove_pointer<T>::type, GarbageColl
ected>::value> { | |
127 STATIC_ONLY(CrossThreadCopier); | 114 STATIC_ONLY(CrossThreadCopier); |
128 }; | 115 }; |
129 | 116 |
130 // CrossThreadCopier specializations follow. | 117 // CrossThreadCopier specializations follow. |
131 | 118 |
132 // nullptr_t can be passed through without any changes. | 119 // nullptr_t can be passed through without any changes. |
133 template <> | 120 template <> |
134 struct CrossThreadCopier<std::nullptr_t> : public CrossThreadCopierPassThrough<s
td::nullptr_t> { | 121 struct CrossThreadCopier<std::nullptr_t> : public CrossThreadCopierPassThrough<s
td::nullptr_t> { |
135 STATIC_ONLY(CrossThreadCopier); | 122 STATIC_ONLY(CrossThreadCopier); |
136 }; | 123 }; |
(...skipping 23 matching lines...) Expand all Loading... |
160 template <typename T> | 147 template <typename T> |
161 struct CrossThreadCopier<std::unique_ptr<T>> { | 148 struct CrossThreadCopier<std::unique_ptr<T>> { |
162 STATIC_ONLY(CrossThreadCopier); | 149 STATIC_ONLY(CrossThreadCopier); |
163 using Type = std::unique_ptr<T>; | 150 using Type = std::unique_ptr<T>; |
164 static std::unique_ptr<T> copy(std::unique_ptr<T> pointer) | 151 static std::unique_ptr<T> copy(std::unique_ptr<T> pointer) |
165 { | 152 { |
166 return pointer; // This is in fact a move. | 153 return pointer; // This is in fact a move. |
167 } | 154 } |
168 }; | 155 }; |
169 | 156 |
| 157 template<typename T> |
| 158 struct CrossThreadCopier<CrossThreadPersistent<T>> : public CrossThreadCopierPas
sThrough<CrossThreadPersistent<T>> { |
| 159 STATIC_ONLY(CrossThreadCopier); |
| 160 }; |
| 161 |
170 template <typename T> | 162 template <typename T> |
171 struct CrossThreadCopier<WTF::PassedWrapper<T>> { | 163 struct CrossThreadCopier<WTF::PassedWrapper<T>> { |
172 STATIC_ONLY(CrossThreadCopier); | 164 STATIC_ONLY(CrossThreadCopier); |
173 using Type = WTF::PassedWrapper<typename CrossThreadCopier<T>::Type>; | 165 using Type = WTF::PassedWrapper<typename CrossThreadCopier<T>::Type>; |
174 static Type copy(WTF::PassedWrapper<T>&& value) { return passed(CrossThreadC
opier<T>::copy(value.moveOut())); } | 166 static Type copy(WTF::PassedWrapper<T>&& value) { return passed(CrossThreadC
opier<T>::copy(value.moveOut())); } |
175 }; | 167 }; |
176 | 168 |
177 template<typename T> | 169 template<typename T> |
178 struct CrossThreadCopier<CrossThreadWeakPersistentThisPointer<T>> : public Cross
ThreadCopierPassThrough<CrossThreadWeakPersistentThisPointer<T>> { | 170 struct CrossThreadCopier<CrossThreadWeakPersistentThisPointer<T>> : public Cross
ThreadCopierPassThrough<CrossThreadWeakPersistentThisPointer<T>> { |
179 STATIC_ONLY(CrossThreadCopier); | 171 STATIC_ONLY(CrossThreadCopier); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 | 255 |
264 template <typename T> | 256 template <typename T> |
265 AllowCrossThreadAccessWrapper<const WeakPtr<T>&> AllowCrossThreadAccess(const We
akPtr<T>& value) | 257 AllowCrossThreadAccessWrapper<const WeakPtr<T>&> AllowCrossThreadAccess(const We
akPtr<T>& value) |
266 { | 258 { |
267 return AllowCrossThreadAccessWrapper<const WeakPtr<T>&>(value); | 259 return AllowCrossThreadAccessWrapper<const WeakPtr<T>&>(value); |
268 } | 260 } |
269 | 261 |
270 } // namespace blink | 262 } // namespace blink |
271 | 263 |
272 #endif // CrossThreadCopier_h | 264 #endif // CrossThreadCopier_h |
OLD | NEW |