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