diff options
author | Mathias Agopian <mathias@google.com> | 2011-02-25 16:11:44 -0800 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2011-02-25 16:20:52 -0800 |
commit | 32bebb0a58dd9c699aed8045ca2e752f681e5a0f (patch) | |
tree | 9d22fe196138cf4fea219d84c12772df9cd9c05a /libs | |
parent | c614e553cc4b93443c30d1ec728997c293ba024d (diff) | |
download | frameworks_native-32bebb0a58dd9c699aed8045ca2e752f681e5a0f.zip frameworks_native-32bebb0a58dd9c699aed8045ca2e752f681e5a0f.tar.gz frameworks_native-32bebb0a58dd9c699aed8045ca2e752f681e5a0f.tar.bz2 |
Fix sp<> conversion operator / constructor
some of the conversion operators were not using the proper
pointer type when calling incStrong/decStrong, usually it
has no bad consequences, but for some implementation
of the ref-counted object it could lead to recording the wrong
owner id.
Change-Id: If574b9069b8a4cf6e0911a992c8f095aba799995
Diffstat (limited to 'libs')
-rw-r--r-- | libs/utils/RefBase.cpp | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp index 0fd404d..bb6c125 100644 --- a/libs/utils/RefBase.cpp +++ b/libs/utils/RefBase.cpp @@ -99,20 +99,38 @@ public: #if DEBUG_REFS_FATAL_SANITY_CHECKS LOG_ALWAYS_FATAL("Strong references remain!"); #else - LOGE("Strong references remain!"); + LOGE("Strong references remain:"); #endif + ref_entry* refs = mStrongRefs; + while (refs) { + char inc = refs->ref >= 0 ? '+' : '-'; + LOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref); +#if DEBUG_REFS_CALLSTACK_ENABLED + refs->stack.dump(); +#endif; + refs = refs->next; + } } if (!mRetain && mWeakRefs != NULL) { dumpStack = true; #if DEBUG_REFS_FATAL_SANITY_CHECKS - LOG_ALWAYS_FATAL("Weak references remain!"); + LOG_ALWAYS_FATAL("Weak references remain:"); #else LOGE("Weak references remain!"); #endif + ref_entry* refs = mWeakRefs; + while (refs) { + char inc = refs->ref >= 0 ? '+' : '-'; + LOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref); +#if DEBUG_REFS_CALLSTACK_ENABLED + refs->stack.dump(); +#endif; + refs = refs->next; + } } - if (dumpStack) { + LOGE("above errors at:"); CallStack stack; stack.update(); stack.dump(); @@ -228,7 +246,8 @@ private: if (mTrackEnabled) { AutoMutex _l(mMutex); - ref_entry* ref = *refs; + ref_entry* const head = *refs; + ref_entry* ref = head; while (ref != NULL) { if (ref->id == id) { *refs = ref->next; @@ -249,6 +268,13 @@ private: "(weakref_type %p) that doesn't exist!", id, mBase, this); + ref = head; + while (ref) { + char inc = ref->ref >= 0 ? '+' : '-'; + LOGD("\t%c ID %p (ref %d):", inc, ref->id, ref->ref); + ref = ref->next; + } + CallStack stack; stack.update(); stack.dump(); |