Merge "Revert "Revert "Track ashmem memory usage in Parcel""" into mnc-dr-dev
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package android.os;
|
package android.os;
|
||||||
|
|
||||||
|
import android.annotation.IntegerRes;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -42,6 +43,8 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import dalvik.system.VMRuntime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Container for a message (data and object references) that can
|
* Container for a message (data and object references) that can
|
||||||
* be sent through an IBinder. A Parcel can contain both flattened data
|
* be sent through an IBinder. A Parcel can contain both flattened data
|
||||||
@@ -193,6 +196,7 @@ public final class Parcel {
|
|||||||
* indicating that we're responsible for its lifecycle.
|
* indicating that we're responsible for its lifecycle.
|
||||||
*/
|
*/
|
||||||
private boolean mOwnsNativeParcelObject;
|
private boolean mOwnsNativeParcelObject;
|
||||||
|
private long mNativeSize;
|
||||||
|
|
||||||
private RuntimeException mStack;
|
private RuntimeException mStack;
|
||||||
|
|
||||||
@@ -244,7 +248,7 @@ public final class Parcel {
|
|||||||
private static native int nativeDataAvail(long nativePtr);
|
private static native int nativeDataAvail(long nativePtr);
|
||||||
private static native int nativeDataPosition(long nativePtr);
|
private static native int nativeDataPosition(long nativePtr);
|
||||||
private static native int nativeDataCapacity(long nativePtr);
|
private static native int nativeDataCapacity(long nativePtr);
|
||||||
private static native void nativeSetDataSize(long nativePtr, int size);
|
private static native long nativeSetDataSize(long nativePtr, int size);
|
||||||
private static native void nativeSetDataPosition(long nativePtr, int pos);
|
private static native void nativeSetDataPosition(long nativePtr, int pos);
|
||||||
private static native void nativeSetDataCapacity(long nativePtr, int size);
|
private static native void nativeSetDataCapacity(long nativePtr, int size);
|
||||||
|
|
||||||
@@ -259,7 +263,7 @@ public final class Parcel {
|
|||||||
private static native void nativeWriteDouble(long nativePtr, double val);
|
private static native void nativeWriteDouble(long nativePtr, double val);
|
||||||
private static native void nativeWriteString(long nativePtr, String val);
|
private static native void nativeWriteString(long nativePtr, String val);
|
||||||
private static native void nativeWriteStrongBinder(long nativePtr, IBinder val);
|
private static native void nativeWriteStrongBinder(long nativePtr, IBinder val);
|
||||||
private static native void nativeWriteFileDescriptor(long nativePtr, FileDescriptor val);
|
private static native long nativeWriteFileDescriptor(long nativePtr, FileDescriptor val);
|
||||||
|
|
||||||
private static native byte[] nativeCreateByteArray(long nativePtr);
|
private static native byte[] nativeCreateByteArray(long nativePtr);
|
||||||
private static native byte[] nativeReadBlob(long nativePtr);
|
private static native byte[] nativeReadBlob(long nativePtr);
|
||||||
@@ -272,13 +276,13 @@ public final class Parcel {
|
|||||||
private static native FileDescriptor nativeReadFileDescriptor(long nativePtr);
|
private static native FileDescriptor nativeReadFileDescriptor(long nativePtr);
|
||||||
|
|
||||||
private static native long nativeCreate();
|
private static native long nativeCreate();
|
||||||
private static native void nativeFreeBuffer(long nativePtr);
|
private static native long nativeFreeBuffer(long nativePtr);
|
||||||
private static native void nativeDestroy(long nativePtr);
|
private static native void nativeDestroy(long nativePtr);
|
||||||
|
|
||||||
private static native byte[] nativeMarshall(long nativePtr);
|
private static native byte[] nativeMarshall(long nativePtr);
|
||||||
private static native void nativeUnmarshall(
|
private static native long nativeUnmarshall(
|
||||||
long nativePtr, byte[] data, int offset, int length);
|
long nativePtr, byte[] data, int offset, int length);
|
||||||
private static native void nativeAppendFrom(
|
private static native long nativeAppendFrom(
|
||||||
long thisNativePtr, long otherNativePtr, int offset, int length);
|
long thisNativePtr, long otherNativePtr, int offset, int length);
|
||||||
private static native boolean nativeHasFileDescriptors(long nativePtr);
|
private static native boolean nativeHasFileDescriptors(long nativePtr);
|
||||||
private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName);
|
private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName);
|
||||||
@@ -390,7 +394,7 @@ public final class Parcel {
|
|||||||
* @param size The new number of bytes in the Parcel.
|
* @param size The new number of bytes in the Parcel.
|
||||||
*/
|
*/
|
||||||
public final void setDataSize(int size) {
|
public final void setDataSize(int size) {
|
||||||
nativeSetDataSize(mNativePtr, size);
|
updateNativeSize(nativeSetDataSize(mNativePtr, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -442,11 +446,11 @@ public final class Parcel {
|
|||||||
* Set the bytes in data to be the raw bytes of this Parcel.
|
* Set the bytes in data to be the raw bytes of this Parcel.
|
||||||
*/
|
*/
|
||||||
public final void unmarshall(byte[] data, int offset, int length) {
|
public final void unmarshall(byte[] data, int offset, int length) {
|
||||||
nativeUnmarshall(mNativePtr, data, offset, length);
|
updateNativeSize(nativeUnmarshall(mNativePtr, data, offset, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void appendFrom(Parcel parcel, int offset, int length) {
|
public final void appendFrom(Parcel parcel, int offset, int length) {
|
||||||
nativeAppendFrom(mNativePtr, parcel.mNativePtr, offset, length);
|
updateNativeSize(nativeAppendFrom(mNativePtr, parcel.mNativePtr, offset, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -599,7 +603,24 @@ public final class Parcel {
|
|||||||
* if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.</p>
|
* if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.</p>
|
||||||
*/
|
*/
|
||||||
public final void writeFileDescriptor(FileDescriptor val) {
|
public final void writeFileDescriptor(FileDescriptor val) {
|
||||||
nativeWriteFileDescriptor(mNativePtr, val);
|
updateNativeSize(nativeWriteFileDescriptor(mNativePtr, val));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateNativeSize(long newNativeSize) {
|
||||||
|
if (mOwnsNativeParcelObject) {
|
||||||
|
if (newNativeSize > Integer.MAX_VALUE) {
|
||||||
|
newNativeSize = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
if (newNativeSize != mNativeSize) {
|
||||||
|
int delta = (int) (newNativeSize - mNativeSize);
|
||||||
|
if (delta > 0) {
|
||||||
|
VMRuntime.getRuntime().registerNativeAllocation(delta);
|
||||||
|
} else {
|
||||||
|
VMRuntime.getRuntime().registerNativeFree(-delta);
|
||||||
|
}
|
||||||
|
mNativeSize = newNativeSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2545,7 +2566,7 @@ public final class Parcel {
|
|||||||
|
|
||||||
private void freeBuffer() {
|
private void freeBuffer() {
|
||||||
if (mOwnsNativeParcelObject) {
|
if (mOwnsNativeParcelObject) {
|
||||||
nativeFreeBuffer(mNativePtr);
|
updateNativeSize(nativeFreeBuffer(mNativePtr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2553,6 +2574,7 @@ public final class Parcel {
|
|||||||
if (mNativePtr != 0) {
|
if (mNativePtr != 0) {
|
||||||
if (mOwnsNativeParcelObject) {
|
if (mOwnsNativeParcelObject) {
|
||||||
nativeDestroy(mNativePtr);
|
nativeDestroy(mNativePtr);
|
||||||
|
updateNativeSize(0);
|
||||||
}
|
}
|
||||||
mNativePtr = 0;
|
mNativePtr = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ static jint android_os_Parcel_dataCapacity(JNIEnv* env, jclass clazz, jlong nati
|
|||||||
return parcel ? parcel->dataCapacity() : 0;
|
return parcel ? parcel->dataCapacity() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_setDataSize(JNIEnv* env, jclass clazz, jlong nativePtr, jint size)
|
static jlong android_os_Parcel_setDataSize(JNIEnv* env, jclass clazz, jlong nativePtr, jint size)
|
||||||
{
|
{
|
||||||
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
||||||
if (parcel != NULL) {
|
if (parcel != NULL) {
|
||||||
@@ -122,7 +122,9 @@ static void android_os_Parcel_setDataSize(JNIEnv* env, jclass clazz, jlong nativ
|
|||||||
if (err != NO_ERROR) {
|
if (err != NO_ERROR) {
|
||||||
signalExceptionForError(env, clazz, err);
|
signalExceptionForError(env, clazz, err);
|
||||||
}
|
}
|
||||||
|
return parcel->getOpenAshmemSize();
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_setDataPosition(JNIEnv* env, jclass clazz, jlong nativePtr, jint pos)
|
static void android_os_Parcel_setDataPosition(JNIEnv* env, jclass clazz, jlong nativePtr, jint pos)
|
||||||
@@ -304,7 +306,7 @@ static void android_os_Parcel_writeStrongBinder(JNIEnv* env, jclass clazz, jlong
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_writeFileDescriptor(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object)
|
static jlong android_os_Parcel_writeFileDescriptor(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object)
|
||||||
{
|
{
|
||||||
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
||||||
if (parcel != NULL) {
|
if (parcel != NULL) {
|
||||||
@@ -313,7 +315,9 @@ static void android_os_Parcel_writeFileDescriptor(JNIEnv* env, jclass clazz, jlo
|
|||||||
if (err != NO_ERROR) {
|
if (err != NO_ERROR) {
|
||||||
signalExceptionForError(env, clazz, err);
|
signalExceptionForError(env, clazz, err);
|
||||||
}
|
}
|
||||||
|
return parcel->getOpenAshmemSize();
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, jlong nativePtr)
|
static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, jlong nativePtr)
|
||||||
@@ -550,12 +554,14 @@ static jlong android_os_Parcel_create(JNIEnv* env, jclass clazz)
|
|||||||
return reinterpret_cast<jlong>(parcel);
|
return reinterpret_cast<jlong>(parcel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_freeBuffer(JNIEnv* env, jclass clazz, jlong nativePtr)
|
static jlong android_os_Parcel_freeBuffer(JNIEnv* env, jclass clazz, jlong nativePtr)
|
||||||
{
|
{
|
||||||
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
||||||
if (parcel != NULL) {
|
if (parcel != NULL) {
|
||||||
parcel->freeData();
|
parcel->freeData();
|
||||||
|
return parcel->getOpenAshmemSize();
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_destroy(JNIEnv* env, jclass clazz, jlong nativePtr)
|
static void android_os_Parcel_destroy(JNIEnv* env, jclass clazz, jlong nativePtr)
|
||||||
@@ -593,12 +599,12 @@ static jbyteArray android_os_Parcel_marshall(JNIEnv* env, jclass clazz, jlong na
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_unmarshall(JNIEnv* env, jclass clazz, jlong nativePtr,
|
static jlong android_os_Parcel_unmarshall(JNIEnv* env, jclass clazz, jlong nativePtr,
|
||||||
jbyteArray data, jint offset, jint length)
|
jbyteArray data, jint offset, jint length)
|
||||||
{
|
{
|
||||||
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
|
||||||
if (parcel == NULL || length < 0) {
|
if (parcel == NULL || length < 0) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(data, 0);
|
jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(data, 0);
|
||||||
@@ -612,24 +618,26 @@ static void android_os_Parcel_unmarshall(JNIEnv* env, jclass clazz, jlong native
|
|||||||
|
|
||||||
env->ReleasePrimitiveArrayCritical(data, array, 0);
|
env->ReleasePrimitiveArrayCritical(data, array, 0);
|
||||||
}
|
}
|
||||||
|
return parcel->getOpenAshmemSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void android_os_Parcel_appendFrom(JNIEnv* env, jclass clazz, jlong thisNativePtr,
|
static jlong android_os_Parcel_appendFrom(JNIEnv* env, jclass clazz, jlong thisNativePtr,
|
||||||
jlong otherNativePtr, jint offset, jint length)
|
jlong otherNativePtr, jint offset, jint length)
|
||||||
{
|
{
|
||||||
Parcel* thisParcel = reinterpret_cast<Parcel*>(thisNativePtr);
|
Parcel* thisParcel = reinterpret_cast<Parcel*>(thisNativePtr);
|
||||||
if (thisParcel == NULL) {
|
if (thisParcel == NULL) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
Parcel* otherParcel = reinterpret_cast<Parcel*>(otherNativePtr);
|
Parcel* otherParcel = reinterpret_cast<Parcel*>(otherNativePtr);
|
||||||
if (otherParcel == NULL) {
|
if (otherParcel == NULL) {
|
||||||
return;
|
return thisParcel->getOpenAshmemSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t err = thisParcel->appendFrom(otherParcel, offset, length);
|
status_t err = thisParcel->appendFrom(otherParcel, offset, length);
|
||||||
if (err != NO_ERROR) {
|
if (err != NO_ERROR) {
|
||||||
signalExceptionForError(env, clazz, err);
|
signalExceptionForError(env, clazz, err);
|
||||||
}
|
}
|
||||||
|
return thisParcel->getOpenAshmemSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
static jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jclass clazz, jlong nativePtr)
|
static jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jclass clazz, jlong nativePtr)
|
||||||
@@ -722,7 +730,7 @@ static const JNINativeMethod gParcelMethods[] = {
|
|||||||
{"nativeDataAvail", "(J)I", (void*)android_os_Parcel_dataAvail},
|
{"nativeDataAvail", "(J)I", (void*)android_os_Parcel_dataAvail},
|
||||||
{"nativeDataPosition", "(J)I", (void*)android_os_Parcel_dataPosition},
|
{"nativeDataPosition", "(J)I", (void*)android_os_Parcel_dataPosition},
|
||||||
{"nativeDataCapacity", "(J)I", (void*)android_os_Parcel_dataCapacity},
|
{"nativeDataCapacity", "(J)I", (void*)android_os_Parcel_dataCapacity},
|
||||||
{"nativeSetDataSize", "(JI)V", (void*)android_os_Parcel_setDataSize},
|
{"nativeSetDataSize", "(JI)J", (void*)android_os_Parcel_setDataSize},
|
||||||
{"nativeSetDataPosition", "(JI)V", (void*)android_os_Parcel_setDataPosition},
|
{"nativeSetDataPosition", "(JI)V", (void*)android_os_Parcel_setDataPosition},
|
||||||
{"nativeSetDataCapacity", "(JI)V", (void*)android_os_Parcel_setDataCapacity},
|
{"nativeSetDataCapacity", "(JI)V", (void*)android_os_Parcel_setDataCapacity},
|
||||||
|
|
||||||
@@ -737,7 +745,7 @@ static const JNINativeMethod gParcelMethods[] = {
|
|||||||
{"nativeWriteDouble", "(JD)V", (void*)android_os_Parcel_writeDouble},
|
{"nativeWriteDouble", "(JD)V", (void*)android_os_Parcel_writeDouble},
|
||||||
{"nativeWriteString", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString},
|
{"nativeWriteString", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString},
|
||||||
{"nativeWriteStrongBinder", "(JLandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder},
|
{"nativeWriteStrongBinder", "(JLandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder},
|
||||||
{"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)V", (void*)android_os_Parcel_writeFileDescriptor},
|
{"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", (void*)android_os_Parcel_writeFileDescriptor},
|
||||||
|
|
||||||
{"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray},
|
{"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray},
|
||||||
{"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob},
|
{"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob},
|
||||||
@@ -755,12 +763,12 @@ static const JNINativeMethod gParcelMethods[] = {
|
|||||||
{"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor},
|
{"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor},
|
||||||
|
|
||||||
{"nativeCreate", "()J", (void*)android_os_Parcel_create},
|
{"nativeCreate", "()J", (void*)android_os_Parcel_create},
|
||||||
{"nativeFreeBuffer", "(J)V", (void*)android_os_Parcel_freeBuffer},
|
{"nativeFreeBuffer", "(J)J", (void*)android_os_Parcel_freeBuffer},
|
||||||
{"nativeDestroy", "(J)V", (void*)android_os_Parcel_destroy},
|
{"nativeDestroy", "(J)V", (void*)android_os_Parcel_destroy},
|
||||||
|
|
||||||
{"nativeMarshall", "(J)[B", (void*)android_os_Parcel_marshall},
|
{"nativeMarshall", "(J)[B", (void*)android_os_Parcel_marshall},
|
||||||
{"nativeUnmarshall", "(J[BII)V", (void*)android_os_Parcel_unmarshall},
|
{"nativeUnmarshall", "(J[BII)J", (void*)android_os_Parcel_unmarshall},
|
||||||
{"nativeAppendFrom", "(JJII)V", (void*)android_os_Parcel_appendFrom},
|
{"nativeAppendFrom", "(JJII)J", (void*)android_os_Parcel_appendFrom},
|
||||||
{"nativeHasFileDescriptors", "(J)Z", (void*)android_os_Parcel_hasFileDescriptors},
|
{"nativeHasFileDescriptors", "(J)Z", (void*)android_os_Parcel_hasFileDescriptors},
|
||||||
{"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken},
|
{"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken},
|
||||||
{"nativeEnforceInterface", "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface},
|
{"nativeEnforceInterface", "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface},
|
||||||
|
|||||||
Reference in New Issue
Block a user