summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/print/java/com/android/server/print/RemotePrintSpooler.java134
1 files changed, 65 insertions, 69 deletions
diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java
index 6b919df290bb..f4c9c86fda2a 100644
--- a/services/print/java/com/android/server/print/RemotePrintSpooler.java
+++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java
@@ -43,6 +43,7 @@ import android.printservice.PrintService;
import android.util.Slog;
import android.util.TimedRemoteCaller;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.TransferPipe;
import libcore.io.IoUtils;
@@ -112,6 +113,10 @@ final class RemotePrintSpooler {
private boolean mCanUnbind;
+ /** Whether a thread is currently trying to {@link #bindLocked() bind to the print service} */
+ @GuardedBy("mLock")
+ private boolean mIsBinding;
+
public static interface PrintSpoolerCallbacks {
public void onPrintJobQueued(PrintJobInfo printJob);
public void onAllPrintJobsForServiceHandled(ComponentName printService);
@@ -164,10 +169,8 @@ final class RemotePrintSpooler {
try {
return mGetPrintJobInfosCaller.getPrintJobInfos(getRemoteInstanceLazy(),
componentName, state, appId);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error getting print jobs.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error getting print jobs.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error getting print jobs.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] getPrintJobInfos()");
@@ -188,10 +191,8 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().createPrintJob(printJob);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error creating print job.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error creating print job.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error creating print job.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] createPrintJob()");
@@ -211,10 +212,8 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().writePrintJobData(fd, printJobId);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error writing print job data.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error writing print job data.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error writing print job data.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] writePrintJobData()");
@@ -238,10 +237,8 @@ final class RemotePrintSpooler {
try {
return mGetPrintJobInfoCaller.getPrintJobInfo(getRemoteInstanceLazy(),
printJobId, appId);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error getting print job info.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error getting print job info.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error getting print job info.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] getPrintJobInfo()");
@@ -263,10 +260,8 @@ final class RemotePrintSpooler {
try {
return mSetPrintJobStatusCaller.setPrintJobState(getRemoteInstanceLazy(),
printJobId, state, error);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error setting print job state.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error setting print job state.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error setting print job state.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] setPrintJobState()");
@@ -294,7 +289,7 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().setProgress(printJobId, progress);
- } catch (RemoteException|TimeoutException re) {
+ } catch (RemoteException | TimeoutException | InterruptedException re) {
Slog.e(LOG_TAG, "Error setting progress.", re);
} finally {
if (DEBUG) {
@@ -321,8 +316,8 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().setStatus(printJobId, status);
- } catch (RemoteException|TimeoutException re) {
- Slog.e(LOG_TAG, "Error setting status.", re);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error setting status.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] setStatus()");
@@ -350,8 +345,8 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().setStatusRes(printJobId, status, appPackageName);
- } catch (RemoteException|TimeoutException re) {
- Slog.e(LOG_TAG, "Error setting status.", re);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error setting status.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] setStatus()");
@@ -380,7 +375,7 @@ final class RemotePrintSpooler {
try {
mCustomPrinterIconLoadedCaller.onCustomPrinterIconLoaded(getRemoteInstanceLazy(),
printerId, icon);
- } catch (RemoteException|TimeoutException re) {
+ } catch (RemoteException | TimeoutException | InterruptedException re) {
Slog.e(LOG_TAG, "Error loading new custom printer icon.", re);
} finally {
if (DEBUG) {
@@ -412,8 +407,8 @@ final class RemotePrintSpooler {
try {
return mGetCustomPrinterIconCaller.getCustomPrinterIcon(getRemoteInstanceLazy(),
printerId);
- } catch (RemoteException|TimeoutException re) {
- Slog.e(LOG_TAG, "Error getting custom printer icon.", re);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error getting custom printer icon.", e);
return null;
} finally {
if (DEBUG) {
@@ -438,8 +433,8 @@ final class RemotePrintSpooler {
}
try {
mClearCustomPrinterIconCache.clearCustomPrinterIconCache(getRemoteInstanceLazy());
- } catch (RemoteException|TimeoutException re) {
- Slog.e(LOG_TAG, "Error clearing custom printer icon cache.", re);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error clearing custom printer icon cache.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG,
@@ -462,10 +457,8 @@ final class RemotePrintSpooler {
try {
return mSetPrintJobTagCaller.setPrintJobTag(getRemoteInstanceLazy(),
printJobId, tag);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error setting print job tag.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error setting print job tag.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error setting print job tag.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] setPrintJobTag()");
@@ -487,10 +480,8 @@ final class RemotePrintSpooler {
try {
getRemoteInstanceLazy().setPrintJobCancelling(printJobId,
cancelling);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error setting print job cancelling.", re);
- } catch (TimeoutException te) {
- Slog.e(LOG_TAG, "Error setting print job cancelling.", te);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error setting print job cancelling.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier()
@@ -516,8 +507,8 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().pruneApprovedPrintServices(servicesToKeep);
- } catch (RemoteException|TimeoutException re) {
- Slog.e(LOG_TAG, "Error pruning approved print services.", re);
+ } catch (RemoteException | TimeoutException | InterruptedException e) {
+ Slog.e(LOG_TAG, "Error pruning approved print services.", e);
} finally {
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier()
@@ -538,9 +529,7 @@ final class RemotePrintSpooler {
}
try {
getRemoteInstanceLazy().removeObsoletePrintJobs();
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error removing obsolete print jobs .", re);
- } catch (TimeoutException te) {
+ } catch (RemoteException | TimeoutException | InterruptedException te) {
Slog.e(LOG_TAG, "Error removing obsolete print jobs .", te);
} finally {
if (DEBUG) {
@@ -578,7 +567,7 @@ final class RemotePrintSpooler {
try {
TransferPipe.dumpAsync(getRemoteInstanceLazy().asBinder(), fd,
new String[] { prefix });
- } catch (IOException | TimeoutException | RemoteException e) {
+ } catch (IOException | TimeoutException | RemoteException | InterruptedException e) {
pw.println("Failed to dump remote instance: " + e);
}
}
@@ -595,7 +584,7 @@ final class RemotePrintSpooler {
mCallbacks.onPrintJobStateChanged(printJob);
}
- private IPrintSpooler getRemoteInstanceLazy() throws TimeoutException {
+ private IPrintSpooler getRemoteInstanceLazy() throws TimeoutException, InterruptedException {
synchronized (mLock) {
if (mRemoteInstance != null) {
return mRemoteInstance;
@@ -605,43 +594,50 @@ final class RemotePrintSpooler {
}
}
- private void bindLocked() throws TimeoutException {
+ private void bindLocked() throws TimeoutException, InterruptedException {
+ while (mIsBinding) {
+ mLock.wait();
+ }
+
if (mRemoteInstance != null) {
return;
}
+
+ mIsBinding = true;
+
if (DEBUG) {
Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] bindLocked() " +
(mIsLowPriority ? "low priority" : ""));
}
- int flags;
- if (mIsLowPriority) {
- flags = Context.BIND_AUTO_CREATE;
- } else {
- flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE;
- }
+ try {
+ int flags;
+ if (mIsLowPriority) {
+ flags = Context.BIND_AUTO_CREATE;
+ } else {
+ flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE;
+ }
- mContext.bindServiceAsUser(mIntent, mServiceConnection, flags, mUserHandle);
+ mContext.bindServiceAsUser(mIntent, mServiceConnection, flags, mUserHandle);
- final long startMillis = SystemClock.uptimeMillis();
- while (true) {
- if (mRemoteInstance != null) {
- break;
- }
- final long elapsedMillis = SystemClock.uptimeMillis() - startMillis;
- final long remainingMillis = BIND_SPOOLER_SERVICE_TIMEOUT - elapsedMillis;
- if (remainingMillis <= 0) {
- throw new TimeoutException("Cannot get spooler!");
- }
- try {
+ final long startMillis = SystemClock.uptimeMillis();
+ while (true) {
+ if (mRemoteInstance != null) {
+ break;
+ }
+ final long elapsedMillis = SystemClock.uptimeMillis() - startMillis;
+ final long remainingMillis = BIND_SPOOLER_SERVICE_TIMEOUT - elapsedMillis;
+ if (remainingMillis <= 0) {
+ throw new TimeoutException("Cannot get spooler!");
+ }
mLock.wait(remainingMillis);
- } catch (InterruptedException ie) {
- /* ignore */
}
- }
- mCanUnbind = true;
- mLock.notifyAll();
+ mCanUnbind = true;
+ } finally {
+ mIsBinding = false;
+ mLock.notifyAll();
+ }
}
private void unbindLocked() {