xref: /aosp_15_r20/external/cronet/base/apple/scoped_cffiledescriptorref.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_CFFILEDESCRIPTORREF_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_APPLE_SCOPED_CFFILEDESCRIPTORREF_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <CoreFoundation/CoreFoundation.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/scoped_generic.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace base::apple {
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker namespace internal {
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker struct ScopedCFFileDescriptorRefTraits {
InvalidValueScopedCFFileDescriptorRefTraits17*6777b538SAndroid Build Coastguard Worker   static CFFileDescriptorRef InvalidValue() { return nullptr; }
FreeScopedCFFileDescriptorRefTraits18*6777b538SAndroid Build Coastguard Worker   static void Free(CFFileDescriptorRef ref) {
19*6777b538SAndroid Build Coastguard Worker     CFFileDescriptorInvalidate(ref);
20*6777b538SAndroid Build Coastguard Worker     CFRelease(ref);
21*6777b538SAndroid Build Coastguard Worker   }
22*6777b538SAndroid Build Coastguard Worker };
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker }  // namespace internal
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker // ScopedCFFileDescriptorRef is designed after ScopedCFTypeRef<>. On
27*6777b538SAndroid Build Coastguard Worker // destruction, it will invalidate the file descriptor.
28*6777b538SAndroid Build Coastguard Worker // ScopedCFFileDescriptorRef (unlike ScopedCFTypeRef<>) does not support RETAIN
29*6777b538SAndroid Build Coastguard Worker // semantics, copying, or assignment, as doing so would increase the chances
30*6777b538SAndroid Build Coastguard Worker // that a file descriptor is invalidated while still in use.
31*6777b538SAndroid Build Coastguard Worker using ScopedCFFileDescriptorRef =
32*6777b538SAndroid Build Coastguard Worker     ScopedGeneric<CFFileDescriptorRef,
33*6777b538SAndroid Build Coastguard Worker                   internal::ScopedCFFileDescriptorRefTraits>;
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker }  // namespace base::apple
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker #endif  // BASE_APPLE_SCOPED_CFFILEDESCRIPTORREF_H_
38