17b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project/*
27b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project *
47b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * you may not use this file except in compliance with the License.
67b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * You may obtain a copy of the License at
77b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project *
87b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project *
107b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * See the License for the specific language governing permissions and
147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * limitations under the License.
157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */
167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectpackage android.ddm;
187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.Chunk;
207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.ChunkHandler;
217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport org.apache.harmony.dalvik.ddmc.DdmServer;
227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport android.os.Debug;
237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport android.util.Log;
247b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport java.io.IOException;
257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectimport java.nio.ByteBuffer;
267b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project/**
287b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * Handle profiling requests.
297b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */
307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Projectpublic class DdmHandleProfiling extends ChunkHandler {
317b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
327b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public static final int CHUNK_MPRS = type("MPRS");
337b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public static final int CHUNK_MPRE = type("MPRE");
3472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    public static final int CHUNK_MPSS = type("MPSS");
3572a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    public static final int CHUNK_MPSE = type("MPSE");
367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public static final int CHUNK_MPRQ = type("MPRQ");
377be3a138d57713bbe6d624998620081807e65b71Jeff Hao    public static final int CHUNK_SPSS = type("SPSS");
387be3a138d57713bbe6d624998620081807e65b71Jeff Hao    public static final int CHUNK_SPSE = type("SPSE");
397b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
407b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private static DdmHandleProfiling mInstance = new DdmHandleProfiling();
417b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
427b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
437b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /* singleton, do not instantiate */
447b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private DdmHandleProfiling() {}
457b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
467b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /**
477b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Register for the messages we're interested in.
487b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
497b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public static void register() {
507b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        DdmServer.registerHandler(CHUNK_MPRS, mInstance);
517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        DdmServer.registerHandler(CHUNK_MPRE, mInstance);
5272a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        DdmServer.registerHandler(CHUNK_MPSS, mInstance);
5372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        DdmServer.registerHandler(CHUNK_MPSE, mInstance);
547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        DdmServer.registerHandler(CHUNK_MPRQ, mInstance);
557be3a138d57713bbe6d624998620081807e65b71Jeff Hao        DdmServer.registerHandler(CHUNK_SPSS, mInstance);
567be3a138d57713bbe6d624998620081807e65b71Jeff Hao        DdmServer.registerHandler(CHUNK_SPSE, mInstance);
577b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
587b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
597b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /**
607b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Called when the DDM server connects.  The handler is allowed to
617b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * send messages to the server.
627b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
637b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public void connected() {}
647b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
657b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /**
667b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Called when the DDM server disconnects.  Can be used to disable
677b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * periodic transmissions or clean up saved state.
687b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
697b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public void disconnected() {}
707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
717b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /**
727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a chunk of data.
737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    public Chunk handleChunk(Chunk request) {
7543a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Log.v("ddm-heap", "Handling " + name(request.type) + " chunk");
777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        int type = request.type;
787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        if (type == CHUNK_MPRS) {
807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return handleMPRS(request);
817b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } else if (type == CHUNK_MPRE) {
827b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return handleMPRE(request);
8372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        } else if (type == CHUNK_MPSS) {
8472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            return handleMPSS(request);
8572a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        } else if (type == CHUNK_MPSE) {
8672a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            return handleMPSE(request);
877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } else if (type == CHUNK_MPRQ) {
887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return handleMPRQ(request);
897be3a138d57713bbe6d624998620081807e65b71Jeff Hao        } else if (type == CHUNK_SPSS) {
907be3a138d57713bbe6d624998620081807e65b71Jeff Hao            return handleSPSS(request);
917be3a138d57713bbe6d624998620081807e65b71Jeff Hao        } else if (type == CHUNK_SPSE) {
927be3a138d57713bbe6d624998620081807e65b71Jeff Hao            return handleSPSE(request);
937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } else {
947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            throw new RuntimeException("Unknown packet "
957b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project                + ChunkHandler.name(type));
967b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        }
977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
997b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /*
1007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a "Method PRofiling Start" request.
1017b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
1027b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private Chunk handleMPRS(Chunk request) {
1037b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        ByteBuffer in = wrapChunk(request);
1047b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1057b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        int bufferSize = in.getInt();
1067b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        int flags = in.getInt();
1077b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        int len = in.getInt();
1087b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        String fileName = getString(in, len);
10943a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false)
1107b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Log.v("ddm-heap", "Method profiling start: filename='" + fileName
1117b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project                + "', size=" + bufferSize + ", flags=" + flags);
1127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        try {
1147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Debug.startMethodTracing(fileName, bufferSize, flags);
1157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return null;        // empty response
1167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } catch (RuntimeException re) {
1177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            return createFailChunk(1, re.getMessage());
1187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        }
1197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
1207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /*
1227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a "Method PRofiling End" request.
1237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
1247b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private Chunk handleMPRE(Chunk request) {
1257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        byte result;
1267b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        try {
1287b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Debug.stopMethodTracing();
1297b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            result = 0;
1307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        } catch (RuntimeException re) {
1317b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            Log.w("ddm-heap", "Method profiling end failed: "
1327b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project                + re.getMessage());
1337b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project            result = 1;
1347b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        }
1357b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        /* create a non-empty reply so the handler fires on completion */
1377b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        byte[] reply = { result };
1387b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        return new Chunk(CHUNK_MPRE, reply, 0, reply.length);
1397b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
1407b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1417b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    /*
14272a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden     * Handle a "Method Profiling w/Streaming Start" request.
14372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden     */
14472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    private Chunk handleMPSS(Chunk request) {
14572a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        ByteBuffer in = wrapChunk(request);
14672a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
14772a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        int bufferSize = in.getInt();
14872a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        int flags = in.getInt();
14943a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) {
15072a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            Log.v("ddm-heap", "Method prof stream start: size=" + bufferSize
15172a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden                + ", flags=" + flags);
15272a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        }
15372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
15472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        try {
1557be3a138d57713bbe6d624998620081807e65b71Jeff Hao            Debug.startMethodTracingDdms(bufferSize, flags, false, 0);
15672a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            return null;        // empty response
15772a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        } catch (RuntimeException re) {
15872a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            return createFailChunk(1, re.getMessage());
15972a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        }
16072a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    }
16172a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
16272a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    /*
16372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden     * Handle a "Method Profiling w/Streaming End" request.
16472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden     */
16572a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    private Chunk handleMPSE(Chunk request) {
16672a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        byte result;
16772a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
16843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) {
16972a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            Log.v("ddm-heap", "Method prof stream end");
17072a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        }
17172a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
17272a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        try {
17372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            Debug.stopMethodTracing();
17472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            result = 0;
17572a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        } catch (RuntimeException re) {
17672a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            Log.w("ddm-heap", "Method prof stream end failed: "
17772a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden                + re.getMessage());
17872a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden            return createFailChunk(1, re.getMessage());
17972a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        }
18072a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
18172a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        /* VM sent the (perhaps very large) response directly */
18272a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden        return null;
18372a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    }
18472a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden
18572a20db0c71c6bddaa9fd2e4046242fc9d540e1cAndy McFadden    /*
1867b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     * Handle a "Method PRofiling Query" request.
1877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project     */
1887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    private Chunk handleMPRQ(Chunk request) {
189ac27705f75e74f022de8c7888b14b49fed899176Jeff Hao        int result = Debug.getMethodTracingMode();
1907b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
1917b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        /* create a non-empty reply so the handler fires on completion */
1927b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        byte[] reply = { (byte) result };
1937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project        return new Chunk(CHUNK_MPRQ, reply, 0, reply.length);
1947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project    }
1957be3a138d57713bbe6d624998620081807e65b71Jeff Hao
1967be3a138d57713bbe6d624998620081807e65b71Jeff Hao    /*
1977be3a138d57713bbe6d624998620081807e65b71Jeff Hao     * Handle a "Sample Profiling w/Streaming Start" request.
1987be3a138d57713bbe6d624998620081807e65b71Jeff Hao     */
1997be3a138d57713bbe6d624998620081807e65b71Jeff Hao    private Chunk handleSPSS(Chunk request) {
2007be3a138d57713bbe6d624998620081807e65b71Jeff Hao        ByteBuffer in = wrapChunk(request);
2017be3a138d57713bbe6d624998620081807e65b71Jeff Hao
2027be3a138d57713bbe6d624998620081807e65b71Jeff Hao        int bufferSize = in.getInt();
2037be3a138d57713bbe6d624998620081807e65b71Jeff Hao        int flags = in.getInt();
2047be3a138d57713bbe6d624998620081807e65b71Jeff Hao        int interval = in.getInt();
2057be3a138d57713bbe6d624998620081807e65b71Jeff Hao        if (false) {
2067be3a138d57713bbe6d624998620081807e65b71Jeff Hao            Log.v("ddm-heap", "Sample prof stream start: size=" + bufferSize
2077be3a138d57713bbe6d624998620081807e65b71Jeff Hao                + ", flags=" + flags + ", interval=" + interval);
2087be3a138d57713bbe6d624998620081807e65b71Jeff Hao        }
2097be3a138d57713bbe6d624998620081807e65b71Jeff Hao
2107be3a138d57713bbe6d624998620081807e65b71Jeff Hao        try {
2117be3a138d57713bbe6d624998620081807e65b71Jeff Hao            Debug.startMethodTracingDdms(bufferSize, flags, true, interval);
2127be3a138d57713bbe6d624998620081807e65b71Jeff Hao            return null;        // empty response
2137be3a138d57713bbe6d624998620081807e65b71Jeff Hao        } catch (RuntimeException re) {
2147be3a138d57713bbe6d624998620081807e65b71Jeff Hao            return createFailChunk(1, re.getMessage());
2157be3a138d57713bbe6d624998620081807e65b71Jeff Hao        }
2167be3a138d57713bbe6d624998620081807e65b71Jeff Hao    }
2177be3a138d57713bbe6d624998620081807e65b71Jeff Hao
2187be3a138d57713bbe6d624998620081807e65b71Jeff Hao    /*
2197be3a138d57713bbe6d624998620081807e65b71Jeff Hao     * Handle a "Sample Profiling w/Streaming End" request.
2207be3a138d57713bbe6d624998620081807e65b71Jeff Hao     */
2217be3a138d57713bbe6d624998620081807e65b71Jeff Hao    private Chunk handleSPSE(Chunk request) {
2227be3a138d57713bbe6d624998620081807e65b71Jeff Hao        if (false) {
2237be3a138d57713bbe6d624998620081807e65b71Jeff Hao            Log.v("ddm-heap", "Sample prof stream end");
2247be3a138d57713bbe6d624998620081807e65b71Jeff Hao        }
2257be3a138d57713bbe6d624998620081807e65b71Jeff Hao
2267be3a138d57713bbe6d624998620081807e65b71Jeff Hao        try {
2277be3a138d57713bbe6d624998620081807e65b71Jeff Hao            Debug.stopMethodTracing();
2287be3a138d57713bbe6d624998620081807e65b71Jeff Hao        } catch (RuntimeException re) {
2297be3a138d57713bbe6d624998620081807e65b71Jeff Hao            Log.w("ddm-heap", "Sample prof stream end failed: "
2307be3a138d57713bbe6d624998620081807e65b71Jeff Hao                + re.getMessage());
2317be3a138d57713bbe6d624998620081807e65b71Jeff Hao            return createFailChunk(1, re.getMessage());
2327be3a138d57713bbe6d624998620081807e65b71Jeff Hao        }
2337be3a138d57713bbe6d624998620081807e65b71Jeff Hao
2347be3a138d57713bbe6d624998620081807e65b71Jeff Hao        /* VM sent the (perhaps very large) response directly */
2357be3a138d57713bbe6d624998620081807e65b71Jeff Hao        return null;
2367be3a138d57713bbe6d624998620081807e65b71Jeff Hao    }
2377b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project}
2387b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project
239