tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ref_count.h (2947B)


      1 /*
      2 *  Copyright 2011 The WebRTC Project Authors. All rights reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 #ifndef API_REF_COUNT_H_
     11 #define API_REF_COUNT_H_
     12 
     13 namespace webrtc {
     14 
     15 // Refcounted objects should implement the following informal interface:
     16 //
     17 // void AddRef() const ;
     18 // RefCountReleaseStatus Release() const;
     19 //
     20 // You may access members of a reference-counted object, including the AddRef()
     21 // and Release() methods, only if you already own a reference to it, or if
     22 // you're borrowing someone else's reference. (A newly created object is a
     23 // special case: the reference count is zero on construction, and the code that
     24 // creates the object should immediately call AddRef(), bringing the reference
     25 // count from zero to one, e.g., by constructing an scoped_refptr).
     26 //
     27 // AddRef() creates a new reference to the object.
     28 //
     29 // Release() releases a reference to the object; the caller now has one less
     30 // reference than before the call. Returns kDroppedLastRef if the number of
     31 // references dropped to zero because of this (in which case the object destroys
     32 // itself). Otherwise, returns kOtherRefsRemained, to signal that at the precise
     33 // time the caller's reference was dropped, other references still remained (but
     34 // if other threads own references, this may of course have changed by the time
     35 // Release() returns).
     36 //
     37 // The caller of Release() must treat it in the same way as a delete operation:
     38 // Regardless of the return value from Release(), the caller mustn't access the
     39 // object. The object might still be alive, due to references held by other
     40 // users of the object, but the object can go away at any time, e.g., as the
     41 // result of another thread calling Release().
     42 //
     43 // Calling AddRef() and Release() manually is discouraged. It's recommended to
     44 // use scoped_refptr to manage all pointers to reference counted
     45 // objects. Note that scoped_refptr depends on compile-time duck-typing;
     46 // formally implementing the below RefCountInterface is not required.
     47 
     48 enum class RefCountReleaseStatus { kDroppedLastRef, kOtherRefsRemained };
     49 
     50 // Interfaces where refcounting is part of the public api should
     51 // inherit this abstract interface. The implementation of these
     52 // methods is usually provided by the RefCountedObject template class,
     53 // applied as a leaf in the inheritance tree.
     54 class RefCountInterface {
     55 public:
     56  virtual void AddRef() const = 0;
     57  virtual RefCountReleaseStatus Release() const = 0;
     58 
     59  // Non-public destructor, because Release() has exclusive responsibility for
     60  // destroying the object.
     61 protected:
     62  virtual ~RefCountInterface() {}
     63 };
     64 
     65 }  // namespace webrtc
     66 
     67 #endif  // API_REF_COUNT_H_