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