summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2013-06-12 16:23:00 -0700
committerChris Craik <ccraik@google.com>2013-06-12 16:26:34 -0700
commit9846de68f1b4f2720da421e5242017c28cfc93ed (patch)
treee2321a0dc6a3e5b4f5024d470755fda3e3df0d54 /libs
parent97f41383eb2bb098767ca153e470009fea810540 (diff)
downloadframeworks_base-9846de68f1b4f2720da421e5242017c28cfc93ed.zip
frameworks_base-9846de68f1b4f2720da421e5242017c28cfc93ed.tar.gz
frameworks_base-9846de68f1b4f2720da421e5242017c28cfc93ed.tar.bz2
Remove crash workarounds, add logging
bug:9321162 Change-Id: I748c27f979af1a303be01db29aedcbad6d608c38
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/DisplayList.cpp14
-rw-r--r--libs/hwui/DisplayList.h9
2 files changed, 16 insertions, 7 deletions
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index b2d9915..f25ec2d 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -44,13 +44,14 @@ void DisplayList::outputLogBuffer(int fd) {
}
DisplayList::DisplayList(const DisplayListRenderer& recorder) :
- mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL),
+ mDestroyed(false), mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL),
mStaticMatrix(NULL), mAnimationMatrix(NULL) {
initFromDisplayListRenderer(recorder);
}
DisplayList::~DisplayList() {
+ mDestroyed = true;
clearResources();
}
@@ -63,7 +64,6 @@ void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
void DisplayList::clearResources() {
mDisplayListData = NULL;
- mSize = 0; // TODO: shouldn't be needed, WAR possible use after delete
mClipRectOp = NULL;
mSaveLayerOp = NULL;
@@ -169,6 +169,10 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
mSaveLayerOp = new (alloc) SaveLayerOp();
mSaveOp = new (alloc) SaveOp();
mRestoreToCountOp = new (alloc) RestoreToCountOp();
+ if (CC_UNLIKELY(!mSaveOp)) { // temporary debug logging
+ ALOGW("Error: %s's SaveOp not allocated, size %d", getName(), mSize);
+ CRASH();
+ }
mFunctorCount = recorder.getFunctorCount();
@@ -480,7 +484,11 @@ void DisplayList::replay(ReplayStateStruct& replayStruct, const int level) {
*/
template <class T>
void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level) {
- if (mSize == 0 || mAlpha <= 0 || CC_UNLIKELY(!mSaveOp)) { // TODO: shouldn't need mSaveOp check
+ if (CC_UNLIKELY(mDestroyed)) { // temporary debug logging
+ ALOGW("Error: %s is drawing after destruction, size %d", getName(), mSize);
+ CRASH();
+ }
+ if (mSize == 0 || mAlpha <= 0) {
DISPLAY_LIST_LOGD("%*sEmpty display list (%p, %s)", level * 2, "", this, mName.string());
return;
}
diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h
index 97c34dc..1417df7 100644
--- a/libs/hwui/DisplayList.h
+++ b/libs/hwui/DisplayList.h
@@ -501,6 +501,7 @@ private:
uint32_t mFunctorCount;
String8 mName;
+ bool mDestroyed; // used for debugging crash, TODO: remove once invalid state crash fixed
// View properties
bool mClipToBounds;
@@ -530,11 +531,11 @@ private:
* an alpha causes a SaveLayerAlpha to occur). These operations point into mDisplayListData's
* allocation, or null if uninitialized.
*
- * These are initialized (via friend constructors) when a displayList is issued in either replay
- * or deferred mode. If replaying, the ops are not used until the next frame. If deferring, the
- * ops may be stored in the DeferredDisplayList to be played back a second time.
+ * These are initialized (via friend re-constructors) when a displayList is issued in either
+ * replay or deferred mode. If replaying, the ops are not used until the next frame. If
+ * deferring, the ops may be stored in the DeferredDisplayList to be played back a second time.
*
- * They should be used at most once per frame (one call to iterate)
+ * They should be used at most once per frame (one call to 'iterate') to avoid overwriting data
*/
ClipRectOp* mClipRectOp;
SaveLayerOp* mSaveLayerOp;