/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* org.apache.harmony.dalvik.ddmc.DdmVmInternal
*/
#include "Dalvik.h"
#include "native/InternalNativePriv.h"
/*
* public static void threadNotify(boolean enable)
*
* Enable DDM thread notifications.
*/
static void Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_threadNotify(
const u4* args, JValue* pResult)
{
bool enable = (args[0] != 0);
//LOGI("ddmThreadNotification: %d\n", enable);
dvmDdmSetThreadNotification(enable);
RETURN_VOID();
}
/*
* public static byte[] getThreadStats()
*
* Get a buffer full of thread info.
*/
static void Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getThreadStats(
const u4* args, JValue* pResult)
{
UNUSED_PARAMETER(args);
ArrayObject* result = dvmDdmGenerateThreadStats();
dvmReleaseTrackedAlloc((Object*) result, NULL);
RETURN_PTR(result);
}
/*
* public static int heapInfoNotify(int what)
*
* Enable DDM heap notifications.
*/
static void Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapInfoNotify(
const u4* args, JValue* pResult)
{
int when = args[0];
bool ret;
ret = dvmDdmHandleHpifChunk(when);
RETURN_BOOLEAN(ret);
}
/*
* public static boolean heapSegmentNotify(int when, int what, bool native)
*
* Enable DDM heap notifications.
*/
static void
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapSegmentNotify(
const u4* args, JValue* pResult)
{
int when = args[0]; // 0=never (off), 1=during GC
int what = args[1]; // 0=merged objects, 1=distinct objects
bool native = (args[2] != 0); // false=virtual heap, true=native heap
bool ret;
ret = dvmDdmHandleHpsgNhsgChunk(when, what, native);
RETURN_BOOLEAN(ret);
}
/*
* public static StackTraceElement[] getStackTraceById(int threadId)
*
* Get a stack trace as an array of StackTraceElement objects. Returns
* NULL on failure, e.g. if the threadId couldn't be found.
*/
static void
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getStackTraceById(
const u4* args, JValue* pResult)
{
u4 threadId = args[0];
ArrayObject* trace;
trace = dvmDdmGetStackTraceById(threadId);
RETURN_PTR(trace);
}
/*
* public static void enableRecentAllocations(boolean enable)
*
* Enable or disable recent allocation tracking.
*/
static void
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_enableRecentAllocations(
const u4* args, JValue* pResult)
{
bool enable = (args[0] != 0);
if (enable)
(void) dvmEnableAllocTracker();
else
(void) dvmDisableAllocTracker();
RETURN_VOID();
}
/*
* public static boolean getRecentAllocationStatus()
*
* Returns "true" if allocation tracking is enabled.
*/
static void
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocationStatus(
const u4* args, JValue* pResult)
{
UNUSED_PARAMETER(args);
RETURN_BOOLEAN(gDvm.allocRecords != NULL);
}
/*
* public static byte[] getRecentAllocations()
*
* Fill a buffer with data on recent heap allocations.
*/
static void
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocations(
const u4* args, JValue* pResult)
{
ArrayObject* data;
data = dvmDdmGetRecentAllocations();
dvmReleaseTrackedAlloc((Object*) data, NULL);
RETURN_PTR(data);
}
const DalvikNativeMethod dvm_org_apache_harmony_dalvik_ddmc_DdmVmInternal[] = {
{ "threadNotify", "(Z)V",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_threadNotify },
{ "getThreadStats", "()[B",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getThreadStats },
{ "heapInfoNotify", "(I)Z",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapInfoNotify },
{ "heapSegmentNotify", "(IIZ)Z",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_heapSegmentNotify },
{ "getStackTraceById", "(I)[Ljava/lang/StackTraceElement;",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getStackTraceById },
{ "enableRecentAllocations", "(Z)V",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_enableRecentAllocations },
{ "getRecentAllocationStatus", "()Z",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocationStatus },
{ "getRecentAllocations", "()[B",
Dalvik_org_apache_harmony_dalvik_ddmc_DdmVmInternal_getRecentAllocations },
{ NULL, NULL, NULL },
};