From f331a60b2a7ad79c2ecb0ba638f66bae1f37eb6c Mon Sep 17 00:00:00 2001 From: Carl Shapiro Date: Thu, 4 Nov 2010 15:12:09 -0700 Subject: [PATCH] Parameterize instance counting to include subclasses. Change-Id: Idf54343a6a587e512833bbacbd0f7290adf8517e --- vm/alloc/Alloc.c | 27 ++++++++++++++++++++++++--- vm/alloc/Alloc.h | 7 ++++++- vm/native/dalvik_system_VMDebug.c | 7 ++++++- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/vm/alloc/Alloc.c b/vm/alloc/Alloc.c index 943f11560..25be30579 100644 --- a/vm/alloc/Alloc.c +++ b/vm/alloc/Alloc.c @@ -308,11 +308,11 @@ void dvmCollectGarbage(bool collectSoftReferences) typedef struct { const ClassObject *clazz; size_t count; -} CountInstancesOfClassContext; +} CountContext; static void countInstancesOfClassCallback(void *ptr, void *arg) { - CountInstancesOfClassContext *ctx = arg; + CountContext *ctx = arg; const Object *obj = ptr; assert(ctx != NULL); @@ -323,10 +323,31 @@ static void countInstancesOfClassCallback(void *ptr, void *arg) size_t dvmCountInstancesOfClass(const ClassObject *clazz) { - CountInstancesOfClassContext ctx = { clazz, 0 }; + CountContext ctx = { clazz, 0 }; HeapBitmap *bitmap = dvmHeapSourceGetLiveBits(); dvmLockHeap(); dvmHeapBitmapWalk(bitmap, countInstancesOfClassCallback, &ctx); dvmUnlockHeap(); return ctx.count; } + +static void countAssignableInstancesOfClassCallback(void *ptr, void *arg) +{ + CountContext *ctx = arg; + const Object *obj = ptr; + + assert(ctx != NULL); + if (dvmInstanceof(obj->clazz, ctx->clazz)) { + ctx->count += 1; + } +} + +size_t dvmCountAssignableInstancesOfClass(const ClassObject *clazz) +{ + CountContext ctx = { clazz, 0 }; + HeapBitmap *bitmap = dvmHeapSourceGetLiveBits(); + dvmLockHeap(); + dvmHeapBitmapWalk(bitmap, countAssignableInstancesOfClassCallback, &ctx); + dvmUnlockHeap(); + return ctx.count; +} diff --git a/vm/alloc/Alloc.h b/vm/alloc/Alloc.h index aeed9c31d..fd9c6339f 100644 --- a/vm/alloc/Alloc.h +++ b/vm/alloc/Alloc.h @@ -180,8 +180,13 @@ void dvmTrackExternalFree(size_t n); size_t dvmGetExternalBytesAllocated(void); /* - * Returns a count of the extant instances of a class. + * Returns a count of the direct instances of a class. */ size_t dvmCountInstancesOfClass(const ClassObject *clazz); +/* + * Returns a count of the instances of a class and its subclasses. + */ +size_t dvmCountAssignableInstancesOfClass(const ClassObject *clazz); + #endif /*_DALVIK_ALLOC_ALLOC*/ diff --git a/vm/native/dalvik_system_VMDebug.c b/vm/native/dalvik_system_VMDebug.c index 7712a98a8..4ad83b409 100644 --- a/vm/native/dalvik_system_VMDebug.c +++ b/vm/native/dalvik_system_VMDebug.c @@ -850,8 +850,13 @@ static void Dalvik_dalvik_system_VMDebug_countInstancesOfClass(const u4* args, JValue* pResult) { ClassObject* clazz = (ClassObject*)args[0]; + bool countAssignable = args[1]; if (clazz == NULL) { RETURN_LONG(0); + } + if (countAssignable) { + size_t count = dvmCountAssignableInstancesOfClass(clazz); + RETURN_LONG((long long)count); } else { size_t count = dvmCountInstancesOfClass(clazz); RETURN_LONG((long long)count); @@ -915,7 +920,7 @@ const DalvikNativeMethod dvm_dalvik_system_VMDebug[] = { Dalvik_dalvik_system_VMDebug_crash }, { "infopoint", "(I)V", Dalvik_dalvik_system_VMDebug_infopoint }, - { "countInstancesOfClass", "(Ljava/lang/Class;)J", + { "countInstancesOfClass", "(Ljava/lang/Class;Z)J", Dalvik_dalvik_system_VMDebug_countInstancesOfClass }, { NULL, NULL, NULL }, }; -- 2.11.0