aboutsummaryrefslogtreecommitdiffstats
path: root/ddms/libs/ddmlib/src/com/android/ddmlib/log/GcEventContainer.java
diff options
context:
space:
mode:
Diffstat (limited to 'ddms/libs/ddmlib/src/com/android/ddmlib/log/GcEventContainer.java')
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/log/GcEventContainer.java347
1 files changed, 0 insertions, 347 deletions
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/log/GcEventContainer.java b/ddms/libs/ddmlib/src/com/android/ddmlib/log/GcEventContainer.java
deleted file mode 100644
index 7bae202..0000000
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/log/GcEventContainer.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.ddmlib.log;
-
-import com.android.ddmlib.log.EventValueDescription.ValueType;
-import com.android.ddmlib.log.LogReceiver.LogEntry;
-
-/**
- * Custom Event Container for the Gc event since this event doesn't simply output data in
- * int or long format, but encodes several values on 4 longs.
- * <p/>
- * The array of {@link EventValueDescription}s parsed from the "event-log-tags" file must
- * be ignored, and instead, the array returned from {@link #getValueDescriptions()} must be used.
- */
-final class GcEventContainer extends EventContainer {
-
- public final static int GC_EVENT_TAG = 20001;
-
- private String processId;
- private long gcTime;
- private long bytesFreed;
- private long objectsFreed;
- private long actualSize;
- private long allowedSize;
- private long softLimit;
- private long objectsAllocated;
- private long bytesAllocated;
- private long zActualSize;
- private long zAllowedSize;
- private long zObjectsAllocated;
- private long zBytesAllocated;
- private long dlmallocFootprint;
- private long mallinfoTotalAllocatedSpace;
- private long externalLimit;
- private long externalBytesAllocated;
-
- GcEventContainer(LogEntry entry, int tag, Object data) {
- super(entry, tag, data);
- init(data);
- }
-
- GcEventContainer(int tag, int pid, int tid, int sec, int nsec, Object data) {
- super(tag, pid, tid, sec, nsec, data);
- init(data);
- }
-
- /**
- * @param data
- */
- private void init(Object data) {
- if (data instanceof Object[]) {
- Object[] values = (Object[])data;
- for (int i = 0; i < values.length; i++) {
- if (values[i] instanceof Long) {
- parseDvmHeapInfo((Long)values[i], i);
- }
- }
- }
- }
-
- @Override
- public EventValueType getType() {
- return EventValueType.LIST;
- }
-
- @Override
- public boolean testValue(int index, Object value, CompareMethod compareMethod)
- throws InvalidTypeException {
- // do a quick easy check on the type.
- if (index == 0) {
- if ((value instanceof String) == false) {
- throw new InvalidTypeException();
- }
- } else if ((value instanceof Long) == false) {
- throw new InvalidTypeException();
- }
-
- switch (compareMethod) {
- case EQUAL_TO:
- if (index == 0) {
- return processId.equals(value);
- } else {
- return getValueAsLong(index) == ((Long)value).longValue();
- }
- case LESSER_THAN:
- return getValueAsLong(index) <= ((Long)value).longValue();
- case LESSER_THAN_STRICT:
- return getValueAsLong(index) < ((Long)value).longValue();
- case GREATER_THAN:
- return getValueAsLong(index) >= ((Long)value).longValue();
- case GREATER_THAN_STRICT:
- return getValueAsLong(index) > ((Long)value).longValue();
- case BIT_CHECK:
- return (getValueAsLong(index) & ((Long)value).longValue()) != 0;
- }
-
- throw new ArrayIndexOutOfBoundsException();
- }
-
- @Override
- public Object getValue(int valueIndex) {
- if (valueIndex == 0) {
- return processId;
- }
-
- try {
- return new Long(getValueAsLong(valueIndex));
- } catch (InvalidTypeException e) {
- // this would only happened if valueIndex was 0, which we test above.
- }
-
- return null;
- }
-
- @Override
- public double getValueAsDouble(int valueIndex) throws InvalidTypeException {
- return (double)getValueAsLong(valueIndex);
- }
-
- @Override
- public String getValueAsString(int valueIndex) {
- switch (valueIndex) {
- case 0:
- return processId;
- default:
- try {
- return Long.toString(getValueAsLong(valueIndex));
- } catch (InvalidTypeException e) {
- // we shouldn't stop there since we test, in this method first.
- }
- }
-
- throw new ArrayIndexOutOfBoundsException();
- }
-
- /**
- * Returns a custom array of {@link EventValueDescription} since the actual content of this
- * event (list of (long, long) does not match the values encoded into those longs.
- */
- static EventValueDescription[] getValueDescriptions() {
- try {
- return new EventValueDescription[] {
- new EventValueDescription("Process Name", EventValueType.STRING),
- new EventValueDescription("GC Time", EventValueType.LONG,
- ValueType.MILLISECONDS),
- new EventValueDescription("Freed Objects", EventValueType.LONG,
- ValueType.OBJECTS),
- new EventValueDescription("Freed Bytes", EventValueType.LONG, ValueType.BYTES),
- new EventValueDescription("Soft Limit", EventValueType.LONG, ValueType.BYTES),
- new EventValueDescription("Actual Size (aggregate)", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Allowed Size (aggregate)", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Allocated Objects (aggregate)",
- EventValueType.LONG, ValueType.OBJECTS),
- new EventValueDescription("Allocated Bytes (aggregate)", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Actual Size", EventValueType.LONG, ValueType.BYTES),
- new EventValueDescription("Allowed Size", EventValueType.LONG, ValueType.BYTES),
- new EventValueDescription("Allocated Objects", EventValueType.LONG,
- ValueType.OBJECTS),
- new EventValueDescription("Allocated Bytes", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Actual Size (zygote)", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Allowed Size (zygote)", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Allocated Objects (zygote)", EventValueType.LONG,
- ValueType.OBJECTS),
- new EventValueDescription("Allocated Bytes (zygote)", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("External Allocation Limit", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("External Bytes Allocated", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("dlmalloc Footprint", EventValueType.LONG,
- ValueType.BYTES),
- new EventValueDescription("Malloc Info: Total Allocated Space",
- EventValueType.LONG, ValueType.BYTES),
- };
- } catch (InvalidValueTypeException e) {
- // this shouldn't happen since we control manual the EventValueType and the ValueType
- // values. For development purpose, we assert if this happens.
- assert false;
- }
-
- // this shouldn't happen, but the compiler complains otherwise.
- return null;
- }
-
- private void parseDvmHeapInfo(long data, int index) {
- switch (index) {
- case 0:
- // [63 ] Must be zero
- // [62-24] ASCII process identifier
- // [23-12] GC time in ms
- // [11- 0] Bytes freed
-
- gcTime = float12ToInt((int)((data >> 12) & 0xFFFL));
- bytesFreed = float12ToInt((int)(data & 0xFFFL));
-
- // convert the long into an array, in the proper order so that we can convert the
- // first 5 char into a string.
- byte[] dataArray = new byte[8];
- put64bitsToArray(data, dataArray, 0);
-
- // get the name from the string
- processId = new String(dataArray, 0, 5);
- break;
- case 1:
- // [63-62] 10
- // [61-60] Reserved; must be zero
- // [59-48] Objects freed
- // [47-36] Actual size (current footprint)
- // [35-24] Allowed size (current hard max)
- // [23-12] Objects allocated
- // [11- 0] Bytes allocated
- objectsFreed = float12ToInt((int)((data >> 48) & 0xFFFL));
- actualSize = float12ToInt((int)((data >> 36) & 0xFFFL));
- allowedSize = float12ToInt((int)((data >> 24) & 0xFFFL));
- objectsAllocated = float12ToInt((int)((data >> 12) & 0xFFFL));
- bytesAllocated = float12ToInt((int)(data & 0xFFFL));
- break;
- case 2:
- // [63-62] 11
- // [61-60] Reserved; must be zero
- // [59-48] Soft limit (current soft max)
- // [47-36] Actual size (current footprint)
- // [35-24] Allowed size (current hard max)
- // [23-12] Objects allocated
- // [11- 0] Bytes allocated
- softLimit = float12ToInt((int)((data >> 48) & 0xFFFL));
- zActualSize = float12ToInt((int)((data >> 36) & 0xFFFL));
- zAllowedSize = float12ToInt((int)((data >> 24) & 0xFFFL));
- zObjectsAllocated = float12ToInt((int)((data >> 12) & 0xFFFL));
- zBytesAllocated = float12ToInt((int)(data & 0xFFFL));
- break;
- case 3:
- // [63-48] Reserved; must be zero
- // [47-36] dlmallocFootprint
- // [35-24] mallinfo: total allocated space
- // [23-12] External byte limit
- // [11- 0] External bytes allocated
- dlmallocFootprint = float12ToInt((int)((data >> 36) & 0xFFFL));
- mallinfoTotalAllocatedSpace = float12ToInt((int)((data >> 24) & 0xFFFL));
- externalLimit = float12ToInt((int)((data >> 12) & 0xFFFL));
- externalBytesAllocated = float12ToInt((int)(data & 0xFFFL));
- break;
- default:
- break;
- }
- }
-
- /**
- * Converts a 12 bit float representation into an unsigned int (returned as a long)
- * @param f12
- */
- private static long float12ToInt(int f12) {
- return (f12 & 0x1FF) << ((f12 >>> 9) * 4);
- }
-
- /**
- * puts an unsigned value in an array.
- * @param value The value to put.
- * @param dest the destination array
- * @param offset the offset in the array where to put the value.
- * Array length must be at least offset + 8
- */
- private static void put64bitsToArray(long value, byte[] dest, int offset) {
- dest[offset + 7] = (byte)(value & 0x00000000000000FFL);
- dest[offset + 6] = (byte)((value & 0x000000000000FF00L) >> 8);
- dest[offset + 5] = (byte)((value & 0x0000000000FF0000L) >> 16);
- dest[offset + 4] = (byte)((value & 0x00000000FF000000L) >> 24);
- dest[offset + 3] = (byte)((value & 0x000000FF00000000L) >> 32);
- dest[offset + 2] = (byte)((value & 0x0000FF0000000000L) >> 40);
- dest[offset + 1] = (byte)((value & 0x00FF000000000000L) >> 48);
- dest[offset + 0] = (byte)((value & 0xFF00000000000000L) >> 56);
- }
-
- /**
- * Returns the long value of the <code>valueIndex</code>-th value.
- * @param valueIndex the index of the value.
- * @throws InvalidTypeException if index is 0 as it is a string value.
- */
- private final long getValueAsLong(int valueIndex) throws InvalidTypeException {
- switch (valueIndex) {
- case 0:
- throw new InvalidTypeException();
- case 1:
- return gcTime;
- case 2:
- return objectsFreed;
- case 3:
- return bytesFreed;
- case 4:
- return softLimit;
- case 5:
- return actualSize;
- case 6:
- return allowedSize;
- case 7:
- return objectsAllocated;
- case 8:
- return bytesAllocated;
- case 9:
- return actualSize - zActualSize;
- case 10:
- return allowedSize - zAllowedSize;
- case 11:
- return objectsAllocated - zObjectsAllocated;
- case 12:
- return bytesAllocated - zBytesAllocated;
- case 13:
- return zActualSize;
- case 14:
- return zAllowedSize;
- case 15:
- return zObjectsAllocated;
- case 16:
- return zBytesAllocated;
- case 17:
- return externalLimit;
- case 18:
- return externalBytesAllocated;
- case 19:
- return dlmallocFootprint;
- case 20:
- return mallinfoTotalAllocatedSpace;
- }
-
- throw new ArrayIndexOutOfBoundsException();
- }
-}