diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-07-04 00:01:42 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-07-04 00:01:42 +0000 |
| commit | 5b5c4c643d1c2cb1a3949bca4a36d4abcae170cd (patch) | |
| tree | 6b105d3601013cb4c7bf2f3f2b9f9097d2efd6b6 /lib/base/object.h | |
| parent | 7aa8a533ef0657eaa8e786384b3a3821a04c179f (diff) | |
| download | enigma2-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.h | 99 |
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 |
