// 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_