projects
/
synfig.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revert the accidental removal of mod_libavcodec in r2286.
[synfig.git]
/
ETL
/
trunk
/
ETL
/
_handle.h
diff --git
a/ETL/trunk/ETL/_handle.h
b/ETL/trunk/ETL/_handle.h
index
32a37ad
..
393894c
100644
(file)
--- a/
ETL/trunk/ETL/_handle.h
+++ b/
ETL/trunk/ETL/_handle.h
@@
-6,6
+6,7
@@
**
** \legal
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
**
** \legal
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** 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
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
@@
-66,6
+67,9
@@
class shared_object
{
private:
mutable int refcount;
{
private:
mutable int refcount;
+#ifdef ETL_LOCK_REFCOUNTS
+ mutable etl::mutex mtx;
+#endif
protected:
shared_object():refcount(0) { }
protected:
shared_object():refcount(0) { }
@@
-78,28
+82,43
@@
protected:
public:
void ref()const
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
{
//! 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
#ifdef ETL_SELF_DELETING_SHARED_OBJECT
- refcount=-666;
- delete this;
+ refcount=-666;
#endif
#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
// ========================================================================
}; // END of class shared_object
// ========================================================================
@@
-205,7
+224,7
@@
public:
swap(handle<value_type> &x)
{
pointer ptr=x.obj;
swap(handle<value_type> &x)
{
pointer ptr=x.obj;
- x.obj=
x.get()
;
+ x.obj=
obj
;
obj=ptr;
return *this;
}
obj=ptr;
return *this;
}
@@
-361,8
+380,8
@@
public:
using handle<value_type>::unique;
using handle<value_type>::operator bool;
using handle<value_type>::get;
using handle<value_type>::unique;
using handle<value_type>::operator bool;
using handle<value_type>::get;
- using handle<value_type>::operator
*;
- using handle<value_type>::operator
->;
+ using handle<value_type>::operator*;
+ using handle<value_type>::operator->;
/*
operator const handle<value_type>&()const
/*
operator const handle<value_type>&()const
@@
-606,7
+625,7
@@
public:
{
assert(0);
pointer ptr=x.obj;
{
assert(0);
pointer ptr=x.obj;
- x.obj=
x.get()
;
+ x.obj=
obj
;
obj=ptr;
return *this;
}
obj=ptr;
return *this;
}
@@
-688,7
+707,7
@@
public:
swap(loose_handle<value_type> &x)
{
pointer ptr=x.obj;
swap(loose_handle<value_type> &x)
{
pointer ptr=x.obj;
- x.obj=
x.get()
;
+ x.obj=
obj
;
obj=ptr;
return *this;
}
obj=ptr;
return *this;
}