X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=ETL%2Ftrunk%2FETL%2F_handle.h;h=13af09b2fbc5786236ac915939d740c68f0f4a98;hb=ed5137b5f3a34d83207e80d9c96087eddab14379;hp=317f6c2bde27807dd1cdcc67a16bd8caf95c72ea;hpb=117425a5858bb094f2e54af5d018499ab703b227;p=synfig.git diff --git a/ETL/trunk/ETL/_handle.h b/ETL/trunk/ETL/_handle.h index 317f6c2..13af09b 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,7 +72,10 @@ class shared_object { private: mutable int refcount; - +#ifdef ETL_LOCK_REFCOUNTS + mutable synfig::Mutex mutex; +#endif + protected: shared_object():refcount(0) { } @@ -75,14 +84,22 @@ protected: #else ~shared_object() { } #endif - -public: + +public: void ref()const - { assert(refcount>=0); refcount++; } - + { +#ifdef ETL_LOCK_REFCOUNTS + synfig::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 + synfig::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 + mutex.unlock(); +#endif delete this; #endif return false; @@ -97,9 +117,14 @@ public: return true; } - + int count()const - { return refcount; } + { +#ifdef ETL_LOCK_REFCOUNTS + synfig::Mutex::Lock lock(mutex); +#endif + return refcount; + } }; // END of class shared_object // ======================================================================== @@ -182,7 +207,7 @@ public: return *this; } */ - + //! Assignment operator handle & operator=(const handle &x) @@ -229,7 +254,7 @@ public: void reset() { detach(); } bool empty()const { return obj==0; } - + //! Creates a new instance of a T object and puts it in the handle. /*! Uses the default constructor */ void spawn() { operator=(handle(new T())); } @@ -327,20 +352,20 @@ private: public: void *front_; void *back_; - + protected: rshared_object():rrefcount(0),front_(0),back_(0) { } - -public: + +public: void rref()const { rrefcount++; } - + void runref()const { assert(rrefcount>0); rrefcount--; } - + int rcount()const { return rrefcount; } }; // END of class rshared_object @@ -372,7 +397,7 @@ public: using handle::get; using handle::operator *; using handle::operator ->; - + /* operator const handle&()const { return *this; } @@ -380,7 +405,7 @@ public: private: using handle::obj; - + rhandle *prev_; rhandle *next_; @@ -391,14 +416,14 @@ 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; prev_=next_=0; return; } - + prev_=reinterpret_cast*>(obj->back_); next_=0; prev_->next_=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; @@ -429,7 +454,7 @@ private: else next_->prev_=prev_; } - + public: //! Default constructor - empty handle @@ -457,7 +482,7 @@ public: //! Handle is released on deletion ~rhandle() { detach(); } - + //! Template Assignment operator /*! \note This class may not be necessary, and may be removed ** at some point in the future. @@ -480,7 +505,7 @@ public: return *this; } */ - + //! Assignment operator rhandle & operator=(const rhandle &x) @@ -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 { @@ -578,32 +603,32 @@ public: // value_type*& obj(handle::obj); // Required to keep gcc 3.4.2 form barfing assert(obj); assert(x.get()!=obj); - + if(x.get()==obj) return 0; - + rhandle *iter; rhandle *next; - + iter=reinterpret_cast*>(obj->front_); - assert(iter); + assert(iter); next=iter->next_; - + int i=0; #ifndef NDEBUG pointer obj_=obj; #endif - + for(;iter;iter=next,next=iter?iter->next_:0,i++) { - assert(iter->get()==obj_); + assert(iter->get()==obj_); (*iter)=x; } assert(obj==x.get()); - + return i; } @@ -711,7 +736,7 @@ public: //void release() { detach(); } void reset() { detach(); } - + bool empty()const { return obj==0; } handle clone()const { assert(obj); return obj->clone(); } @@ -782,8 +807,8 @@ template template handle handle::cast_reinterpret(const loose_handle &x) { return handle(reinterpret_cast(x.get())); } - - + + template template handle handle::cast_static(const rhandle &x) { return handle(static_cast(x.get())); } @@ -800,8 +825,8 @@ template template handle handle::cast_reinterpret(const rhandle &x) { return handle(reinterpret_cast(x.get())); } - - + + template template handle handle::cast_static(U* x) { return handle(static_cast(x)); }