1cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown/*
2cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * Copyright (C) 2012 The Android Open Source Project
3cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown *
4cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * you may not use this file except in compliance with the License.
6cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * You may obtain a copy of the License at
7cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown *
8cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown *
10cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * Unless required by applicable law or agreed to in writing, software
11cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * See the License for the specific language governing permissions and
14cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * limitations under the License.
15cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown */
16cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
17cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownpackage com.android.internal.util;
18cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
19cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownimport android.os.Handler;
20cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
21cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownimport java.io.PrintWriter;
22cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownimport java.io.StringWriter;
23cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
24cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown/**
25cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown * Helper functions for dumping the state of system services.
26cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown */
27cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brownpublic final class DumpUtils {
28cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    private DumpUtils() {
29cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
30cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
31cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    /**
32cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Helper for dumping state owned by a handler thread.
33cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     *
34cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * Because the caller might be holding an important lock that the handler is
35cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * trying to acquire, we use a short timeout to avoid deadlocks.  The process
36cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     * is inelegant but this function is only used for debugging purposes.
37cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown     */
38cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public static void dumpAsync(Handler handler, final Dump dump, PrintWriter pw, long timeout) {
39cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        final StringWriter sw = new StringWriter();
40cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        if (handler.runWithScissors(new Runnable() {
41cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            @Override
42cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            public void run() {
438c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn                PrintWriter lpw = new FastPrintWriter(sw);
44cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                dump.dump(lpw);
45cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown                lpw.close();
46cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            }
47cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        }, timeout)) {
48cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            pw.print(sw.toString());
49cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        } else {
50cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown            pw.println("... timed out");
51cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        }
52cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
53cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown
54cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    public interface Dump {
55cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown        void dump(PrintWriter pw);
56cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown    }
57cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown}
58