Mesa (master): clover: Define an intrusive smart reference class.

Francisco Jerez currojerez at kemper.freedesktop.org
Fri Feb 21 11:58:20 UTC 2014


Module: Mesa
Branch: master
Commit: 1b9fb2fd9129f834f041efe7f96e83998477c78b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1b9fb2fd9129f834f041efe7f96e83998477c78b

Author: Francisco Jerez <currojerez at riseup.net>
Date:   Tue Feb 18 13:20:07 2014 +0100

clover: Define an intrusive smart reference class.

Tested-by: Tom Stellard <thomas.stellard at amd.com>

---

 src/gallium/state_trackers/clover/util/pointer.hpp |   66 ++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/src/gallium/state_trackers/clover/util/pointer.hpp b/src/gallium/state_trackers/clover/util/pointer.hpp
index b7a633b5..98823aa 100644
--- a/src/gallium/state_trackers/clover/util/pointer.hpp
+++ b/src/gallium/state_trackers/clover/util/pointer.hpp
@@ -134,6 +134,72 @@ namespace clover {
    }
 
    ///
+   /// Intrusive smart reference for objects that implement the
+   /// clover::ref_counter interface.
+   ///
+   template<typename T>
+   class intrusive_ref {
+   public:
+      intrusive_ref(T &o) : p(&o) {
+         p->retain();
+      }
+
+      intrusive_ref(const intrusive_ref &ref) :
+         intrusive_ref(*ref.p) {
+      }
+
+      intrusive_ref(intrusive_ref &&ref) :
+         p(ref.p) {
+         ref.p = NULL;
+      }
+
+      ~intrusive_ref() {
+         if (p && p->release())
+            delete p;
+      }
+
+      intrusive_ref &
+      operator=(intrusive_ref ref) {
+         std::swap(ref.p, p);
+         return *this;
+      }
+
+      bool
+      operator==(const intrusive_ref &ref) const {
+         return p == ref.p;
+      }
+
+      bool
+      operator!=(const intrusive_ref &ref) const {
+         return p != ref.p;
+      }
+
+      T &
+      operator()() const {
+         return *p;
+      }
+
+      operator T &() const {
+         return *p;
+      }
+
+   private:
+      T *p;
+   };
+
+   ///
+   /// Transfer the caller's ownership of a reference-counted object
+   /// to a clover::intrusive_ref smart reference.
+   ///
+   template<typename T>
+   inline intrusive_ref<T>
+   transfer(T &o) {
+      intrusive_ref<T> ref { o };
+      o.release();
+      return ref;
+   }
+
+   ///
    /// Class that implements the usual pointer interface but in fact
    /// contains the object it seems to be pointing to.
    ///




More information about the mesa-commit mailing list