19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.ddm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.Chunk;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.ChunkHandler;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.DdmServer;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.DdmVmInternal;
237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport android.os.Debug;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport java.io.IOException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ByteBuffer;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
297b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Handle native and virtual heap requests.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DdmHandleHeap extends ChunkHandler {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_HPIF = type("HPIF");
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_HPSG = type("HPSG");
357b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public static final int CHUNK_HPDU = type("HPDU");
3607a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden    public static final int CHUNK_HPDS = type("HPDS");
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_NHSG = type("NHSG");
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_HPGC = type("HPGC");
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_REAE = type("REAE");
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_REAQ = type("REAQ");
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CHUNK_REAL = type("REAL");
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static DdmHandleHeap mInstance = new DdmHandleHeap();
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* singleton, do not instantiate */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DdmHandleHeap() {}
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register for the messages we're interested in.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void register() {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_HPIF, mInstance);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_HPSG, mInstance);
557b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        DdmServer.registerHandler(CHUNK_HPDU, mInstance);
5607a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        DdmServer.registerHandler(CHUNK_HPDS, mInstance);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_NHSG, mInstance);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_HPGC, mInstance);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_REAE, mInstance);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_REAQ, mInstance);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmServer.registerHandler(CHUNK_REAL, mInstance);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the DDM server connects.  The handler is allowed to
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * send messages to the server.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void connected() {}
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the DDM server disconnects.  Can be used to disable
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * periodic transmissions or clean up saved state.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disconnected() {}
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a chunk of data.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Chunk handleChunk(Chunk request) {
8043a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("ddm-heap", "Handling " + name(request.type) + " chunk");
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type = request.type;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == CHUNK_HPIF) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleHPIF(request);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == CHUNK_HPSG) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleHPSGNHSG(request, false);
887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } else if (type == CHUNK_HPDU) {
897b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return handleHPDU(request);
9007a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        } else if (type == CHUNK_HPDS) {
9107a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            return handleHPDS(request);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == CHUNK_NHSG) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleHPSGNHSG(request, true);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == CHUNK_HPGC) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleHPGC(request);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == CHUNK_REAE) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleREAE(request);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == CHUNK_REAQ) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleREAQ(request);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (type == CHUNK_REAL) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return handleREAL(request);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Unknown packet "
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ChunkHandler.name(type));
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1097b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a "HeaP InFo" request.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Chunk handleHPIF(Chunk request) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteBuffer in = wrapChunk(request);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int when = in.get();
11543a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("ddm-heap", "Heap segment enable: when=" + when);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean ok = DdmVmInternal.heapInfoNotify(when);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!ok) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return createFailChunk(1, "Unsupported HPIF what");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;        // empty response
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a "HeaP SeGment" or "Native Heap SeGment" request.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Chunk handleHPSGNHSG(Chunk request, boolean isNative) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteBuffer in = wrapChunk(request);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int when = in.get();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int what = in.get();
13443a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v("ddm-heap", "Heap segment enable: when=" + when
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", what=" + what + ", isNative=" + isNative);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean ok = DdmVmInternal.heapSegmentNotify(when, what, isNative);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!ok) {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return createFailChunk(1, "Unsupported HPSG what/when");
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: if "when" is non-zero and we want to see a dump
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //       right away, initiate a GC.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;        // empty response
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1497b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a "HeaP DUmp" request.
1507b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     *
1517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * This currently just returns a result code.  We could pull up
1527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * the entire contents of the file and return them, but hprof dump
1537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * files can be a few megabytes.
1547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
1557b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private Chunk handleHPDU(Chunk request) {
1567b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        ByteBuffer in = wrapChunk(request);
1577b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        byte result;
1587b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1597b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        /* get the filename for the output file */
1607b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        int len = in.getInt();
1617b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        String fileName = getString(in, len);
16243a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
1637b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Log.d("ddm-heap", "Heap dump: file='" + fileName + "'");
1647b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1657b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        try {
1667b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Debug.dumpHprofData(fileName);
1677b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            result = 0;
1687b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } catch (UnsupportedOperationException uoe) {
1697b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Log.w("ddm-heap", "hprof dumps not supported in this VM");
1707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            result = -1;
1717b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } catch (IOException ioe) {
1727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            result = -1;
17307a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        } catch (RuntimeException re) {
1747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            result = -1;
1757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        }
1767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        /* create a non-empty reply so the handler fires on completion */
1787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        byte[] reply = { result };
1797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        return new Chunk(CHUNK_HPDU, reply, 0, reply.length);
1807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
1817b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1827b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /*
18307a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden     * Handle a "HeaP Dump Streaming" request.
18407a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden     *
18507a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden     * This tells the VM to create a heap dump and send it directly to
18607a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden     * DDMS.  The dumps are large enough that we don't want to copy the
18707a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden     * data into a byte[] and send it from here.
18807a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden     */
18907a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden    private Chunk handleHPDS(Chunk request) {
19007a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        ByteBuffer in = wrapChunk(request);
19107a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        byte result;
19207a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden
19307a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        /* get the filename for the output file */
19443a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
19507a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            Log.d("ddm-heap", "Heap dump: [DDMS]");
19607a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden
19707a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        String failMsg = null;
19807a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        try {
19907a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            Debug.dumpHprofDataDdms();
20007a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        } catch (UnsupportedOperationException uoe) {
20107a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            failMsg = "hprof dumps not supported in this VM";
20207a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        } catch (RuntimeException re) {
20307a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            failMsg = "Exception: " + re.getMessage();
20407a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        }
20507a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden
20607a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        if (failMsg != null) {
20707a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            Log.w("ddm-heap", failMsg);
20807a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            return createFailChunk(1, failMsg);
20907a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        } else {
21007a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden            return null;
21107a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden        }
21207a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden    }
21307a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden
21407a9661f31797a68b8ecd3f135fe1417f214663bAndy McFadden    /*
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a "HeaP Garbage Collection" request.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Chunk handleHPGC(Chunk request) {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ByteBuffer in = wrapChunk(request);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22043a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d("ddm-heap", "Heap GC request");
22283f7d0d67fea7a018dbdf787c4acef0ca4c74a7cMathieu Chartier        Runtime.getRuntime().gc();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;        // empty response
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a "REcent Allocation Enable" request.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Chunk handleREAE(Chunk request) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteBuffer in = wrapChunk(request);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean enable;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enable = (in.get() != 0);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23643a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d("ddm-heap", "Recent allocation enable request: " + enable);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DdmVmInternal.enableRecentAllocations(enable);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;        // empty response
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a "REcent Allocation Query" request.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Chunk handleREAQ(Chunk request) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ByteBuffer in = wrapChunk(request);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] reply = new byte[1];
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        reply[0] = DdmVmInternal.getRecentAllocationStatus() ? (byte)1 :(byte)0;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Chunk(CHUNK_REAQ, reply, 0, reply.length);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a "REcent ALlocations" request.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Chunk handleREAL(Chunk request) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //ByteBuffer in = wrapChunk(request);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d("ddm-heap", "Recent allocations request");
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* generate the reply in a ready-to-go format */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] reply = DdmVmInternal.getRecentAllocations();
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Chunk(CHUNK_REAL, reply, 0, reply.length);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
270