/* * 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 * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_CROSS_THREAD_COPIER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_CROSS_THREAD_COPIER_H_ #include #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/interface_ptr_info.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "third_party/blink/public/common/messaging/message_port_channel.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/functional.h" // FunctionThreadAffinity #include "third_party/blink/renderer/platform/wtf/type_traits.h" #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h" namespace base { template class RefCountedThreadSafe; class TimeDelta; class TimeTicks; class Time; } class SkRefCnt; template class sk_sp; namespace WTF { template class PassedWrapper; } namespace blink { class IntRect; class IntSize; class KURL; template class CrossThreadPersistent; template class CrossThreadWeakPersistent; template struct CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopierPassThrough); typedef T Type; static Type Copy(const T& parameter) { return parameter; } }; template struct CrossThreadCopierBase; // Arithmetic values (integers or floats) and enums can be safely copied. template struct CrossThreadCopierBase : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopierBase); }; template struct CrossThreadCopier : public CrossThreadCopierBase::value || std::is_enum::value> { STATIC_ONLY(CrossThreadCopier); }; // CrossThreadCopier specializations follow. template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); static_assert(WTF::IsSubclassOfTemplate::value, "scoped_refptr can be passed across threads only if T is " "WTF::ThreadSafeRefCounted or base::RefCountedThreadSafe."); using Type = WTF::RetainedRefWrapper; static Type Copy(Type pointer) { return pointer; } }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); static_assert(WTF::IsSubclassOfTemplate::value, "scoped_refptr can be passed across threads only if T is " "WTF::ThreadSafeRefCounted or base::RefCountedThreadSafe."); using Type = scoped_refptr; static scoped_refptr Copy(scoped_refptr pointer) { return pointer; } }; template struct CrossThreadCopier> : public CrossThreadCopierPassThrough> { STATIC_ONLY(CrossThreadCopier); static_assert(std::is_base_of::value, "sk_sp can be passed across threads only if T is SkRefCnt."); }; template <> struct CrossThreadCopier : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopier); }; template <> struct CrossThreadCopier : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopier); }; template <> struct CrossThreadCopier : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopier); }; // nullptr_t can be passed through without any changes. template <> struct CrossThreadCopier : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopier); }; // To allow a type to be passed across threads using its copy constructor, add a // forward declaration of the type and provide a specialization of // CrossThreadCopier in this file, like IntRect below. template <> struct CrossThreadCopier : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopier); }; template <> struct CrossThreadCopier : public CrossThreadCopierPassThrough { STATIC_ONLY(CrossThreadCopier); }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = std::unique_ptr; static std::unique_ptr Copy(std::unique_ptr pointer) { return pointer; // This is in fact a move. } }; template struct CrossThreadCopier< Vector, inlineCapacity, Allocator>> { STATIC_ONLY(CrossThreadCopier); using Type = Vector, inlineCapacity, Allocator>; static Type Copy(Type pointer) { return pointer; // This is in fact a move. } }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = Vector; static Type Copy(Type value) { return value; } }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = Vector; static Type Copy(Type value) { return value; } }; template struct CrossThreadCopier> : public CrossThreadCopierPassThrough> { STATIC_ONLY(CrossThreadCopier); }; template struct CrossThreadCopier> : public CrossThreadCopierPassThrough> { STATIC_ONLY(CrossThreadCopier); }; template struct CrossThreadCopier> : public CrossThreadCopierPassThrough< WTF::CrossThreadUnretainedWrapper> { STATIC_ONLY(CrossThreadCopier); }; template struct CrossThreadCopier> : public CrossThreadCopierPassThrough> { STATIC_ONLY(CrossThreadCopier); }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = WTF::PassedWrapper::Type>; static Type Copy(WTF::PassedWrapper&& value) { return WTF::Passed(CrossThreadCopier::Copy(value.MoveOut())); } }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = WTF::CrossThreadFunction; static Type Copy(Type&& value) { return std::move(value); } }; template <> struct CrossThreadCopier { STATIC_ONLY(CrossThreadCopier); typedef KURL Type; PLATFORM_EXPORT static Type Copy(const KURL&); }; template <> struct CrossThreadCopier { STATIC_ONLY(CrossThreadCopier); typedef String Type; PLATFORM_EXPORT static Type Copy(const String&); }; // mojo::InterfacePtrInfo is a cross-thread safe mojo::InterfacePtr. template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = mojo::InterfacePtrInfo; static Type Copy(Type ptr_info) { return ptr_info; // This is in fact a move. } }; template struct CrossThreadCopier> { STATIC_ONLY(CrossThreadCopier); using Type = mojo::InterfaceRequest; static Type Copy(Type request) { return request; // This is in fact a move. } }; template <> struct CrossThreadCopier { STATIC_ONLY(CrossThreadCopier); using Type = MessagePortChannel; static Type Copy(Type pointer) { return pointer; // This is in fact a move. } }; template struct CrossThreadCopier< Vector> { STATIC_ONLY(CrossThreadCopier); using Type = Vector; static Type Copy(Type pointer) { return pointer; // This is in fact a move. } }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_CROSS_THREAD_COPIER_H_