Loading services/core/java/com/android/server/am/ActiveServices.java +32 −27 Original line number Diff line number Diff line Loading @@ -112,7 +112,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.procstats.ServiceState; import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.TransferPipe; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastPrintWriter; Loading Loading @@ -1069,10 +1068,13 @@ public final class ActiveServices { stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); } r.callStart = false; FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, r.appInfo.uid, r.name.getPackageName(), r.name.getClassName(), FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__START); mAm.mBatteryStatsService.noteServiceStartRunning(r.stats); final int uid = r.appInfo.uid; final String packageName = r.name.getPackageName(); final String serviceName = r.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__START); mAm.mBatteryStatsService.noteServiceStartRunning(uid, packageName, serviceName); String error = bringUpServiceLocked(r, service.getFlags(), callerFg, false, false, false); if (error != null) { return new ComponentName("!!", error); Loading Loading @@ -1108,10 +1110,13 @@ public final class ActiveServices { service.delayedStop = true; return; } FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, service.appInfo.uid, service.name.getPackageName(), service.name.getClassName(), FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(service.stats); final int uid = service.appInfo.uid; final String packageName = service.name.getPackageName(); final String serviceName = service.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); service.startRequested = false; if (service.tracker != null) { service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), Loading Loading @@ -1267,10 +1272,12 @@ public final class ActiveServices { } } FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, r.appInfo.uid, r.name.getPackageName(), r.name.getClassName(), FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(r.stats); final int uid = r.appInfo.uid; final String packageName = r.name.getPackageName(); final String serviceName = r.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); r.startRequested = false; if (r.tracker != null) { r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), Loading Loading @@ -2876,15 +2883,7 @@ public final class ActiveServices { final Intent.FilterComparison filter = new Intent.FilterComparison(service.cloneFilter()); final ServiceRestarter res = new ServiceRestarter(); final BatteryStatsImpl.Uid.Pkg.Serv ss; final BatteryStatsImpl stats = mAm.mBatteryStatsService.getActiveStatistics(); synchronized (stats) { ss = stats.getServiceStatsLocked( sInfo.applicationInfo.uid, name.getPackageName(), name.getClassName(), SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); } r = new ServiceRecord(mAm, ss, className, name, definingPackageName, r = new ServiceRecord(mAm, className, name, definingPackageName, definingUid, filter, sInfo, callingFromFg, res); r.mRecentCallingPackage = callingPackage; res.setService(r); Loading Loading @@ -3428,9 +3427,13 @@ public final class ActiveServices { EventLogTags.writeAmCreateService( r.userId, System.identityHashCode(r), nameTerm, r.app.uid, r.app.pid); } FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_LAUNCH_REPORTED, r.appInfo.uid, r.name.getPackageName(), r.name.getClassName()); mAm.mBatteryStatsService.noteServiceStartLaunch(r.stats); final int uid = r.appInfo.uid; final String packageName = r.name.getPackageName(); final String serviceName = r.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_LAUNCH_REPORTED, uid, packageName, serviceName); mAm.mBatteryStatsService.noteServiceStartLaunch(uid, packageName, serviceName); mAm.notifyPackageUse(r.serviceInfo.packageName, PackageManager.NOTIFY_PACKAGE_USE_SERVICE); app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE); Loading Loading @@ -3777,7 +3780,8 @@ public final class ActiveServices { smap.mDelayedStartList.remove(r); if (r.app != null) { mAm.mBatteryStatsService.noteServiceStopLaunch(r.stats); mAm.mBatteryStatsService.noteServiceStopLaunch(r.appInfo.uid, r.name.getPackageName(), r.name.getClassName()); r.app.stopService(r); r.app.updateBoundClientUids(); if (r.whitelistManager) { Loading Loading @@ -4323,7 +4327,8 @@ public final class ActiveServices { // Clear app state from services. for (int i = app.numberOfRunningServices() - 1; i >= 0; i--) { ServiceRecord sr = app.getRunningServiceAt(i); mAm.mBatteryStatsService.noteServiceStopLaunch(sr.stats); mAm.mBatteryStatsService.noteServiceStopLaunch(sr.appInfo.uid, sr.name.getPackageName(), sr.name.getClassName()); if (sr.app != app && sr.app != null && !sr.app.isPersistent()) { sr.app.stopService(sr); sr.app.updateBoundClientUids(); Loading services/core/java/com/android/server/am/BatteryStatsService.java +16 −4 Original line number Diff line number Diff line Loading @@ -2498,44 +2498,56 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } void noteServiceStartRunning(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStartRunning(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.startRunningLocked(uptime); } }); } } void noteServiceStopRunning(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStopRunning(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.stopRunningLocked(uptime); } }); } } void noteServiceStartLaunch(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStartLaunch(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.startLaunchedLocked(uptime); } }); } } void noteServiceStopLaunch(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStopLaunch(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.stopLaunchedLocked(uptime); } }); Loading services/core/java/com/android/server/am/ServiceRecord.java +1 −5 Original line number Diff line number Diff line Loading @@ -46,7 +46,6 @@ import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.procstats.ServiceState; import com.android.internal.os.BatteryStatsImpl; import com.android.server.LocalServices; import com.android.server.notification.NotificationManagerInternal; import com.android.server.uri.NeededUriGrants; Loading @@ -70,7 +69,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN static final int MAX_DONE_EXECUTING_COUNT = 6; final ActivityManagerService ams; final BatteryStatsImpl.Uid.Pkg.Serv stats; final ComponentName name; // service component. final ComponentName instanceName; // service component's per-instance name. final String shortInstanceName; // instanceName.flattenToShortString(). Loading Loading @@ -518,13 +516,11 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN } } ServiceRecord(ActivityManagerService ams, BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, ServiceRecord(ActivityManagerService ams, ComponentName name, ComponentName instanceName, String definingPackageName, int definingUid, Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, Runnable restarter) { this.ams = ams; this.stats = servStats; this.name = name; this.instanceName = instanceName; shortInstanceName = instanceName.flattenToShortString(); Loading services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +3 −3 Original line number Diff line number Diff line Loading @@ -1655,7 +1655,7 @@ public class MockingOomAdjusterTests { sService.mConstants.KEEP_WARMING_SERVICES.clear(); final ServiceInfo si = mock(ServiceInfo.class); si.applicationInfo = mock(ApplicationInfo.class); ServiceRecord s = spy(new ServiceRecord(sService, null, cn, cn, null, 0, null, ServiceRecord s = spy(new ServiceRecord(sService, cn, cn, null, 0, null, si, false, null)); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections(); s.startRequested = true; Loading @@ -1668,7 +1668,7 @@ public class MockingOomAdjusterTests { final ServiceInfo si2 = mock(ServiceInfo.class); si2.applicationInfo = mock(ApplicationInfo.class); si2.applicationInfo.uid = MOCKAPP2_UID_OTHER; ServiceRecord s2 = spy(new ServiceRecord(sService, null, cn2, cn2, null, 0, null, ServiceRecord s2 = spy(new ServiceRecord(sService, cn2, cn2, null, 0, null, si2, false, null)); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s2).getConnections(); s2.startRequested = true; Loading Loading @@ -1708,7 +1708,7 @@ public class MockingOomAdjusterTests { app.hasShownUi = true; sService.mConstants.KEEP_WARMING_SERVICES.add(cn); sService.mConstants.KEEP_WARMING_SERVICES.add(cn2); s = spy(new ServiceRecord(sService, null, cn, cn, null, 0, null, s = spy(new ServiceRecord(sService, cn, cn, null, 0, null, si, false, null)); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections(); s.startRequested = true; Loading Loading
services/core/java/com/android/server/am/ActiveServices.java +32 −27 Original line number Diff line number Diff line Loading @@ -112,7 +112,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.procstats.ServiceState; import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.TransferPipe; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastPrintWriter; Loading Loading @@ -1069,10 +1068,13 @@ public final class ActiveServices { stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); } r.callStart = false; FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, r.appInfo.uid, r.name.getPackageName(), r.name.getClassName(), FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__START); mAm.mBatteryStatsService.noteServiceStartRunning(r.stats); final int uid = r.appInfo.uid; final String packageName = r.name.getPackageName(); final String serviceName = r.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__START); mAm.mBatteryStatsService.noteServiceStartRunning(uid, packageName, serviceName); String error = bringUpServiceLocked(r, service.getFlags(), callerFg, false, false, false); if (error != null) { return new ComponentName("!!", error); Loading Loading @@ -1108,10 +1110,13 @@ public final class ActiveServices { service.delayedStop = true; return; } FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, service.appInfo.uid, service.name.getPackageName(), service.name.getClassName(), FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(service.stats); final int uid = service.appInfo.uid; final String packageName = service.name.getPackageName(); final String serviceName = service.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); service.startRequested = false; if (service.tracker != null) { service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), Loading Loading @@ -1267,10 +1272,12 @@ public final class ActiveServices { } } FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, r.appInfo.uid, r.name.getPackageName(), r.name.getClassName(), FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(r.stats); final int uid = r.appInfo.uid; final String packageName = r.name.getPackageName(); final String serviceName = r.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); r.startRequested = false; if (r.tracker != null) { r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), Loading Loading @@ -2876,15 +2883,7 @@ public final class ActiveServices { final Intent.FilterComparison filter = new Intent.FilterComparison(service.cloneFilter()); final ServiceRestarter res = new ServiceRestarter(); final BatteryStatsImpl.Uid.Pkg.Serv ss; final BatteryStatsImpl stats = mAm.mBatteryStatsService.getActiveStatistics(); synchronized (stats) { ss = stats.getServiceStatsLocked( sInfo.applicationInfo.uid, name.getPackageName(), name.getClassName(), SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); } r = new ServiceRecord(mAm, ss, className, name, definingPackageName, r = new ServiceRecord(mAm, className, name, definingPackageName, definingUid, filter, sInfo, callingFromFg, res); r.mRecentCallingPackage = callingPackage; res.setService(r); Loading Loading @@ -3428,9 +3427,13 @@ public final class ActiveServices { EventLogTags.writeAmCreateService( r.userId, System.identityHashCode(r), nameTerm, r.app.uid, r.app.pid); } FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_LAUNCH_REPORTED, r.appInfo.uid, r.name.getPackageName(), r.name.getClassName()); mAm.mBatteryStatsService.noteServiceStartLaunch(r.stats); final int uid = r.appInfo.uid; final String packageName = r.name.getPackageName(); final String serviceName = r.name.getClassName(); FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_LAUNCH_REPORTED, uid, packageName, serviceName); mAm.mBatteryStatsService.noteServiceStartLaunch(uid, packageName, serviceName); mAm.notifyPackageUse(r.serviceInfo.packageName, PackageManager.NOTIFY_PACKAGE_USE_SERVICE); app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE); Loading Loading @@ -3777,7 +3780,8 @@ public final class ActiveServices { smap.mDelayedStartList.remove(r); if (r.app != null) { mAm.mBatteryStatsService.noteServiceStopLaunch(r.stats); mAm.mBatteryStatsService.noteServiceStopLaunch(r.appInfo.uid, r.name.getPackageName(), r.name.getClassName()); r.app.stopService(r); r.app.updateBoundClientUids(); if (r.whitelistManager) { Loading Loading @@ -4323,7 +4327,8 @@ public final class ActiveServices { // Clear app state from services. for (int i = app.numberOfRunningServices() - 1; i >= 0; i--) { ServiceRecord sr = app.getRunningServiceAt(i); mAm.mBatteryStatsService.noteServiceStopLaunch(sr.stats); mAm.mBatteryStatsService.noteServiceStopLaunch(sr.appInfo.uid, sr.name.getPackageName(), sr.name.getClassName()); if (sr.app != app && sr.app != null && !sr.app.isPersistent()) { sr.app.stopService(sr); sr.app.updateBoundClientUids(); Loading
services/core/java/com/android/server/am/BatteryStatsService.java +16 −4 Original line number Diff line number Diff line Loading @@ -2498,44 +2498,56 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } void noteServiceStartRunning(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStartRunning(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.startRunningLocked(uptime); } }); } } void noteServiceStopRunning(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStopRunning(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.stopRunningLocked(uptime); } }); } } void noteServiceStartLaunch(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStartLaunch(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.startLaunchedLocked(uptime); } }); } } void noteServiceStopLaunch(final BatteryStatsImpl.Uid.Pkg.Serv stats) { void noteServiceStopLaunch(int uid, String pkg, String name) { synchronized (mLock) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, pkg, name, elapsedRealtime, uptime); stats.stopLaunchedLocked(uptime); } }); Loading
services/core/java/com/android/server/am/ServiceRecord.java +1 −5 Original line number Diff line number Diff line Loading @@ -46,7 +46,6 @@ import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.procstats.ServiceState; import com.android.internal.os.BatteryStatsImpl; import com.android.server.LocalServices; import com.android.server.notification.NotificationManagerInternal; import com.android.server.uri.NeededUriGrants; Loading @@ -70,7 +69,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN static final int MAX_DONE_EXECUTING_COUNT = 6; final ActivityManagerService ams; final BatteryStatsImpl.Uid.Pkg.Serv stats; final ComponentName name; // service component. final ComponentName instanceName; // service component's per-instance name. final String shortInstanceName; // instanceName.flattenToShortString(). Loading Loading @@ -518,13 +516,11 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN } } ServiceRecord(ActivityManagerService ams, BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, ServiceRecord(ActivityManagerService ams, ComponentName name, ComponentName instanceName, String definingPackageName, int definingUid, Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, Runnable restarter) { this.ams = ams; this.stats = servStats; this.name = name; this.instanceName = instanceName; shortInstanceName = instanceName.flattenToShortString(); Loading
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +3 −3 Original line number Diff line number Diff line Loading @@ -1655,7 +1655,7 @@ public class MockingOomAdjusterTests { sService.mConstants.KEEP_WARMING_SERVICES.clear(); final ServiceInfo si = mock(ServiceInfo.class); si.applicationInfo = mock(ApplicationInfo.class); ServiceRecord s = spy(new ServiceRecord(sService, null, cn, cn, null, 0, null, ServiceRecord s = spy(new ServiceRecord(sService, cn, cn, null, 0, null, si, false, null)); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections(); s.startRequested = true; Loading @@ -1668,7 +1668,7 @@ public class MockingOomAdjusterTests { final ServiceInfo si2 = mock(ServiceInfo.class); si2.applicationInfo = mock(ApplicationInfo.class); si2.applicationInfo.uid = MOCKAPP2_UID_OTHER; ServiceRecord s2 = spy(new ServiceRecord(sService, null, cn2, cn2, null, 0, null, ServiceRecord s2 = spy(new ServiceRecord(sService, cn2, cn2, null, 0, null, si2, false, null)); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s2).getConnections(); s2.startRequested = true; Loading Loading @@ -1708,7 +1708,7 @@ public class MockingOomAdjusterTests { app.hasShownUi = true; sService.mConstants.KEEP_WARMING_SERVICES.add(cn); sService.mConstants.KEEP_WARMING_SERVICES.add(cn2); s = spy(new ServiceRecord(sService, null, cn, cn, null, 0, null, s = spy(new ServiceRecord(sService, cn, cn, null, 0, null, si, false, null)); doReturn(new ArrayMap<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections(); s.startRequested = true; Loading