X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/4bc08995411e21f3564f09e136809be68ddf96a8..5b5c4c643d1c2cb1a3949bca4a36d4abcae170cd:/lib/base/object.h diff --git a/lib/base/object.h b/lib/base/object.h index 64d9a88f..f93f4257 100644 --- a/lib/base/object.h +++ b/lib/base/object.h @@ -9,6 +9,7 @@ #ifdef OBJECT_DEBUG #include #endif +#include typedef int RESULT; @@ -37,12 +38,104 @@ public: } }; -#define DECLARE_REF private: oRefCount ref; public: void AddRef(); void Release(); -#ifdef OBJECT_DEBUG -extern int object_total_remaining; -#define DEFINE_REF(c) void c::AddRef() { ++object_total_remaining; ++ref; eDebug("OBJECT_DEBUG " #c "+%p now %d", this, (int)ref); } void c::Release() { --object_total_remaining; eDebug("OBJECT_DEBUG " #c "-%p now %d", this, ref-1); if (!--ref) delete this; } +#ifndef SWIG + #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 DEFINE_REF(c) void c::AddRef() { ++ref; } void c::Release() { if (!--ref) delete this; } + #define DECLARE_REF(x) \ + private: \ + void AddRef(); \ + void Release(); +#endif + +#ifdef SWIG +class Object +{ +}; #endif #endif