1 #ifndef __base_object_h
2 #define __base_object_h
6 // #define OBJECT_DEBUG
8 #include <lib/base/smartptr.h>
10 #include <lib/base/eerror.h>
12 #include <lib/base/elock.h>
19 /* we don't allow the default operator here, as it would break the refcount. */
20 void operator=(const iObject &);
22 virtual ~iObject() { }
24 virtual void AddRef()=0;
25 virtual void Release()=0;
31 oRefCount(): count(0) { }
32 operator volatile int&() { return count; }
35 if (count) eDebug("OBJECT_DEBUG FATAL: %p has %d references!", this, ref); else eDebug("OBJECT_DEBUG refcount ok! (%p)", this);
42 #define DECLARE_REF(x) \
43 private: oRefCount ref; \
44 public: void AddRef(); \
46 #define DEFINE_REF(c) \
50 __asm__ __volatile__( \
52 "1: ll %0, %1 # load counter \n" \
54 " addu %0, 1 # increment \n" \
56 " sc %0, %1 # try to store, checking for atomicity \n" \
58 " beqz %0, 1b # if not atomic (0), try again \n" \
59 : "=&r" (temp), "=m" (ref.count) \
66 __asm__ __volatile__( \
70 " subu %0, 1 # decrement \n" \
75 : "=&r" (temp), "=m" (ref.count) \
81 #elif defined(__ppc__)
82 #define DECLARE_REF(x) \
83 private: oRefCount ref; \
84 public: void AddRef(); \
86 #define DEFINE_REF(c) \
90 __asm__ __volatile__( \
91 "1: lwarx %0, 0, %3 \n" \
92 " add %0, %2, %0 \n" \
93 " dcbt 0, %3 # workaround for PPC405CR Errata\n" \
94 " stwcx. %0, 0, %3 \n" \
96 : "=&r" (temp), "=m" (ref.count) \
97 : "r" (1), "r" (&ref.count), "m" (ref.count) \
103 __asm__ __volatile__( \
104 "1: lwarx %0, 0, %3 \n" \
105 " subf %0, %2, %0 \n" \
106 " dcbt 0, %3 # workaround for PPC405CR Errata\n" \
107 " stwcx. %0, 0, %3 \n" \
109 : "=&r" (temp), "=m" (ref.count) \
110 : "r" (1), "r" (&ref.count), "m" (ref.count) \
116 #define DECLARE_REF(x) \
117 private:oRefCount ref; \
118 eSingleLock ref_lock; \
119 public: void AddRef(); \
122 extern int object_total_remaining;
123 #define DEFINE_REF(c) \
126 eSingleLocker l(ref_lock); \
127 ++object_total_remaining; \
129 eDebug("OBJECT_DEBUG " #c "+%p now %d", this, ref.count); \
134 eSingleLocker l(ref_lock); \
135 --object_total_remaining; \
137 eDebug("OBJECT_DEBUG " #c "-%p now %d", this, ref); \
142 #error fix locking for debug
144 #define DEFINE_REF(c) \
147 eSingleLocker l(ref_lock); \
153 eSingleLocker l(ref_lock); \
162 #define DECLARE_REF(x) \