00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkRefCnt_DEFINED
00018 #define SkRefCnt_DEFINED
00019
00020 #include "SkThread.h"
00021
00032 class SkRefCnt : SkNoncopyable {
00033 public:
00036 SkRefCnt() : fRefCnt(1) {}
00037
00040 virtual ~SkRefCnt() { SkASSERT(fRefCnt == 1); }
00041
00044 int32_t getRefCnt() const { return fRefCnt; }
00045
00048 void ref() const {
00049 SkASSERT(fRefCnt > 0);
00050 sk_atomic_inc(&fRefCnt);
00051 }
00052
00058 void unref() const {
00059 SkASSERT(fRefCnt > 0);
00060 if (sk_atomic_dec(&fRefCnt) == 1) {
00061 fRefCnt = 1;
00062 SkDELETE(this);
00063 }
00064 }
00065
00069 void safeRef() const {
00070 if (this) {
00071 this->ref();
00072 }
00073 }
00074
00078 void safeUnref() const {
00079 if (this) {
00080 this->unref();
00081 }
00082 }
00083
00084 private:
00085 mutable int32_t fRefCnt;
00086 };
00087
00094 class SkAutoUnref : SkNoncopyable {
00095 public:
00096 SkAutoUnref(SkRefCnt* obj) : fObj(obj) {}
00097 ~SkAutoUnref();
00098
00099 SkRefCnt* get() const { return fObj; }
00100
00104 bool ref();
00105
00109 bool unref();
00110
00114 SkRefCnt* detach();
00115
00116 private:
00117 SkRefCnt* fObj;
00118 };
00119
00121
00126 #define SkRefCnt_SafeAssign(dst, src) \
00127 do { \
00128 if (src) src->ref(); \
00129 if (dst) dst->unref(); \
00130 dst = src; \
00131 } while (0)
00132
00133
00136 template <typename T> static inline void SkSafeRef(T* obj) {
00137 if (obj) {
00138 obj->ref();
00139 }
00140 }
00141
00144 template <typename T> static inline void SkSafeUnref(T* obj) {
00145 if (obj) {
00146 obj->unref();
00147 }
00148 }
00149
00150 #endif
00151