X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/4b6f19109cd4bbab23af49e953537d1919348a0a..c606126c3efaec7e3fdf1283fc37dfb7140bee13:/lib/base/object.h diff --git a/lib/base/object.h b/lib/base/object.h index 38a6dd35..93989a67 100644 --- a/lib/base/object.h +++ b/lib/base/object.h @@ -25,20 +25,19 @@ public: virtual void Release()=0; }; -class oRefCount +#ifndef SWIG +struct oRefCount { - int ref; -public: - oRefCount(): ref(0) { } - operator int&() { return ref; } + volatile int count; + oRefCount(): count(0) { } + operator volatile int&() { return count; } ~oRefCount() { #ifdef OBJECT_DEBUG - if (ref) eDebug("OBJECT_DEBUG FATAL: %p has %d references!", this, ref); else eDebug("OBJECT_DEBUG refcount ok! (%p)", this); + if (count) eDebug("OBJECT_DEBUG FATAL: %p has %d references!", this, ref); else eDebug("OBJECT_DEBUG refcount ok! (%p)", this); #endif } }; -#ifndef SWIG #if defined(__mips__) #define DECLARE_REF(x) \ private: oRefCount ref; \ @@ -49,33 +48,33 @@ public: { \ 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"); \ + " .set mips3 \n" \ + "1: ll %0, %1 # load counter \n" \ + " .set mips0 \n" \ + " addu %0, 1 # increment \n" \ + " .set mips3 \n" \ + " sc %0, %1 # try to store, checking for atomicity \n" \ + " .set mips0 \n" \ + " beqz %0, 1b # if not atomic (0), try again \n" \ + : "=&r" (temp), "=m" (ref.count) \ + : "m" (ref.count) \ + : ); \ } \ 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"); \ + " .set mips3 \n" \ + "1: ll %0, %1 \n" \ + " .set mips0 \n" \ + " subu %0, 1 # decrement \n" \ + " .set mips3 \n" \ + " sc %0, %1 \n" \ + " .set mips0 \n" \ + " beqz %0, 1b \n" \ + : "=&r" (temp), "=m" (ref.count) \ + : "m" (ref.count) \ + : ); \ if (!ref) \ delete this; \ } @@ -91,11 +90,11 @@ public: __asm__ __volatile__( \ "1: lwarx %0, 0, %3 \n" \ " add %0, %2, %0 \n" \ - " dcbt 0, %3 \n" \ + " dcbt 0, %3 # workaround for PPC405CR Errata\n" \ " stwcx. %0, 0, %3 \n" \ " bne- 1b \n" \ - : "=&r" (temp), "=m" ((int)ref) \ - : "r" (1), "r" (&((int)ref)), "m" ((int)ref) \ + : "=&r" (temp), "=m" (ref.count) \ + : "r" (1), "r" (&ref.count), "m" (ref.count) \ : "cc"); \ } \ void c::Release() \ @@ -104,11 +103,11 @@ public: __asm__ __volatile__( \ "1: lwarx %0, 0, %3 \n" \ " subf %0, %2, %0 \n" \ - " dcbt 0, %3 \n" \ + " dcbt 0, %3 # workaround for PPC405CR Errata\n" \ " stwcx. %0, 0, %3 \n" \ " bne- 1b \n" \ - : "=&r" (temp), "=m" ((int)ref) \ - : "r" (1), "r" (&((int)ref)), "m" ((int)ref) \ + : "=&r" (temp), "=m" (ref.count) \ + : "r" (1), "r" (&ref.count), "m" (ref.count) \ : "cc"); \ if (!ref) \ delete this; \ @@ -127,7 +126,7 @@ public: eSingleLocker l(ref_lock); \ ++object_total_remaining; \ ++ref; \ - eDebug("OBJECT_DEBUG " #c "+%p now %d", this, (int)ref); \ + eDebug("OBJECT_DEBUG " #c "+%p now %d", this, ref.count); \ } \ void c::Release() \ { \ @@ -159,17 +158,14 @@ public: } #endif #endif -#else +#else // SWIG #define DECLARE_REF(x) \ private: \ void AddRef(); \ void Release(); -#endif - -#ifdef SWIG -class Object -{ -}; -#endif + class Object + { + }; +#endif // SWIG #endif