diff --git a/src/com/android/launcher3/MemoryDumpActivity.java b/src/com/android/launcher3/MemoryDumpActivity.java
index 37e3928..447f0dd 100644
--- a/src/com/android/launcher3/MemoryDumpActivity.java
+++ b/src/com/android/launcher3/MemoryDumpActivity.java
@@ -83,24 +83,29 @@
         final StringBuilder body = new StringBuilder();
 
         final ArrayList<String> paths = new ArrayList<String>();
-        for (int pid : tracker.getTrackedProcesses()) {
-            final String path = String.format("%s/launcher-memory-%d.ahprof",
-                    Environment.getExternalStorageDirectory(),
-                    pid);
-            Log.v(TAG, "Dumping memory info for process " + pid + " to " + path);
-            MemoryTracker.ProcessMemInfo info = tracker.getMemInfo(pid);
-            body.append("pid ").append(pid).append(":")
-                .append(" up=").append(info.getUptime())
-                .append(" pss=").append(info.currentPss)
-                .append(" uss=").append(info.currentUss)
-                .append("\n");
-            try {
-                android.os.Debug.dumpHprofData(path); // will block
-            } catch (IOException e) {
-                Log.e(TAG, "error dumping memory:", e);
-            }
+        final int myPid = android.os.Process.myPid();
 
-            paths.add(path);
+        for (int pid : tracker.getTrackedProcesses()) {
+            MemoryTracker.ProcessMemInfo info = tracker.getMemInfo(pid);
+            if (info != null) {
+                body.append("pid ").append(pid).append(":")
+                    .append(" up=").append(info.getUptime())
+                    .append(" pss=").append(info.currentPss)
+                    .append(" uss=").append(info.currentUss)
+                    .append("\n");
+            }
+            if (pid == myPid) {
+                final String path = String.format("%s/launcher-memory-%d.ahprof",
+                        Environment.getExternalStorageDirectory(),
+                        pid);
+                Log.v(TAG, "Dumping memory info for process " + pid + " to " + path);
+                try {
+                    android.os.Debug.dumpHprofData(path); // will block
+                } catch (IOException e) {
+                    Log.e(TAG, "error dumping memory:", e);
+                }
+                paths.add(path);
+            }
         }
 
         String zipfile = zipUp(paths);
@@ -111,7 +116,7 @@
         shareIntent.setType("application/zip");
 
         final PackageManager pm = context.getPackageManager();
-        shareIntent.putExtra(Intent.EXTRA_SUBJECT, String.format("Launcher memory dump"));
+        shareIntent.putExtra(Intent.EXTRA_SUBJECT, String.format("Launcher memory dump (%d)", myPid));
         String appVersion;
         try {
             appVersion = pm.getPackageInfo(context.getPackageName(), 0).versionName;
diff --git a/src/com/android/launcher3/MemoryTracker.java b/src/com/android/launcher3/MemoryTracker.java
index 8595d55..87a73f3 100644
--- a/src/com/android/launcher3/MemoryTracker.java
+++ b/src/com/android/launcher3/MemoryTracker.java
@@ -59,6 +59,7 @@
     public final LongSparseArray<ProcessMemInfo> mData = new LongSparseArray<ProcessMemInfo>();
     public final ArrayList<Long> mPids = new ArrayList<Long>();
     private int[] mPidsArray = new int[0];
+    private final Object mLock = new Object();
 
     Handler mHandler = new Handler() {
         @Override
@@ -99,48 +100,50 @@
     }
 
     public void startTrackingProcess(int pid, String name) {
-        final Long lpid = new Long(pid);
+        synchronized (mLock) {
+            final Long lpid = new Long(pid);
 
-        if (mPids.contains(lpid)) return;
+            if (mPids.contains(lpid)) return;
 
-        mPids.add(lpid);
-        final int N = mPids.size();
-        mPidsArray = new int[N];
-        StringBuffer sb = new StringBuffer("Now tracking processes: ");
-        for (int i=0; i<N; i++) {
-            final int p = mPids.get(i).intValue();
-            mPidsArray[i] = p;
-            sb.append(p); sb.append(" ");
+            mPids.add(lpid);
+            final int N = mPids.size();
+            mPidsArray = new int[N];
+            StringBuffer sb = new StringBuffer("Now tracking processes: ");
+            for (int i=0; i<N; i++) {
+                final int p = mPids.get(i).intValue();
+                mPidsArray[i] = p;
+                sb.append(p); sb.append(" ");
+            }
+            mData.put(pid, new ProcessMemInfo(pid, name));
+            Log.v(TAG, sb.toString());
         }
-        mData.put(pid, new ProcessMemInfo(pid, name));
-        Log.v(TAG, sb.toString());
     }
 
     void update() {
-        Debug.MemoryInfo[] dinfos = mAm.getProcessMemoryInfo(mPidsArray);
-        for (int i=0; i<dinfos.length; i++) {
-            Debug.MemoryInfo dinfo = dinfos[i];
-            final long pid = mPids.get(i).intValue();
-            final ProcessMemInfo info = mData.get(pid);
-            info.head = (info.head+1) % info.pss.length;
-            info.pss[info.head] = info.currentPss = dinfo.getTotalPss();
-            info.uss[info.head] = info.currentUss = dinfo.getTotalPrivateDirty();
-            if (info.currentPss > info.max) info.max = info.currentPss;
-            if (info.currentUss > info.max) info.max = info.currentUss;
-            // Log.v(TAG, "update: pid " + pid + " pss=" + info.currentPss + " uss=" + info.currentUss);
-            if (info.currentPss == 0) {
-                Log.v(TAG, "update: pid " + pid + " has pss=0, it probably died");
-                mData.remove(pid);
+        synchronized (mLock) {
+            Debug.MemoryInfo[] dinfos = mAm.getProcessMemoryInfo(mPidsArray);
+            for (int i=0; i<dinfos.length; i++) {
+                Debug.MemoryInfo dinfo = dinfos[i];
+                final long pid = mPids.get(i).intValue();
+                final ProcessMemInfo info = mData.get(pid);
+                info.head = (info.head+1) % info.pss.length;
+                info.pss[info.head] = info.currentPss = dinfo.getTotalPss();
+                info.uss[info.head] = info.currentUss = dinfo.getTotalPrivateDirty();
+                if (info.currentPss > info.max) info.max = info.currentPss;
+                if (info.currentUss > info.max) info.max = info.currentUss;
+                // Log.v(TAG, "update: pid " + pid + " pss=" + info.currentPss + " uss=" + info.currentUss);
+                if (info.currentPss == 0) {
+                    Log.v(TAG, "update: pid " + pid + " has pss=0, it probably died");
+                    mData.remove(pid);
+                }
+            }
+            for (int i=mPids.size()-1; i>=0; i--) {
+                final long pid = mPids.get(i).intValue();
+                if (mData.get(pid) == null) {
+                    mPids.remove(i);
+                }
             }
         }
-        for (int i=mPids.size()-1; i>=0; i--) {
-            final long pid = mPids.get(i).intValue();
-            if (mData.get(pid) == null) {
-                mPids.remove(i);
-            }
-        }
-
-        // XXX: notify listeners
     }
 
     @Override
