Use etl::mutexes to lock access to reference counts.
authordooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 22 Feb 2008 19:49:27 +0000 (19:49 +0000)
committerdooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 22 Feb 2008 19:49:27 +0000 (19:49 +0000)
git-svn-id: http://svn.voria.com/code@1799 1f10aa63-cdf2-0310-b900-c93c546f37ac

ETL/trunk/ETL/_handle.h

index 3f07503..862c914 100644 (file)
 
 /* === H E A D E R S ======================================================= */
 
+// include the next line in an attempt to increase stability
+#define ETL_LOCK_REFCOUNTS
+
 #include <cassert>
 
+#ifdef ETL_LOCK_REFCOUNTS
+#  include "_mutex_simple.h"
+#endif
+
 /* === M A C R O S ========================================================= */
 
 /* === T Y P E D E F S ===================================================== */
@@ -67,6 +74,9 @@ class shared_object
 {
 private:
        mutable int refcount;
+#ifdef ETL_LOCK_REFCOUNTS
+       mutable etl::mutex mtx;
+#endif
 
 protected:
        shared_object():refcount(0) { }
@@ -79,28 +89,43 @@ protected:
 
 public:
        void ref()const
-               { assert(refcount>=0); refcount++; }
+       {
+#ifdef ETL_LOCK_REFCOUNTS
+               etl::mutex::lock lock(mtx);
+#endif
+               assert(refcount>=0);
+               refcount++;
+       }
 
        //! Returns \c false if object needs to be deleted
        bool unref()const
        {
-               assert(refcount>0);
+               bool ret = true;
+               {
+#ifdef ETL_LOCK_REFCOUNTS
+                       etl::mutex::lock lock(mtx);
+#endif
+                       assert(refcount>0);
 
-               refcount--;
+                       refcount--;
 
-               if(refcount==0) {
+                       if(refcount==0) {
+                               ret = false;
 #ifdef ETL_SELF_DELETING_SHARED_OBJECT
-                       refcount=-666;
-                       delete this;
+                               refcount=-666;
 #endif
-                       return false;
+                       }
                }
 
-               return true;
+#ifdef ETL_SELF_DELETING_SHARED_OBJECT
+               if (!ret)
+                       delete this;
+#endif
+               return ret;
        }
 
-       int count()const
-               { return refcount; }
+       int count()const { return refcount; }
+
 }; // END of class shared_object
 
 // ========================================================================