X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=ETL%2Ftrunk%2FETL%2F_handle.h;h=6a46f85ae683cf363d88a8dbd37558bf7fa4edce;hb=5f8bb1a790e48650f65f34523efc133a140b6609;hp=9c0b2baba02fe1bae8bf7c325a09b3ab5ac2bcb2;hpb=cee5940bae97612105db8b7e1ffcf513f9d9150c;p=synfig.git diff --git a/ETL/trunk/ETL/_handle.h b/ETL/trunk/ETL/_handle.h index 9c0b2ba..6a46f85 100644 --- a/ETL/trunk/ETL/_handle.h +++ b/ETL/trunk/ETL/_handle.h @@ -1,6 +1,6 @@ /* === E T L =============================================================== */ /*! \file _handle.h -** $Id: _handle.h,v 1.1.1.1 2005/01/04 01:31:47 darco Exp $ +** $Id$ ** \brief Template Object Handle Implementation ** \internal ** @@ -31,7 +31,13 @@ /* === 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 +#endif /* === M A C R O S ========================================================= */ @@ -66,6 +72,9 @@ class shared_object { private: mutable int refcount; +#ifdef ETL_LOCK_REFCOUNTS + mutable Glib::Mutex mutex; +#endif protected: shared_object():refcount(0) { } @@ -78,11 +87,19 @@ protected: public: void ref()const - { assert(refcount>=0); refcount++; } + { +#ifdef ETL_LOCK_REFCOUNTS + Glib::Mutex::Lock lock(mutex); +#endif + assert(refcount>=0); refcount++; + } //! Returns \c false if object needs to be deleted bool unref()const { +#ifdef ETL_LOCK_REFCOUNTS + Glib::Mutex::Lock lock(mutex); +#endif assert(refcount>0); refcount--; @@ -90,6 +107,9 @@ public: if(refcount==0) { #ifdef ETL_SELF_DELETING_SHARED_OBJECT refcount=-666; +#ifdef ETL_LOCK_REFCOUNTS + lock.release(); +#endif delete this; #endif return false; @@ -99,7 +119,12 @@ public: } int count()const - { return refcount; } + { +#ifdef ETL_LOCK_REFCOUNTS + Glib::Mutex::Lock lock(mutex); +#endif + return refcount; + } }; // END of class shared_object // ======================================================================== @@ -391,7 +416,7 @@ private: assert(obj); obj->rref(); - // If this is the first reversable handle + // If this is the first reversible handle if(!obj->front_) { obj->front_=obj->back_=this; @@ -411,7 +436,7 @@ private: assert(obj); obj->runref(); - // If this is the last reversable handle + // If this is the last reversible handle if(obj->front_==obj->back_) { obj->front_=obj->back_=0; @@ -556,7 +581,7 @@ public: /*! Uses the default constructor */ void spawn() { operator=(handle(new T())); } - //! Returns number of reversable instances + //! Returns number of reversible instances count_type rcount()const {