summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/kernel/gc.hpp
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2009-11-30 08:36:07 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2009-11-30 08:36:07 +0000
commitcd7dae28b034deebc9c2c2469ed9d8f1f3dab1ed (patch)
tree80cead86cff364718c968849e1c185121a79892d /sca-cpp/trunk/kernel/gc.hpp
parenta9941f3ba6624b88ef62a2a7bf260f50761ffbf9 (diff)
Added debug macros and cleaned up debug logging. Added locking macros used when compiling for multithreading. Fixed value conversions to numbers. Fixed compile warnings.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@885348 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/kernel/gc.hpp')
-rw-r--r--sca-cpp/trunk/kernel/gc.hpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/sca-cpp/trunk/kernel/gc.hpp b/sca-cpp/trunk/kernel/gc.hpp
index 7739e714c2..bb5bbccb24 100644
--- a/sca-cpp/trunk/kernel/gc.hpp
+++ b/sca-cpp/trunk/kernel/gc.hpp
@@ -33,6 +33,24 @@
namespace tuscany
{
+/**
+ * Macros used to add or subtract values to reference counters.
+ * In a multithreaded environment, define MTHREAD_GC to use
+ * the GCC __sync_add_and_fetch and __sync_sub_and_fetch built
+ * in functions.
+ */
+#ifdef MTHREAD_GC
+
+#define gc_add_and_fetch(t, v) __sync_add_and_fetch(&(t), v)
+#define gc_sub_and_fetch(t, v) __sync_sub_and_fetch(&(t), v)
+
+#else
+
+#define gc_add_and_fetch(t, v) ((t) = (t) + (v))
+#define gc_sub_and_fetch(t, v) ((t) = (t) - (v))
+
+#endif
+
template<typename T> class gc_ptr {
public:
gc_ptr(T* p = 0) throw() : countingRef(p == 0? 0 : new CountingRef(p)) {
@@ -95,12 +113,12 @@ private:
void acquire(CountingRef* ref) throw() {
if(ref)
- __sync_add_and_fetch(&ref->count, 1);
+ gc_add_and_fetch(ref->count, (unsigned int)1);
}
void release() throw() {
if(countingRef) {
- unsigned rc = __sync_sub_and_fetch(&countingRef->count, 1);
+ unsigned rc = gc_sub_and_fetch(countingRef->count, (unsigned int)1);
if(rc == 0) {
delete countingRef->ptr;
delete countingRef;
@@ -178,12 +196,12 @@ private:
void acquire(CountingRef* ref) throw() {
if(ref)
- __sync_add_and_fetch(&ref->count, 1);
+ gc_add_and_fetch(ref->count, (unsigned int)1);
}
void release() throw() {
if(countingRef) {
- unsigned rc = __sync_sub_and_fetch(&countingRef->count, 1);
+ unsigned rc = gc_sub_and_fetch(countingRef->count, (unsigned int)1);
if(rc == 0) {
delete[] countingRef->ptr;
delete countingRef;
@@ -311,11 +329,11 @@ private:
}
unsigned int acquire() {
- return __sync_add_and_fetch(&refCount, 1);
+ return gc_add_and_fetch(refCount, (unsigned int)1);
}
unsigned int release() {
- return __sync_sub_and_fetch(&refCount, 1);
+ return gc_sub_and_fetch(refCount, (unsigned int)1);
}
};