Skip to content

Commit 6614bb6

Browse files
cxdongbo huang
authored andcommitted
StorageManager: fix issue that GREF has increased to 2011 in system server with intel stress test.
Issue description: When run ICS stress test, always meet GREF issue. one of contributor is MountService$MountServiceBinderListener. log info 19:21:11.609 222 24316 W dalvikvm: 24 of com.android.server.am.ActivityManagerService$AppDeathRecipient (24 unique instances) 19:21:11.609 222 24316 W dalvikvm: 479 of com.android.server.MountService$MountServiceBinderListener (479 unique instances) 19:21:11.619 222 24316 W dalvikvm: 7 of com.android.server.accessibility.AccessibilityManagerService$6 (7 unique instances) Note: PID 222 is system server. Issue alaysis: Everyone can call getSystemService(Context.STORAGE_SERVICE) to get service. When other service get StorageManager, StorageManager will new MountServiceBinderLister and register a listener in MountService, which won't be unregistered. It's easy to generate a lot of instance of unused MountService$MountServiceBinderListener in system server. Issue fix: So change the policy to be: 1. Doesn't new MountServiceBinderLister in construction. 2. when other service needs to register listener in StorageManager, StorageManager will register listener with MountService. 3. When other service needs to unregister listener in StorageManager, if there is no more other listeners in StorageManager, StorageManager will unregister listener in MountService. Change-Id: Iaaf889f44a1a5f62b9f65b3ab1b486c9b7dcaf7f Author: Chuanxiao Dong <chuanxiao.dong@intel.com> Signed-off-by: Bo Huang <bo.b.huang@intel.com> Signed-off-by: Jack Ren <jack.ren@intel.com> Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
1 parent d2237df commit 6614bb6

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

core/java/android/os/storage/StorageManager.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public class StorageManager
5656
/*
5757
* Our internal MountService binder reference
5858
*/
59-
private IMountService mMountService;
59+
final private IMountService mMountService;
6060

6161
/*
6262
* The looper target for callbacks
@@ -304,8 +304,6 @@ public StorageManager(Looper tgtLooper) throws RemoteException {
304304
return;
305305
}
306306
mTgtLooper = tgtLooper;
307-
mBinderListener = new MountServiceBinderListener();
308-
mMountService.registerListener(mBinderListener);
309307
}
310308

311309

@@ -322,6 +320,15 @@ public void registerListener(StorageEventListener listener) {
322320
}
323321

324322
synchronized (mListeners) {
323+
if (mBinderListener == null ) {
324+
try {
325+
mBinderListener = new MountServiceBinderListener();
326+
mMountService.registerListener(mBinderListener);
327+
} catch (RemoteException rex) {
328+
Log.e(TAG, "Register mBinderListener failed");
329+
return;
330+
}
331+
}
325332
mListeners.add(new ListenerDelegate(listener));
326333
}
327334
}
@@ -347,7 +354,15 @@ public void unregisterListener(StorageEventListener listener) {
347354
break;
348355
}
349356
}
350-
}
357+
if (mListeners.size() == 0 && mBinderListener != null) {
358+
try {
359+
mMountService.unregisterListener(mBinderListener);
360+
} catch (RemoteException rex) {
361+
Log.e(TAG, "Unregister mBinderListener failed");
362+
return;
363+
}
364+
}
365+
}
351366
}
352367

353368
/**

0 commit comments

Comments
 (0)