| 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 | 
|---|