diff options
author | Diogo Ferreira <defer@cyngn.com> | 2016-08-10 14:42:08 +0100 |
---|---|---|
committer | Diogo Ferreira <defer@cyngn.com> | 2016-08-10 14:42:08 +0100 |
commit | 32265aeedd523b5568e948f918d1c689ef92d82e (patch) | |
tree | 3fa3643cba6c61824d10a37f1f92ec77dc96ada8 /services | |
parent | 4910bb1c785d7ec748f185f902ddd750dcb9dfcb (diff) | |
download | frameworks_base-32265aeedd523b5568e948f918d1c689ef92d82e.zip frameworks_base-32265aeedd523b5568e948f918d1c689ef92d82e.tar.gz frameworks_base-32265aeedd523b5568e948f918d1c689ef92d82e.tar.bz2 |
pm: resolver: Don't hold the lock when calling into the resolver
This lock isn't really needed because the proxy will return
false if the resolver package doesn't exist or throws a
remote exception.
Having this lock causes a deadlock between the PM and the app:
resolveIntent holds the PackageManagerService#mPackages lock and
then tries to lock on PackageMonitor#mLock.
Meanwhile, when packages change, LaodedApk holds onto the
PackageMonitor#mLock and then tries to query the intent services and
tries to lock on PackageManagerService#mPackages.
Relevant traces below:
"Binder_4" prio=5 tid=60 Blocked
| group="main" sCount=1 dsCount=0 obj=0x136f00a0 self=0x7f743d2a00
| sysTid=949 nice=0 cgrp=default sched=0/0 handle=0x7f74b93440
| state=S schedstat=( 1032333944 663457790 2968 ) utm=74 stm=29 core=3 HZ=100
| stack=0x7f74a97000-0x7f74a99000 stackSize=1013KB
| held mutexes=
at com.android.server.ServiceWatcher.getBinder(ServiceWatcher.java:368)
- waiting to lock <0x083e77c9> (a java.lang.Object) held by thread 9
at org.cyanogenmod.platform.internal.AppSuggestProviderProxy.getService(AppSuggestProviderProxy.java:68)
at org.cyanogenmod.platform.internal.AppSuggestProviderProxy.handles(AppSuggestProviderProxy.java:73)
at org.cyanogenmod.platform.internal.AppSuggestManagerService$1.handles(AppSuggestManagerService.java:50)
at cyanogenmod.app.suggest.AppSuggestManager.handles(AppSuggestManager.java:101)
at com.android.server.pm.PackageManagerService.shouldIncludeResolveActivity(PackageManagerService.java:4704)
- locked <0x0183dd64> (a android.util.ArrayMap)
at com.android.server.pm.PackageManagerService.chooseBestActivity(PackageManagerService.java:4430)
at com.android.server.pm.PackageManagerService.resolveIntent(PackageManagerService.java:4353)
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:628)
at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:2754)
at android.os.Binder.execTransact(Binder.java:453)
"android.bg" prio=5 tid=9 Blocked
| group="main" sCount=1 dsCount=0 obj=0x12c04b80 self=0x7f84a7d800
| sysTid=766 nice=10 cgrp=bg_non_interactive sched=0/0 handle=0x7f89b3f440
| state=S schedstat=( 1237112536 3291977271 2848 ) utm=62 stm=61 core=2 HZ=100
| stack=0x7f89a3d000-0x7f89a3f000 stackSize=1037KB
| held mutexes=
at com.android.server.pm.PackageManagerService.queryIntentServices(PackageManagerService.java:5405)
- waiting to lock <0x0183dd64> (a android.util.ArrayMap) held by thread 60
at android.app.ApplicationPackageManager.queryIntentServicesAsUser(ApplicationPackageManager.java:731)
at com.android.server.ServiceWatcher.bindBestPackageLocked(ServiceWatcher.java:167)
at com.android.server.ServiceWatcher.-wrap0(ServiceWatcher.java:-1)
at com.android.server.ServiceWatcher$1.onPackageChanged(ServiceWatcher.java:321)
- locked <0x083e77c9> (a java.lang.Object)
at com.android.internal.content.PackageMonitor.onReceive(PackageMonitor.java:352)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:882)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
Change-Id: Id4775ca4d12b6cf42bea97bd74e4c38d591a1cf3
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a068008..02f8bbc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4734,11 +4734,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (!mSystemReady || mOnlyCore) { return false; } - synchronized(mPackages) { - AppSuggestManager suggest = AppSuggestManager.getInstance(mContext); - return mResolverReplaced && (suggest.getService() != null) ? - suggest.handles(intent) : false; - } + + AppSuggestManager suggest = AppSuggestManager.getInstance(mContext); + return mResolverReplaced && (suggest.getService() != null) ? + suggest.handles(intent) : false; } @Override |