Remove .gitignore do nothing is ignored.
[synfig.git] / ETL / trunk / ETL / _handle.h
index 3f07503..393894c 100644 (file)
@@ -6,7 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002 Robert B. Quattlebaum Jr.
-**     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2007, 2008 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -67,6 +67,9 @@ class shared_object
 {
 private:
        mutable int refcount;
+#ifdef ETL_LOCK_REFCOUNTS
+       mutable etl::mutex mtx;
+#endif
 
 protected:
        shared_object():refcount(0) { }
@@ -79,28 +82,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
 
 // ========================================================================
@@ -206,7 +224,7 @@ public:
        swap(handle<value_type> &x)
        {
                pointer ptr=x.obj;
-               x.obj=x.get();
+               x.obj=obj;
                obj=ptr;
                return *this;
        }
@@ -607,7 +625,7 @@ public:
        {
                assert(0);
                pointer ptr=x.obj;
-               x.obj=x.get();
+               x.obj=obj;
                obj=ptr;
                return *this;
        }
@@ -689,7 +707,7 @@ public:
        swap(loose_handle<value_type> &x)
        {
                pointer ptr=x.obj;
-               x.obj=x.get();
+               x.obj=obj;
                obj=ptr;
                return *this;
        }