From 1335752da1867f64e332b3428a23460c789e9e18 Mon Sep 17 00:00:00 2001 From: virkumar Date: Thu, 27 Oct 2022 11:12:28 +0000 Subject: Get the default Executor from ImsStack when it first time used. Get the default Executor from ImsStack when it is first time used and and then cache the executor for subsequent calls. Test: atest CtsTelephonyTestCases:ImsCallingTest Bug: 255534392 Change-Id: Ia7fb7ccac023df7c765bb15bfba1ccb002120bf1 --- .../java/android/telephony/ims/ImsService.java | 32 ++++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java index f0401534fac4..e8642fef04f5 100644 --- a/telephony/java/android/telephony/ims/ImsService.java +++ b/telephony/java/android/telephony/ims/ImsService.java @@ -204,6 +204,7 @@ public class ImsService extends Service { private IImsServiceControllerListener mListener; private final Object mListenerLock = new Object(); + private final Object mExecutorLock = new Object(); private Executor mExecutor; /** @@ -214,10 +215,6 @@ public class ImsService extends Service { * vendor use Runnable::run. */ public ImsService() { - mExecutor = ImsService.this.getExecutor(); - if (mExecutor == null) { - mExecutor = Runnable::run; - } } /** @@ -356,7 +353,7 @@ public class ImsService extends Service { ImsConfigImplBase c = ImsService.this.getConfigForSubscription(slotId, subId); if (c != null) { - c.setDefaultExecutor(mExecutor); + c.setDefaultExecutor(getCachedExecutor()); return c.getIImsConfig(); } else { return null; @@ -370,7 +367,7 @@ public class ImsService extends Service { ImsRegistrationImplBase r = ImsService.this.getRegistrationForSubscription(slotId, subId); if (r != null) { - r.setDefaultExecutor(mExecutor); + r.setDefaultExecutor(getCachedExecutor()); return r.getBinder(); } else { return null; @@ -383,7 +380,7 @@ public class ImsService extends Service { return executeMethodAsyncForResult(() -> { SipTransportImplBase s = ImsService.this.getSipTransport(slotId); if (s != null) { - s.setDefaultExecutor(mExecutor); + s.setDefaultExecutor(getCachedExecutor()); return s.getBinder(); } else { return null; @@ -427,11 +424,21 @@ public class ImsService extends Service { return null; } + private Executor getCachedExecutor() { + synchronized (mExecutorLock) { + if (mExecutor == null) { + Executor e = ImsService.this.getExecutor(); + mExecutor = (e != null) ? e : Runnable::run; + } + return mExecutor; + } + } + private IImsMmTelFeature createMmTelFeatureInternal(int slotId, int subscriptionId) { MmTelFeature f = createMmTelFeatureForSubscription(slotId, subscriptionId); if (f != null) { setupFeature(f, slotId, ImsFeature.FEATURE_MMTEL); - f.setDefaultExecutor(mExecutor); + f.setDefaultExecutor(getCachedExecutor()); return f.getBinder(); } else { Log.e(LOG_TAG, "createMmTelFeatureInternal: null feature returned."); @@ -443,7 +450,7 @@ public class ImsService extends Service { MmTelFeature f = createEmergencyOnlyMmTelFeature(slotId); if (f != null) { setupFeature(f, slotId, ImsFeature.FEATURE_MMTEL); - f.setDefaultExecutor(mExecutor); + f.setDefaultExecutor(getCachedExecutor()); return f.getBinder(); } else { Log.e(LOG_TAG, "createEmergencyOnlyMmTelFeatureInternal: null feature returned."); @@ -454,7 +461,7 @@ public class ImsService extends Service { private IImsRcsFeature createRcsFeatureInternal(int slotId, int subI) { RcsFeature f = createRcsFeatureForSubscription(slotId, subI); if (f != null) { - f.setDefaultExecutor(mExecutor); + f.setDefaultExecutor(getCachedExecutor()); setupFeature(f, slotId, ImsFeature.FEATURE_RCS); return f.getBinder(); } else { @@ -609,7 +616,8 @@ public class ImsService extends Service { private void executeMethodAsync(Runnable r, String errorLogName) { try { CompletableFuture.runAsync( - () -> TelephonyUtils.runWithCleanCallingIdentity(r), mExecutor).join(); + () -> TelephonyUtils.runWithCleanCallingIdentity(r), + getCachedExecutor()).join(); } catch (CancellationException | CompletionException e) { Log.w(LOG_TAG, "ImsService Binder - " + errorLogName + " exception: " + e.getMessage()); @@ -618,7 +626,7 @@ public class ImsService extends Service { private T executeMethodAsyncForResult(Supplier r, String errorLogName) { CompletableFuture future = CompletableFuture.supplyAsync( - () -> TelephonyUtils.runWithCleanCallingIdentity(r), mExecutor); + () -> TelephonyUtils.runWithCleanCallingIdentity(r), getCachedExecutor()); try { return future.get(); } catch (ExecutionException | InterruptedException e) { -- cgit v1.2.3-59-g8ed1b