Home | History | Annotate | Download | only in mac
      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 {
     19   static mach_port_t InvalidValue() {
     20     return MACH_PORT_NULL;
     21   }
     22 
     23   static void Free(mach_port_t port);
     24 };
     25 
     26 struct 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.
     40 class 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.
     53 class 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