diff options
author | Daniel Sandler <dsandler@android.com> | 2013-07-02 14:17:31 -0500 |
---|---|---|
committer | Daniel Sandler <dsandler@android.com> | 2013-07-02 14:17:31 -0500 |
commit | 2566b574d8db2d2285cf6592219f165230db5fc9 (patch) | |
tree | 273a7ae6e235b1fd4d9923137aac43f7dbe2f460 /src/com/android/launcher3 | |
parent | 4de7f739c15615d5564cefd22f60176cc45ae88e (diff) | |
download | android_packages_apps_Trebuchet-2566b574d8db2d2285cf6592219f165230db5fc9.tar.gz android_packages_apps_Trebuchet-2566b574d8db2d2285cf6592219f165230db5fc9.tar.bz2 android_packages_apps_Trebuchet-2566b574d8db2d2285cf6592219f165230db5fc9.zip |
Add mutex around memory tracker data.
Bug: 9654254
Change-Id: I454a09c4b6679cc7c7ca4b02756620da4b440b0d
Diffstat (limited to 'src/com/android/launcher3')
-rw-r--r-- | src/com/android/launcher3/MemoryTracker.java | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/src/com/android/launcher3/MemoryTracker.java b/src/com/android/launcher3/MemoryTracker.java index 8595d55be..87a73f3b5 100644 --- a/src/com/android/launcher3/MemoryTracker.java +++ b/src/com/android/launcher3/MemoryTracker.java @@ -59,6 +59,7 @@ public class MemoryTracker extends Service { 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 class MemoryTracker extends Service { } public void startTrackingProcess(int pid, String name) { - final Long lpid = new Long(pid); - - 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(" "); + synchronized (mLock) { + final Long lpid = new Long(pid); + + 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(" "); + } + 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 |