From: dooglus Date: Fri, 22 Feb 2008 19:49:27 +0000 (+0000) Subject: Use etl::mutexes to lock access to reference counts. X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=9fc439081f4226774682129daa12d25f5ae3dfcb;p=synfig.git Use etl::mutexes to lock access to reference counts. git-svn-id: http://svn.voria.com/code@1799 1f10aa63-cdf2-0310-b900-c93c546f37ac --- diff --git a/ETL/trunk/ETL/_handle.h b/ETL/trunk/ETL/_handle.h index 3f07503..862c914 100644 --- a/ETL/trunk/ETL/_handle.h +++ b/ETL/trunk/ETL/_handle.h @@ -32,8 +32,15 @@ /* === H E A D E R S ======================================================= */ +// include the next line in an attempt to increase stability +#define ETL_LOCK_REFCOUNTS + #include +#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 // ========================================================================