Title: [96062] branches/chromium/835/Source/WebCore/platform
Revision
96062
Author
[email protected]
Date
2011-09-26 18:39:09 -0700 (Mon, 26 Sep 2011)

Log Message

Merge 94986 - Make the ThreadSafeRefCounted support in CrossThreadCopier work for T*.
https://bugs.webkit.org/show_bug.cgi?id=67947

Reviewed by Adam Barth.

The changes are tested by compiling and added compile asserts to do some verification as well.

* platform/CrossThreadCopier.cpp:
Added some compile asserts to verify various match and non-matches for CrossThreadCopier.
* platform/CrossThreadCopier.h:
Added a typedef to convert T* to T, just like the typedef's to remove RefPtr and PassRefPtr.
Added a compile assert to verify that only one of the typedefs did anything.
(CrossThreadCopierBase<false, true, T>::copy): Remove "get" as it is unnecessary.
It shouldn't have been here (PassRefPtr and RefPtr easily and sometimes more efficiently
convert to PassRefPtr without get). Also, a raw pointer doesn't have a get() method.

[email protected]
Review URL: http://codereview.chromium.org/8057001

Modified Paths

Diff

Modified: branches/chromium/835/Source/WebCore/platform/CrossThreadCopier.cpp (96061 => 96062)


--- branches/chromium/835/Source/WebCore/platform/CrossThreadCopier.cpp	2011-09-27 01:36:08 UTC (rev 96061)
+++ branches/chromium/835/Source/WebCore/platform/CrossThreadCopier.cpp	2011-09-27 01:39:09 UTC (rev 96062)
@@ -39,6 +39,8 @@
 #include "ResourceResponse.h"
 #include "SerializedScriptValue.h"
 
+#include <wtf/Assertions.h>
+
 namespace WebCore {
 
 CrossThreadCopierBase<false, false, KURL>::Type CrossThreadCopierBase<false, false, KURL>::copy(const KURL& url)
@@ -66,4 +68,68 @@
     return response.copyData();
 }
 
+// Test CrossThreadCopier using COMPILE_ASSERT.
+
+// Verify that ThreadSafeRefCounted objects get handled correctly.
+class CopierThreadSafeRefCountedTest : public ThreadSafeRefCounted<CopierThreadSafeRefCountedTest> {
+};
+
+COMPILE_ASSERT((WTF::IsSameType<
+                  PassRefPtr<CopierThreadSafeRefCountedTest>,
+                  CrossThreadCopier<PassRefPtr<CopierThreadSafeRefCountedTest> >::Type
+                  >::value),
+               PassRefPtrTest);
+COMPILE_ASSERT((WTF::IsSameType<
+                  PassRefPtr<CopierThreadSafeRefCountedTest>,
+                  CrossThreadCopier<RefPtr<CopierThreadSafeRefCountedTest> >::Type
+                  >::value),
+               RefPtrTest);
+COMPILE_ASSERT((WTF::IsSameType<
+                  PassRefPtr<CopierThreadSafeRefCountedTest>,
+                  CrossThreadCopier<CopierThreadSafeRefCountedTest*>::Type
+                  >::value),
+               RawPointerTest);
+
+
+// Add a generic specialization which will let's us verify that no other template matches.
+template<typename T> struct CrossThreadCopierBase<false, false, T> {
+    typedef int Type;
+};
+
+// Verify that RefCounted objects only match our generic template which exposes Type as int.
+class CopierRefCountedTest : public RefCounted<CopierRefCountedTest> {
+};
+
+COMPILE_ASSERT((WTF::IsSameType<
+                  int,
+                  CrossThreadCopier<PassRefPtr<CopierRefCountedTest> >::Type
+                  >::value),
+               PassRefPtrRefCountedTest);
+
+COMPILE_ASSERT((WTF::IsSameType<
+                  int,
+                  CrossThreadCopier<RefPtr<CopierRefCountedTest> >::Type
+                  >::value),
+               RefPtrRefCountedTest);
+
+COMPILE_ASSERT((WTF::IsSameType<
+                  int,
+                  CrossThreadCopier<CopierRefCountedTest*>::Type
+                  >::value),
+               RawPointerRefCountedTest);
+
+// Verify that PassOwnPtr gets passed through.
+COMPILE_ASSERT((WTF::IsSameType<
+                  PassOwnPtr<float>,
+                  CrossThreadCopier<PassOwnPtr<float> >::Type
+                  >::value),
+               PassOwnPtrTest);
+
+// Verify that PassOwnPtr does not get passed through.
+COMPILE_ASSERT((WTF::IsSameType<
+                  int,
+                  CrossThreadCopier<OwnPtr<float> >::Type
+                  >::value),
+               OwnPtrTest);
+
 } // namespace WebCore

Modified: branches/chromium/835/Source/WebCore/platform/CrossThreadCopier.h (96061 => 96062)


--- branches/chromium/835/Source/WebCore/platform/CrossThreadCopier.h	2011-09-27 01:36:08 UTC (rev 96061)
+++ branches/chromium/835/Source/WebCore/platform/CrossThreadCopier.h	2011-09-27 01:39:09 UTC (rev 96062)
@@ -31,6 +31,7 @@
 #ifndef CrossThreadCopier_h
 #define CrossThreadCopier_h
 
+#include <wtf/Assertions.h>
 #include <wtf/Forward.h>
 #include <wtf/PassOwnPtr.h>
 #include <wtf/PassRefPtr.h>
@@ -68,11 +69,19 @@
     // Custom copy methods.
     template<typename T> struct CrossThreadCopierBase<false, true, T> {
         typedef typename WTF::RemoveTemplate<T, RefPtr>::Type TypeWithoutRefPtr;
-        typedef typename WTF::RemoveTemplate<TypeWithoutRefPtr, PassRefPtr>::Type RefCountedType;
+        typedef typename WTF::RemoveTemplate<TypeWithoutRefPtr, PassRefPtr>::Type TypeWithoutPassRefPtr;
+        typedef typename WTF::RemovePointer<TypeWithoutPassRefPtr>::Type RefCountedType;
+
+        // Verify that only one of the above did a change.
+        COMPILE_ASSERT((WTF::IsSameType<RefPtr<RefCountedType>, T>::value
+                        || WTF::IsSameType<PassRefPtr<RefCountedType>, T>::value
+                        || WTF::IsSameType<RefCountedType*, T>::value),
+                       OnlyAllowOneTypeModification);
+
         typedef PassRefPtr<RefCountedType> Type;
         static Type copy(const T& refPtr)
         {
-            return refPtr.get();
+            return refPtr;
         }
     };
 
@@ -111,6 +120,7 @@
 
     template<typename T> struct CrossThreadCopier : public CrossThreadCopierBase<WTF::IsConvertibleToInteger<T>::value,
                                                                                  WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, ThreadSafeRefCounted>::value
+                                                                                     || WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, ThreadSafeRefCounted>::value
                                                                                      || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Type, ThreadSafeRefCounted>::value,
                                                                                  T> {
     };
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to