1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <CoreFoundation/CoreFoundation.h> 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/scoped_generic.h" 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace mac { 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 15cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkonamespace internal { 16cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 17cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostruct ScopedCFFileDescriptorRefTraits { 18cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko static CFFileDescriptorRef InvalidValue() { return nullptr; } 19cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko static void Free(CFFileDescriptorRef ref) { 20cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko CFFileDescriptorInvalidate(ref); 21cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko CFRelease(ref); 22cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko } 23cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}; 24cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 25cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko} // namespace internal 26cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ScopedCFFileDescriptorRef is designed after ScopedCFTypeRef<>. On 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// destruction, it will invalidate the file descriptor. 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ScopedCFFileDescriptorRef (unlike ScopedCFTypeRef<>) does not support RETAIN 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// semantics, copying, or assignment, as doing so would increase the chances 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// that a file descriptor is invalidated while still in use. 32cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkousing ScopedCFFileDescriptorRef = 33cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko ScopedGeneric<CFFileDescriptorRef, 34cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko internal::ScopedCFFileDescriptorRefTraits>; 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace mac 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ 40