aboutsummaryrefslogtreecommitdiff
path: root/lib/base/object.h
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-07-04 00:01:42 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-07-04 00:01:42 +0000
commit5b5c4c643d1c2cb1a3949bca4a36d4abcae170cd (patch)
tree6b105d3601013cb4c7bf2f3f2b9f9097d2efd6b6 /lib/base/object.h
parent7aa8a533ef0657eaa8e786384b3a3821a04c179f (diff)
downloadenigma2-5b5c4c643d1c2cb1a3949bca4a36d4abcae170cd.tar.gz
enigma2-5b5c4c643d1c2cb1a3949bca4a36d4abcae170cd.zip
optimized refcounting for MIPS (use asm optimized atomic inc/dec)
Diffstat (limited to 'lib/base/object.h')
-rw-r--r--lib/base/object.h99
1 files changed, 90 insertions, 9 deletions
diff --git a/lib/base/object.h b/lib/base/object.h
index 17178457..f93f4257 100644
--- a/lib/base/object.h
+++ b/lib/base/object.h
@@ -39,16 +39,97 @@ public:
};
#ifndef SWIG
-#define DECLARE_REF(x) private: eSingleLock ref_lock; oRefCount ref; public: void AddRef(); void Release();
-#ifdef OBJECT_DEBUG
-extern int object_total_remaining;
-#define DEFINE_REF(c) void c::AddRef() { eSingleLocker l(ref_lock); ++object_total_remaining; ++ref; eDebug("OBJECT_DEBUG " #c "+%p now %d", this, (int)ref); } void c::Release() { { eSingleLocker l(ref_lock); --object_total_remaining; --ref; eDebug("OBJECT_DEBUG " #c "-%p now %d", this, ref); } if (!ref) delete this; }
-#error fix locking for debug
-#else
-#define DEFINE_REF(c) void c::AddRef() { eSingleLocker l(ref_lock); ++ref; } void c::Release() { { eSingleLocker l(ref_lock); --ref; } if (!ref) delete this; }
-#endif
+ #if defined(__mips__)
+ #define DECLARE_REF(x) \
+ private: oRefCount ref; \
+ public: void AddRef(); \
+ void Release();
+ #define DEFINE_REF(c) \
+ void c::AddRef() \
+ { \
+ unsigned long temp; \
+ __asm__ __volatile__( \
+ " .set mips3 \n" \
+ "1: ll %0, %1 \n" \
+ " .set mips0 \n" \
+ " addu %0, 1 \n" \
+ " .set mips3 \n" \
+ " sc %0, %1 \n" \
+ " .set mips0 \n" \
+ " beqz %0, 1b \n" \
+ : "=&r" (temp), "=m" ((int)ref) \
+ : "m" ((int)ref) \
+ : "memory"); \
+ } \
+ void c::Release() \
+ { \
+ unsigned long temp; \
+ __asm__ __volatile__( \
+ " .set mips3 \n" \
+ "1: ll %0, %1 \n" \
+ " .set mips0 \n" \
+ " subu %0, 1 \n" \
+ " .set mips3 \n" \
+ " sc %0, %1 \n" \
+ " .set mips0 \n" \
+ " beqz %0, 1b \n" \
+ : "=&r" (temp), "=m" ((int)ref) \
+ : "m" ((int)ref) \
+ : "memory"); \
+ if (!ref) \
+ delete this; \
+ }
+ #else
+ #define DECLARE_REF(x) \
+ private:oRefCount ref; \
+ eSingleLock ref_lock; \
+ public: void AddRef(); \
+ void Release();
+ #ifdef OBJECT_DEBUG
+ extern int object_total_remaining;
+ #define DEFINE_REF(c) \
+ void c::AddRef() \
+ { \
+ eSingleLocker l(ref_lock); \
+ ++object_total_remaining; \
+ ++ref; \
+ eDebug("OBJECT_DEBUG " #c "+%p now %d", this, (int)ref); \
+ } \
+ void c::Release() \
+ { \
+ { \
+ eSingleLocker l(ref_lock); \
+ --object_total_remaining; \
+ --ref; \
+ eDebug("OBJECT_DEBUG " #c "-%p now %d", this, ref); \
+ } \
+ if (!ref) \
+ delete this; \
+ }
+ #error fix locking for debug
+ #else
+ #define DEFINE_REF(c) \
+ void c::AddRef() \
+ { \
+ eSingleLocker l(ref_lock); \
+ ++ref; \
+ } \
+ void c::Release() \
+ { \
+ { \
+ eSingleLocker l(ref_lock); \
+ --ref; \
+ } \
+ if (!ref) \
+ delete this; \
+ }
+ #endif
+ #endif
#else
-#define DECLARE_REF(x) private: void AddRef(); void Release();
+ #define DECLARE_REF(x) \
+ private: \
+ void AddRef(); \
+ void Release();
#endif
#ifdef SWIG