summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/CrossThreadCopier.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/CrossThreadCopier.h')
-rw-r--r--WebCore/platform/CrossThreadCopier.h41
1 files changed, 25 insertions, 16 deletions
diff --git a/WebCore/platform/CrossThreadCopier.h b/WebCore/platform/CrossThreadCopier.h
index 2bdf57d..0a9aeeb 100644
--- a/WebCore/platform/CrossThreadCopier.h
+++ b/WebCore/platform/CrossThreadCopier.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -40,6 +40,7 @@
namespace WebCore {
+ class KURL;
class ResourceError;
class ResourceRequest;
class ResourceResponse;
@@ -56,29 +57,30 @@ namespace WebCore {
}
};
- template<bool isConvertibleToInteger, typename T> struct CrossThreadCopierBase;
+ template<bool isConvertibleToInteger, bool isThreadsafeShared, typename T> struct CrossThreadCopierBase;
// Integers get passed through without any changes.
- template<typename T> struct CrossThreadCopierBase<true, T> : public CrossThreadCopierPassThrough<T> {
+ template<typename T> struct CrossThreadCopierBase<true, false, T> : public CrossThreadCopierPassThrough<T> {
};
// Pointers get passed through without any significant changes.
- template<typename T> struct CrossThreadCopierBase<false, T*> : public CrossThreadCopierPassThrough<T*> {
+ template<typename T> struct CrossThreadCopierBase<false, false, T*> : public CrossThreadCopierPassThrough<T*> {
};
- template<> struct CrossThreadCopierBase<false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> {
+ template<> struct CrossThreadCopierBase<false, false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> {
};
// Custom copy methods.
- template<typename T> struct CrossThreadCopierBase<false, RefPtr<ThreadSafeShared<T> > > {
- typedef PassRefPtr<T> Type;
- static Type copy(const RefPtr<ThreadSafeShared<T> >& refPtr)
+ template<typename T> struct CrossThreadCopierBase<false, true, T> {
+ typedef typename WTF::RemoveTemplate<T, RefPtr>::Type RefCountedType;
+ typedef PassRefPtr<RefCountedType> Type;
+ static Type copy(const T& refPtr)
{
- return PassRefPtr<T>(static_cast<T*>(refPtr.get()));
+ return refPtr.get();
}
};
- template<typename T> struct CrossThreadCopierBase<false, PassOwnPtr<T> > {
+ template<typename T> struct CrossThreadCopierBase<false, false, PassOwnPtr<T> > {
typedef PassOwnPtr<T> Type;
static Type copy(const PassOwnPtr<T>& ownPtr)
{
@@ -86,7 +88,7 @@ namespace WebCore {
}
};
- template<typename T> struct CrossThreadCopierBase<false, std::auto_ptr<T> > {
+ template<typename T> struct CrossThreadCopierBase<false, false, std::auto_ptr<T> > {
typedef std::auto_ptr<T> Type;
static Type copy(const std::auto_ptr<T>& autoPtr)
{
@@ -94,27 +96,34 @@ namespace WebCore {
}
};
- template<> struct CrossThreadCopierBase<false, String> {
+ template<> struct CrossThreadCopierBase<false, false, KURL> {
+ typedef KURL Type;
+ static Type copy(const KURL&);
+ };
+
+ template<> struct CrossThreadCopierBase<false, false, String> {
typedef String Type;
static Type copy(const String&);
};
- template<> struct CrossThreadCopierBase<false, ResourceError> {
+ template<> struct CrossThreadCopierBase<false, false, ResourceError> {
typedef ResourceError Type;
static Type copy(const ResourceError&);
};
- template<> struct CrossThreadCopierBase<false, ResourceRequest> {
+ template<> struct CrossThreadCopierBase<false, false, ResourceRequest> {
typedef std::auto_ptr<CrossThreadResourceRequestData> Type;
static Type copy(const ResourceRequest&);
};
- template<> struct CrossThreadCopierBase<false, ResourceResponse> {
+ template<> struct CrossThreadCopierBase<false, false, ResourceResponse> {
typedef std::auto_ptr<CrossThreadResourceResponseData> Type;
static Type copy(const ResourceResponse&);
};
- template<typename T> struct CrossThreadCopier : public CrossThreadCopierBase<WTF::IsConvertibleToInteger<T>::value, T> {
+ template<typename T> struct CrossThreadCopier : public CrossThreadCopierBase<WTF::IsConvertibleToInteger<T>::value,
+ WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, ThreadSafeShared>::value,
+ T> {
};
} // namespace WebCore