diff options
author | Rajneesh Chowdury <rajneeshc@google.com> | 2011-02-25 10:15:45 -0800 |
---|---|---|
committer | Rajneesh Chowdury <rajneeshc@google.com> | 2011-02-27 20:59:12 -0800 |
commit | f67441eb370f764710b5697885d1a1549d41e819 (patch) | |
tree | c938fe81ad4188534fb95c6cbe7e3a913f11a20b | |
parent | 30b1fe07a73d522e97b7140cc227232a0c8c1a1e (diff) | |
download | frameworks_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
-rwxr-xr-x | media/java/android/media/videoeditor/VideoEditorImpl.java | 51 |
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(); + } + } } |