Hold no locks when calling RemotePrintSpooler

am: 1d6e7cc536

Change-Id: I9765689a63eb7a3426feee43b970aa0a9f2fb441
This commit is contained in:
Philip P. Moltmann
2016-08-29 23:26:32 +00:00
committed by android-build-merger
2 changed files with 14 additions and 7 deletions

View File

@@ -57,6 +57,9 @@ import java.util.concurrent.TimeoutException;
* spooler if needed, to make the timed remote calls, to handle
* remote exceptions, and to bind/unbind to the remote instance as
* needed.
*
* The calls might be blocking and need the main thread of to be unblocked to finish. Hence do not
* call this while holding any monitors that might need to be acquired the main thread.
*/
final class RemotePrintSpooler {

View File

@@ -434,12 +434,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
}
public void createPrinterDiscoverySession(@NonNull IPrinterDiscoveryObserver observer) {
mSpooler.clearCustomPrinterIconCache();
synchronized (mLock) {
throwIfDestroyedLocked();
if (mPrinterDiscoverySession == null) {
mSpooler.clearCustomPrinterIconCache();
// If we do not have a session, tell all service to create one.
mPrinterDiscoverySession = new PrinterDiscoverySessionMediator(mContext) {
@Override
@@ -731,6 +731,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
@Override
public void onCustomPrinterIconLoaded(PrinterId printerId, Icon icon) {
mSpooler.onCustomPrinterIconLoaded(printerId, icon);
synchronized (mLock) {
throwIfDestroyedLocked();
@@ -738,7 +740,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
if (mPrinterDiscoverySession == null) {
return;
}
mSpooler.onCustomPrinterIconLoaded(printerId, icon);
mPrinterDiscoverySession.onCustomPrinterIconLoadedLocked(printerId);
}
}
@@ -979,18 +980,21 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
* Prune persistent state if a print service was uninstalled
*/
public void prunePrintServices() {
ArrayList<ComponentName> installedComponents;
synchronized (mLock) {
ArrayList<ComponentName> installedComponents = getInstalledComponents();
installedComponents = getInstalledComponents();
// Remove unnecessary entries from persistent state "disabled services"
boolean disabledServicesUninstalled = mDisabledServices.retainAll(installedComponents);
if (disabledServicesUninstalled) {
writeDisabledPrintServicesLocked(mDisabledServices);
}
// Remove unnecessary entries from persistent state "approved services"
mSpooler.pruneApprovedPrintServices(installedComponents);
}
// Remove unnecessary entries from persistent state "approved services"
mSpooler.pruneApprovedPrintServices(installedComponents);
}
private void onConfigurationChangedLocked() {