|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_MAC_SCOPED_MACH_PORT_H_ | 
|  | #define BASE_MAC_SCOPED_MACH_PORT_H_ | 
|  |  | 
|  | #include <mach/mach.h> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/scoped_generic.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace mac { | 
|  |  | 
|  | namespace internal { | 
|  |  | 
|  | struct BASE_EXPORT SendRightTraits { | 
|  | static mach_port_t InvalidValue() { | 
|  | return MACH_PORT_NULL; | 
|  | } | 
|  |  | 
|  | static void Free(mach_port_t port); | 
|  | }; | 
|  |  | 
|  | struct BASE_EXPORT ReceiveRightTraits { | 
|  | static mach_port_t InvalidValue() { | 
|  | return MACH_PORT_NULL; | 
|  | } | 
|  |  | 
|  | static void Free(mach_port_t port); | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  |  | 
|  | // A scoper for handling a Mach port that names a send right. Send rights are | 
|  | // reference counted, and this takes ownership of the right on construction | 
|  | // and then removes a reference to the right on destruction. If the reference | 
|  | // is the last one on the right, the right is deallocated. | 
|  | class BASE_EXPORT ScopedMachSendRight : | 
|  | public base::ScopedGeneric<mach_port_t, internal::SendRightTraits> { | 
|  | public: | 
|  | explicit ScopedMachSendRight(mach_port_t port = traits_type::InvalidValue()) | 
|  | : ScopedGeneric(port) {} | 
|  |  | 
|  | operator mach_port_t() const { return get(); } | 
|  | }; | 
|  |  | 
|  | // A scoper for handling a Mach port's receive right. There is only one | 
|  | // receive right per port. This takes ownership of the receive right on | 
|  | // construction and then destroys the right on destruction, turning all | 
|  | // outstanding send rights into dead names. | 
|  | class BASE_EXPORT ScopedMachReceiveRight : | 
|  | public base::ScopedGeneric<mach_port_t, internal::ReceiveRightTraits> { | 
|  | public: | 
|  | explicit ScopedMachReceiveRight( | 
|  | mach_port_t port = traits_type::InvalidValue()) : ScopedGeneric(port) {} | 
|  |  | 
|  | operator mach_port_t() const { return get(); } | 
|  | }; | 
|  |  | 
|  | }  // namespace mac | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_MAC_SCOPED_MACH_PORT_H_ |