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"); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.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