diff options
| author | Brian Carlstrom <bdc@google.com> | 2010-09-01 10:44:56 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-09-01 10:44:56 -0700 |
| commit | 41e99538638795e38b0a02711ceb572d67a779a3 (patch) | |
| tree | d40fee9f092695001402c4b3d8fef4de9ebf0a4a /core | |
| parent | 0171bfba04af5964f8863e334df3ed072a9675ef (diff) | |
| parent | 1751086360056bc60d00f2ed2988bc82be9e7bd9 (diff) | |
| download | frameworks_base-41e99538638795e38b0a02711ceb572d67a779a3.zip frameworks_base-41e99538638795e38b0a02711ceb572d67a779a3.tar.gz frameworks_base-41e99538638795e38b0a02711ceb572d67a779a3.tar.bz2 | |
am 17510863: New Java-based SamplingProfiler
Merge commit '1751086360056bc60d00f2ed2988bc82be9e7bd9' into gingerbread-plus-aosp
* commit '1751086360056bc60d00f2ed2988bc82be9e7bd9':
New Java-based SamplingProfiler
Diffstat (limited to 'core')
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 4 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/SamplingProfilerIntegration.java | 82 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 8 |
3 files changed, 51 insertions, 43 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index ca6fc8a..373142d 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -837,10 +837,6 @@ public final class ActivityThread { } private final class H extends Handler { - private H() { - SamplingProfiler.getInstance().setEventThread(mLooper.getThread()); - } - public static final int LAUNCH_ACTIVITY = 100; public static final int PAUSE_ACTIVITY = 101; public static final int PAUSE_ACTIVITY_FINISHING= 102; diff --git a/core/java/com/android/internal/os/SamplingProfilerIntegration.java b/core/java/com/android/internal/os/SamplingProfilerIntegration.java index 127fb23..ea278a6 100644 --- a/core/java/com/android/internal/os/SamplingProfilerIntegration.java +++ b/core/java/com/android/internal/os/SamplingProfilerIntegration.java @@ -18,10 +18,12 @@ package com.android.internal.os; import dalvik.system.SamplingProfiler; +import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.FileNotFoundException; +import java.io.PrintStream; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -48,6 +50,8 @@ public class SamplingProfilerIntegration { } } + private static SamplingProfiler INSTANCE; + /** * Is profiling enabled? */ @@ -59,8 +63,13 @@ public class SamplingProfilerIntegration { * Starts the profiler if profiling is enabled. */ public static void start() { - if (!enabled) return; - SamplingProfiler.getInstance().start(10); + if (!enabled) { + return; + } + ThreadGroup group = Thread.currentThread().getThreadGroup(); + SamplingProfiler.ThreadSet threadSet = SamplingProfiler.newThreadGroupTheadSet(group); + INSTANCE = new SamplingProfiler(4, threadSet); + INSTANCE.start(10); } /** Whether or not we've created the snapshots dir. */ @@ -73,7 +82,9 @@ public class SamplingProfilerIntegration { * Writes a snapshot to the SD card if profiling is enabled. */ public static void writeSnapshot(final String name) { - if (!enabled) return; + if (!enabled) { + return; + } /* * If we're already writing a snapshot, don't bother enqueing another @@ -110,18 +121,22 @@ public class SamplingProfilerIntegration { * Writes the zygote's snapshot to internal storage if profiling is enabled. */ public static void writeZygoteSnapshot() { - if (!enabled) return; + if (!enabled) { + return; + } String dir = "/data/zygote/snapshots"; new File(dir).mkdirs(); writeSnapshot(dir, "zygote"); + INSTANCE.shutdown(); + INSTANCE = null; } private static void writeSnapshot(String dir, String name) { - byte[] snapshot = SamplingProfiler.getInstance().snapshot(); - if (snapshot == null) { + if (!enabled) { return; } + INSTANCE.stop(); /* * We use the current time as a unique ID. We can't use a counter @@ -129,39 +144,40 @@ public class SamplingProfilerIntegration { * we capture two snapshots in rapid succession. */ long start = System.currentTimeMillis(); - String path = dir + "/" + name.replace(':', '.') + "-" + + String path = dir + "/" + name.replace(':', '.') + "-" + System.currentTimeMillis() + ".snapshot"; - try { - // Try to open the file a few times. The SD card may not be mounted. - FileOutputStream out; - int count = 0; - while (true) { - try { - out = new FileOutputStream(path); - break; - } catch (FileNotFoundException e) { - if (++count > 3) { - Log.e(TAG, "Could not open " + path + "."); - return; - } - // Sleep for a bit and then try again. - try { - Thread.sleep(2500); - } catch (InterruptedException e1) { /* ignore */ } + // Try to open the file a few times. The SD card may not be mounted. + PrintStream out; + int count = 0; + while (true) { + try { + out = new PrintStream(new BufferedOutputStream(new FileOutputStream(path))); + break; + } catch (FileNotFoundException e) { + if (++count > 3) { + Log.e(TAG, "Could not open " + path + "."); + return; } - } - try { - out.write(snapshot); - } finally { - out.close(); + // Sleep for a bit and then try again. + try { + Thread.sleep(2500); + } catch (InterruptedException e1) { /* ignore */ } } + } + + try { + INSTANCE.writeHprofData(out); + } finally { + out.close(); + } + if (out.checkError()) { + Log.e(TAG, "Error writing snapshot."); + } else { long elapsed = System.currentTimeMillis() - start; Log.i(TAG, "Wrote snapshot for " + name - + " in " + elapsed + "ms."); - } catch (IOException e) { - Log.e(TAG, "Error writing snapshot.", e); + + " in " + elapsed + "ms."); } } } diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 9fcd3f5..a409ec8 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -575,12 +575,8 @@ public class ZygoteInit { EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END, SystemClock.uptimeMillis()); - if (SamplingProfilerIntegration.isEnabled()) { - SamplingProfiler sp = SamplingProfiler.getInstance(); - sp.pause(); - SamplingProfilerIntegration.writeZygoteSnapshot(); - sp.shutDown(); - } + // Finish profiling the zygote initialization. + SamplingProfilerIntegration.writeZygoteSnapshot(); // Do an initial gc to clean up after startup gc(); |
