1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef BASE_MAC_SCOPED_MACH_PORT_H_ 6#define BASE_MAC_SCOPED_MACH_PORT_H_ 7 8#include <mach/mach.h> 9 10#include "base/base_export.h" 11#include "base/scoped_generic.h" 12 13namespace base { 14namespace mac { 15 16namespace internal { 17 18struct BASE_EXPORT SendRightTraits { 19 static mach_port_t InvalidValue() { 20 return MACH_PORT_NULL; 21 } 22 23 static void Free(mach_port_t port); 24}; 25 26struct BASE_EXPORT ReceiveRightTraits { 27 static mach_port_t InvalidValue() { 28 return MACH_PORT_NULL; 29 } 30 31 static void Free(mach_port_t port); 32}; 33 34} // namespace internal 35 36// A scoper for handling a Mach port that names a send right. Send rights are 37// reference counted, and this takes ownership of the right on construction 38// and then removes a reference to the right on destruction. If the reference 39// is the last one on the right, the right is deallocated. 40class BASE_EXPORT ScopedMachSendRight : 41 public base::ScopedGeneric<mach_port_t, internal::SendRightTraits> { 42 public: 43 explicit ScopedMachSendRight(mach_port_t port = traits_type::InvalidValue()) 44 : ScopedGeneric(port) {} 45 46 operator mach_port_t() const { return get(); } 47}; 48 49// A scoper for handling a Mach port's receive right. There is only one 50// receive right per port. This takes ownership of the receive right on 51// construction and then destroys the right on destruction, turning all 52// outstanding send rights into dead names. 53class BASE_EXPORT ScopedMachReceiveRight : 54 public base::ScopedGeneric<mach_port_t, internal::ReceiveRightTraits> { 55 public: 56 explicit ScopedMachReceiveRight( 57 mach_port_t port = traits_type::InvalidValue()) : ScopedGeneric(port) {} 58 59 operator mach_port_t() const { return get(); } 60}; 61 62} // namespace mac 63} // namespace base 64 65#endif // BASE_MAC_SCOPED_MACH_PORT_H_ 66