/* === 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 ===================================================== */
{
private:
mutable int refcount;
+#ifdef ETL_LOCK_REFCOUNTS
+ mutable etl::mutex mtx;
+#endif
protected:
shared_object():refcount(0) { }
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
// ========================================================================