1*6777b538SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_APPLE_SCOPED_DISPATCH_OBJECT_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_APPLE_SCOPED_DISPATCH_OBJECT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <dispatch/dispatch.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/apple/scoped_typeref.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #if __OBJC__ 13*6777b538SAndroid Build Coastguard Worker // In Objective-C ARC, dispatch types are Objective-C types, and must be managed 14*6777b538SAndroid Build Coastguard Worker // as such with __strong, etc. This header file must not be included in 15*6777b538SAndroid Build Coastguard Worker // Objective-C code, nor may it be allowed to be recursively included. Use the 16*6777b538SAndroid Build Coastguard Worker // pimpl pattern to isolate its use in a pure C++ file if needed. 17*6777b538SAndroid Build Coastguard Worker #error Do not use this file, or allow it to be included, in Objective-C code. 18*6777b538SAndroid Build Coastguard Worker #endif 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace base::apple { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker namespace internal { 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker template <typename T> 25*6777b538SAndroid Build Coastguard Worker struct ScopedDispatchObjectTraits { InvalidValueScopedDispatchObjectTraits26*6777b538SAndroid Build Coastguard Worker static constexpr T InvalidValue() { return nullptr; } RetainScopedDispatchObjectTraits27*6777b538SAndroid Build Coastguard Worker static T Retain(T object) { 28*6777b538SAndroid Build Coastguard Worker dispatch_retain(object); 29*6777b538SAndroid Build Coastguard Worker return object; 30*6777b538SAndroid Build Coastguard Worker } ReleaseScopedDispatchObjectTraits31*6777b538SAndroid Build Coastguard Worker static void Release(T object) { dispatch_release(object); } 32*6777b538SAndroid Build Coastguard Worker }; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker } // namespace internal 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker template <typename T> 37*6777b538SAndroid Build Coastguard Worker using ScopedDispatchObject = 38*6777b538SAndroid Build Coastguard Worker ScopedTypeRef<T, internal::ScopedDispatchObjectTraits<T>>; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker } // namespace base::apple 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker #endif // BASE_APPLE_SCOPED_DISPATCH_OBJECT_H_ 43