summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorRajneesh Chowdury <rajneeshc@google.com>2011-02-25 10:15:45 -0800
committerRajneesh Chowdury <rajneeshc@google.com>2011-02-27 20:59:12 -0800
commitf67441eb370f764710b5697885d1a1549d41e819 (patch)
treec938fe81ad4188534fb95c6cbe7e3a913f11a20b /media
parent30b1fe07a73d522e97b7140cc227232a0c8c1a1e (diff)
downloadframeworks_base-f67441eb370f764710b5697885d1a1549d41e819.zip
frameworks_base-f67441eb370f764710b5697885d1a1549d41e819.tar.gz
frameworks_base-f67441eb370f764710b5697885d1a1549d41e819.tar.bz2
Instrumentation code to enable/disable memory leak check using setprop
The heap memory dump is enabled when libc.debug.malloc property is 1. Two .dump files are created in predefined path. Memory leak report can be generated using nativeheapdump tool. Change-Id: Ie03928b5a05993e72d4700a158657c514478ecd3
Diffstat (limited to 'media')
-rwxr-xr-xmedia/java/android/media/videoeditor/VideoEditorImpl.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java
index a6b4544..1fb8c61 100755
--- a/media/java/android/media/videoeditor/VideoEditorImpl.java
+++ b/media/java/android/media/videoeditor/VideoEditorImpl.java
@@ -42,6 +42,9 @@ import android.util.Log;
import android.util.Xml;
import android.view.Surface;
import android.view.SurfaceHolder;
+import android.os.Debug;
+import android.os.SystemProperties;
+import android.os.Environment;
/**
* The VideoEditor implementation {@hide}
@@ -134,6 +137,7 @@ public class VideoEditorImpl implements VideoEditor {
*/
private MediaArtistNativeHelper mMANativeHelper;
private boolean mPreviewInProgress = false;
+ private final boolean mMallocDebug;
/**
* Constructor
@@ -142,6 +146,18 @@ public class VideoEditorImpl implements VideoEditor {
* related to the project
*/
public VideoEditorImpl(String projectPath) throws IOException {
+ String s;
+ s = SystemProperties.get("libc.debug.malloc");
+ if (s.equals("1")) {
+ mMallocDebug = true;
+ try {
+ dumpHeap("HeapAtStart");
+ } catch (Exception ex) {
+ Log.e(TAG, "dumpHeap returned error in constructor");
+ }
+ } else {
+ mMallocDebug = false;
+ }
mLock = new Semaphore(1, true);
mMANativeHelper = new MediaArtistNativeHelper(projectPath, mLock, this);
mProjectPath = projectPath;
@@ -709,6 +725,13 @@ public class VideoEditorImpl implements VideoEditor {
unlock();
}
}
+ if (mMallocDebug) {
+ try {
+ dumpHeap("HeapAtEnd");
+ } catch (Exception ex) {
+ Log.e(TAG, "dumpHeap returned error in release");
+ }
+ }
}
/*
@@ -1885,4 +1908,32 @@ public class VideoEditorImpl implements VideoEditor {
}
mLock.release();
}
+
+ /**
+ * Dumps the heap memory usage information to file
+ */
+ private static void dumpHeap (String filename) throws Exception {
+ /* Cleanup as much as possible before dump
+ */
+ System.gc();
+ System.runFinalization();
+ Thread.sleep(1000);
+ String state = Environment.getExternalStorageState();
+ if (Environment.MEDIA_MOUNTED.equals(state)) {
+ String extDir =
+ Environment.getExternalStorageDirectory().toString();
+
+ /* If dump file already exists, then delete it first
+ */
+ if ((new File(extDir + "/" + filename + ".dump")).exists()) {
+ (new File(extDir + "/" + filename + ".dump")).delete();
+ }
+ /* Dump native heap
+ */
+ FileOutputStream ost =
+ new FileOutputStream(extDir + "/" + filename + ".dump");
+ Debug.dumpNativeHeap(ost.getFD());
+ ost.close();
+ }
+ }
}