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:
Dianne Hackborn 2009-08-11 18:56:41 -07:00
parent 7e78445103
commit e868513287
2 changed files with 65 additions and 5 deletions

View File

@ -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

View File

@ -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);
}
/*