1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * org.apache.harmony.dalvik.ddmc.DdmVmInternal 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h" 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static void threadNotify(boolean enable) 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enable DDM thread notifications. 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_threadNotify( 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool enable = (args[0] != 0); 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 344308417beec548c2b2c06ecec4f7f4a965b09fb2Steve Block //ALOGI("ddmThreadNotification: %d", enable); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmDdmSetThreadNotification(enable); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static byte[] getThreadStats() 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get a buffer full of thread info. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getThreadStats( 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNUSED_PARAMETER(args); 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* result = dvmDdmGenerateThreadStats(); 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) result, NULL); 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(result); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static int heapInfoNotify(int what) 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enable DDM heap notifications. 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapInfoNotify( 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int when = args[0]; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool ret; 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ret = dvmDdmHandleHpifChunk(when); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_BOOLEAN(ret); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static boolean heapSegmentNotify(int when, int what, bool native) 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enable DDM heap notifications. 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapSegmentNotify( 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int when = args[0]; // 0=never (off), 1=during GC 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int what = args[1]; // 0=merged objects, 1=distinct objects 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool native = (args[2] != 0); // false=virtual heap, true=native heap 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool ret; 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ret = dvmDdmHandleHpsgNhsgChunk(when, what, native); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_BOOLEAN(ret); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static StackTraceElement[] getStackTraceById(int threadId) 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get a stack trace as an array of StackTraceElement objects. Returns 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NULL on failure, e.g. if the threadId couldn't be found. 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getStackTraceById( 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 threadId = args[0]; 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* trace; 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trace = dvmDdmGetStackTraceById(threadId); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(trace); 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static void enableRecentAllocations(boolean enable) 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Enable or disable recent allocation tracking. 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_enableRecentAllocations( 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool enable = (args[0] != 0); 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enable) 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (void) dvmEnableAllocTracker(); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (void) dvmDisableAllocTracker(); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static boolean getRecentAllocationStatus() 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns "true" if allocation tracking is enabled. 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocationStatus( 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNUSED_PARAMETER(args); 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_BOOLEAN(gDvm.allocRecords != NULL); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public static byte[] getRecentAllocations() 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fill a buffer with data on recent heap allocations. 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocations( 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* data; 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project data = dvmDdmGetRecentAllocations(); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) data, NULL); 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(data); 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_org_apache_harmony_dalvik_ddmc_DdmVmInternal[] = { 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "threadNotify", "(Z)V", 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_threadNotify }, 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getThreadStats", "()[B", 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getThreadStats }, 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "heapInfoNotify", "(I)Z", 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapInfoNotify }, 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "heapSegmentNotify", "(IIZ)Z", 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapSegmentNotify }, 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getStackTraceById", "(I)[Ljava/lang/StackTraceElement;", 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getStackTraceById }, 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "enableRecentAllocations", "(Z)V", 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_enableRecentAllocations }, 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getRecentAllocationStatus", "()Z", 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocationStatus }, 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getRecentAllocations", "()[B", 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocations }, 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { NULL, NULL, NULL }, 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 170