Fix issue #2048263: More debugging information
We now hopefully do better about generating the anr reports, and include information about the malloc loaded assets in meminfo.
This commit is contained in:
parent
9bafd12fa1
commit
0042a806ce
2 changed files with 65 additions and 5 deletions
|
@ -45,6 +45,7 @@ public:
|
|||
virtual ~Asset(void);
|
||||
|
||||
static int32_t getGlobalCount();
|
||||
static String8 getAssetAllocations();
|
||||
|
||||
/* used when opening an asset */
|
||||
typedef enum AccessMode {
|
||||
|
@ -109,6 +110,12 @@ public:
|
|||
*/
|
||||
virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const = 0;
|
||||
|
||||
/*
|
||||
* Return whether this asset's buffer is allocated in RAM (not mmapped).
|
||||
* Note: not virtual so it is safe to call even when being destroyed.
|
||||
*/
|
||||
virtual bool isAllocated(void) const { return false; }
|
||||
|
||||
/*
|
||||
* Get a string identifying the asset's source. This might be a full
|
||||
* path, it might be a colon-separated list of identifiers.
|
||||
|
@ -197,6 +204,9 @@ private:
|
|||
|
||||
AccessMode mAccessMode; // how the asset was opened
|
||||
String8 mAssetSource; // debug string
|
||||
|
||||
Asset* mNext; // linked list.
|
||||
Asset* mPrev;
|
||||
};
|
||||
|
||||
|
||||
|
@ -239,6 +249,7 @@ public:
|
|||
virtual off_t getLength(void) const { return mLength; }
|
||||
virtual off_t getRemainingLength(void) const { return mLength-mOffset; }
|
||||
virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const;
|
||||
virtual bool isAllocated(void) const { return mBuf != NULL; }
|
||||
|
||||
private:
|
||||
off_t mStart; // absolute file offset of start of chunk
|
||||
|
@ -295,6 +306,7 @@ public:
|
|||
virtual off_t getLength(void) const { return mUncompressedLen; }
|
||||
virtual off_t getRemainingLength(void) const { return mUncompressedLen-mOffset; }
|
||||
virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const { return -1; }
|
||||
virtual bool isAllocated(void) const { return mBuf != NULL; }
|
||||
|
||||
private:
|
||||
off_t mStart; // offset to start of compressed data
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <utils/ZipUtils.h>
|
||||
#include <utils/ZipFileRO.h>
|
||||
#include <utils/Log.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <memory.h>
|
||||
|
@ -40,24 +41,71 @@ using namespace android;
|
|||
# define O_BINARY 0
|
||||
#endif
|
||||
|
||||
static volatile int32_t gCount = 0;
|
||||
static Mutex gAssetLock;
|
||||
static int32_t gCount = 0;
|
||||
static Asset* gHead = NULL;
|
||||
static Asset* gTail = NULL;
|
||||
|
||||
int32_t Asset::getGlobalCount()
|
||||
{
|
||||
AutoMutex _l(gAssetLock);
|
||||
return gCount;
|
||||
}
|
||||
|
||||
String8 Asset::getAssetAllocations()
|
||||
{
|
||||
AutoMutex _l(gAssetLock);
|
||||
String8 res;
|
||||
Asset* cur = gHead;
|
||||
while (cur != NULL) {
|
||||
if (cur->isAllocated()) {
|
||||
res.append(" ");
|
||||
res.append(cur->getAssetSource());
|
||||
off_t size = (cur->getLength()+512)/1024;
|
||||
char buf[64];
|
||||
sprintf(buf, ": %dK\n", (int)size);
|
||||
res.append(buf);
|
||||
}
|
||||
cur = cur->mNext;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
Asset::Asset(void)
|
||||
: mAccessMode(ACCESS_UNKNOWN)
|
||||
{
|
||||
int count = android_atomic_inc(&gCount)+1;
|
||||
//LOGI("Creating Asset %p #%d\n", this, count);
|
||||
AutoMutex _l(gAssetLock);
|
||||
gCount++;
|
||||
mNext = mPrev = NULL;
|
||||
if (gTail == NULL) {
|
||||
gHead = gTail = this;
|
||||
} else {
|
||||
mPrev = gTail;
|
||||
gTail->mNext = this;
|
||||
gTail = this;
|
||||
}
|
||||
//LOGI("Creating Asset %p #%d\n", this, gCount);
|
||||
}
|
||||
|
||||
Asset::~Asset(void)
|
||||
{
|
||||
int count = android_atomic_dec(&gCount);
|
||||
//LOGI("Destroying Asset in %p #%d\n", this, count);
|
||||
AutoMutex _l(gAssetLock);
|
||||
gCount--;
|
||||
if (gHead == this) {
|
||||
gHead = mNext;
|
||||
}
|
||||
if (gTail == this) {
|
||||
gTail = mPrev;
|
||||
}
|
||||
if (mNext != NULL) {
|
||||
mNext->mPrev = mPrev;
|
||||
}
|
||||
if (mPrev != NULL) {
|
||||
mPrev->mNext = mNext;
|
||||
}
|
||||
mNext = mPrev = NULL;
|
||||
//LOGI("Destroying Asset in %p #%d\n", this, gCount);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue