Move ServiceConnector job timeouts to the job handler thread

Prior to this change, the response timeout was assigned via `orTimeout`
to the AndroidFuture, which has the default behavior of creating a
timeout task assigned to the main Looper (the application thread).
Callers that consumed the returned Future via a blocking call like
`Future.get()` would prevent the timeout from firing, leading to a block
in the main application thread.

This change explicitly sets the timeout handler to the job handler,
where the completion tasks of all jobs are handled.

Bug: 281589918
Test: Reproduced issue on aosp_cf_riscv64_phone (happens reliably due to
service bind failure) and confirmed that patch now successfully fires
the timeout and recovers.

Change-Id: Iee6736554904eaf59c22cdd252e0e1f8730b0643
This commit is contained in:
Prashanth Swaminathan
2023-06-16 18:28:49 -07:00
parent f4c1b063bf
commit d29c3758bb

View File

@@ -745,6 +745,10 @@ public interface ServiceConnector<I extends IInterface> {
boolean mAsync = false;
private String mDebugName;
{
// The timeout handler must be set before any calls to set timeouts on the
// AndroidFuture, to ensure they are posted on the proper thread.
setTimeoutHandler(getJobHandler());
long requestTimeout = getRequestTimeoutMs();
if (requestTimeout > 0) {
orTimeout(requestTimeout, TimeUnit.MILLISECONDS);