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 13 namespace base { 14 namespace mac { 15 16 namespace internal { 17 18 struct BASE_EXPORT SendRightTraits { InvalidValueSendRightTraits19 static mach_port_t InvalidValue() { 20 return MACH_PORT_NULL; 21 } 22 23 BASE_EXPORT static void Free(mach_port_t port); 24 }; 25 26 struct BASE_EXPORT ReceiveRightTraits { InvalidValueReceiveRightTraits27 static mach_port_t InvalidValue() { 28 return MACH_PORT_NULL; 29 } 30 31 BASE_EXPORT static void Free(mach_port_t port); 32 }; 33 34 struct PortSetTraits { InvalidValuePortSetTraits35 static mach_port_t InvalidValue() { 36 return MACH_PORT_NULL; 37 } 38 39 BASE_EXPORT static void Free(mach_port_t port); 40 }; 41 42 } // namespace internal 43 44 // A scoper for handling a Mach port that names a send right. Send rights are 45 // reference counted, and this takes ownership of the right on construction 46 // and then removes a reference to the right on destruction. If the reference 47 // is the last one on the right, the right is deallocated. 48 using ScopedMachSendRight = 49 ScopedGeneric<mach_port_t, internal::SendRightTraits>; 50 51 // A scoper for handling a Mach port's receive right. There is only one 52 // receive right per port. This takes ownership of the receive right on 53 // construction and then destroys the right on destruction, turning all 54 // outstanding send rights into dead names. 55 using ScopedMachReceiveRight = 56 ScopedGeneric<mach_port_t, internal::ReceiveRightTraits>; 57 58 // A scoper for handling a Mach port set. A port set can have only one 59 // reference. This takes ownership of that single reference on construction and 60 // destroys the port set on destruction. Destroying a port set does not destroy 61 // the receive rights that are members of the port set. 62 using ScopedMachPortSet = ScopedGeneric<mach_port_t, internal::PortSetTraits>; 63 64 } // namespace mac 65 } // namespace base 66 67 #endif // BASE_MAC_SCOPED_MACH_PORT_H_ 68