diff options
author | 2020-03-20 17:56:07 +0000 | |
---|---|---|
committer | 2020-03-20 17:56:07 +0000 | |
commit | 32d9a6bbcc010b1df2d288864ddb4aeaf37c0f0c (patch) | |
tree | 4d61dad847f99f0ed254617f253277b83a3bec2d | |
parent | f728cd324a6787f8b59e027351b2a15d71767e0b (diff) | |
parent | cf66b50ca6d2c6fdb693a5bc79cc5207f8b2ec97 (diff) |
Merge "Put two way binder calls on new thread" into rvc-dev
-rw-r--r-- | apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java | 115 |
1 files changed, 92 insertions, 23 deletions
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index c4f1531dfcdf..aad51124c8d2 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -38,6 +38,7 @@ import android.os.IStatsCompanionService; import android.os.IStatsd; import android.os.Looper; import android.os.ParcelFileDescriptor; +import android.os.PowerManager; import android.os.RemoteException; import android.os.StatsFrameworkInitializer; import android.os.SystemClock; @@ -99,9 +100,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private static IStatsd sStatsd; private static final Object sStatsdLock = new Object(); - private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener(); - private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener(); - private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener(); + private final OnAlarmListener mAnomalyAlarmListener; + private final OnAlarmListener mPullingAlarmListener; + private final OnAlarmListener mPeriodicAlarmListener; private StatsManagerService mStatsManagerService; @@ -120,6 +121,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { handlerThread.start(); mHandler = new CompanionHandler(handlerThread.getLooper()); + mAnomalyAlarmListener = new AnomalyAlarmListener(context); + mPullingAlarmListener = new PullingAlarmListener(context); + mPeriodicAlarmListener = new PeriodicAlarmListener(context); } private final static int[] toIntArray(List<Integer> list) { @@ -232,6 +236,31 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { }); } + private static class WakelockThread extends Thread { + private final PowerManager.WakeLock mWl; + private final Runnable mRunnable; + + WakelockThread(Context context, String wakelockName, Runnable runnable) { + PowerManager powerManager = (PowerManager) + context.getSystemService(Context.POWER_SERVICE); + mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName); + mRunnable = runnable; + } + @Override + public void run() { + try { + mRunnable.run(); + } finally { + mWl.release(); + } + } + @Override + public void start() { + mWl.acquire(); + super.start(); + } + } + private final static class AppUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { @@ -307,6 +336,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } public static final class AnomalyAlarmListener implements OnAlarmListener { + private final Context mContext; + + AnomalyAlarmListener(Context context) { + mContext = context; + } + @Override public void onAlarm() { if (DEBUG) { @@ -318,17 +353,30 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { Log.w(TAG, "Could not access statsd to inform it of anomaly alarm firing"); return; } - try { - // Two-way call to statsd to retain AlarmManager wakelock - statsd.informAnomalyAlarmFired(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e); - } - // AlarmManager releases its own wakelock here. + + // Wakelock needs to be retained while calling statsd. + Thread thread = new WakelockThread(mContext, + AnomalyAlarmListener.class.getCanonicalName(), new Runnable() { + @Override + public void run() { + try { + statsd.informAnomalyAlarmFired(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e); + } + } + }); + thread.start(); } } public final static class PullingAlarmListener implements OnAlarmListener { + private final Context mContext; + + PullingAlarmListener(Context context) { + mContext = context; + } + @Override public void onAlarm() { if (DEBUG) { @@ -339,16 +387,30 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { Log.w(TAG, "Could not access statsd to inform it of pulling alarm firing."); return; } - try { - // Two-way call to statsd to retain AlarmManager wakelock - statsd.informPollAlarmFired(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e); - } + + // Wakelock needs to be retained while calling statsd. + Thread thread = new WakelockThread(mContext, + PullingAlarmListener.class.getCanonicalName(), new Runnable() { + @Override + public void run() { + try { + statsd.informPollAlarmFired(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e); + } + } + }); + thread.start(); } } public final static class PeriodicAlarmListener implements OnAlarmListener { + private final Context mContext; + + PeriodicAlarmListener(Context context) { + mContext = context; + } + @Override public void onAlarm() { if (DEBUG) { @@ -359,13 +421,20 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { Log.w(TAG, "Could not access statsd to inform it of periodic alarm firing."); return; } - try { - // Two-way call to statsd to retain AlarmManager wakelock - statsd.informAlarmForSubscriberTriggeringFired(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e); - } - // AlarmManager releases its own wakelock here. + + // Wakelock needs to be retained while calling statsd. + Thread thread = new WakelockThread(mContext, + PeriodicAlarmListener.class.getCanonicalName(), new Runnable() { + @Override + public void run() { + try { + statsd.informAlarmForSubscriberTriggeringFired(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e); + } + } + }); + thread.start(); } } |