Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8880561 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

When system server goes down, crash apps more.

Similar to first patch, but now using new "rethrowFromSystemServer()"
method which internally translates DeadObjectException into
DeadSystemException.  New logic over in Log.printlns() now
suppresses the DeadSystemException stack traces, since they're
misleading and just added pressure to the precious log buffer space.

Add some extra RuntimeInit checks to suppress logging-about-logging
when the system server is dead.

Bug: 27364859
Change-Id: I05316b3e8e42416b30a56a76c09cd3113a018123
parent 2362bdf2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -28471,6 +28471,10 @@ package android.os {
    ctor public DeadObjectException(java.lang.String);
  }
  public class DeadSystemException extends android.os.DeadObjectException {
    ctor public DeadSystemException();
  }
  public final class Debug {
    method public static deprecated void changeDebugPort(int);
    method public static void dumpHprofData(java.lang.String) throws java.io.IOException;
+4 −0
Original line number Diff line number Diff line
@@ -30773,6 +30773,10 @@ package android.os {
    ctor public DeadObjectException(java.lang.String);
  }
  public class DeadSystemException extends android.os.DeadObjectException {
    ctor public DeadSystemException();
  }
  public final class Debug {
    method public static deprecated void changeDebugPort(int);
    method public static void dumpHprofData(java.lang.String) throws java.io.IOException;
+4 −0
Original line number Diff line number Diff line
@@ -28480,6 +28480,10 @@ package android.os {
    ctor public DeadObjectException(java.lang.String);
  }
  public class DeadSystemException extends android.os.DeadObjectException {
    ctor public DeadSystemException();
  }
  public final class Debug {
    method public static deprecated void changeDebugPort(int);
    method public static void dumpHprofData(java.lang.String) throws java.io.IOException;
+25 −47
Original line number Diff line number Diff line
@@ -353,8 +353,7 @@ public class AccountManager {
        try {
            return mService.getPassword(account);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -382,8 +381,7 @@ public class AccountManager {
        try {
            return mService.getUserData(account, key);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -402,8 +400,7 @@ public class AccountManager {
        try {
            return mService.getAuthenticatorTypes(UserHandle.getCallingUserId());
        } catch (RemoteException e) {
            // will never happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -424,8 +421,7 @@ public class AccountManager {
        try {
            return mService.getAuthenticatorTypes(userId);
        } catch (RemoteException e) {
            // will never happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -449,8 +445,7 @@ public class AccountManager {
        try {
            return mService.getAccounts(null, mContext.getOpPackageName());
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -475,8 +470,7 @@ public class AccountManager {
        try {
            return mService.getAccountsAsUser(null, userId, mContext.getOpPackageName());
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -493,8 +487,7 @@ public class AccountManager {
        try {
            return mService.getAccountsForPackage(packageName, uid, mContext.getOpPackageName());
        } catch (RemoteException re) {
            // won't ever happen
            throw new RuntimeException(re);
            throw re.rethrowFromSystemServer();
        }
    }

@@ -512,8 +505,7 @@ public class AccountManager {
            return mService.getAccountsByTypeForPackage(type, packageName,
                    mContext.getOpPackageName());
        } catch (RemoteException re) {
            // won't ever happen
            throw new RuntimeException(re);
            throw re.rethrowFromSystemServer();
        }
    }

@@ -552,8 +544,7 @@ public class AccountManager {
            return mService.getAccountsAsUser(type, userHandle.getIdentifier(),
                    mContext.getOpPackageName());
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -572,8 +563,7 @@ public class AccountManager {
        try {
            mService.updateAppPermission(account, authTokenType, uid, value);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -742,8 +732,7 @@ public class AccountManager {
        try {
            return mService.addAccountExplicitly(account, password, userdata);
        } catch (RemoteException e) {
            // Can happen if there was a SecurityException was thrown.
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -768,7 +757,7 @@ public class AccountManager {
        try {
            return mService.accountAuthenticated(account);
        } catch (RemoteException e) {
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -836,8 +825,7 @@ public class AccountManager {
        try {
            return mService.getPreviousName(account);
        } catch (RemoteException e) {
            // will never happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1008,8 +996,7 @@ public class AccountManager {
        try {
            return mService.removeAccountExplicitly(account);
        } catch (RemoteException e) {
            // May happen if the caller doesn't match the signature of the authenticator.
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1036,8 +1023,7 @@ public class AccountManager {
                mService.invalidateAuthToken(accountType, authToken);
            }
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1068,8 +1054,7 @@ public class AccountManager {
        try {
            return mService.peekAuthToken(account, authTokenType);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1098,8 +1083,7 @@ public class AccountManager {
        try {
            mService.setPassword(account, password);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1127,8 +1111,7 @@ public class AccountManager {
        try {
            mService.clearPassword(account);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1156,8 +1139,7 @@ public class AccountManager {
        try {
            mService.setUserData(account, key, value);
        } catch (RemoteException e) {
            // Will happen if there is not signature match.
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1186,8 +1168,7 @@ public class AccountManager {
        try {
            mService.setAuthToken(account, authTokenType, authToken);
        } catch (RemoteException e) {
            // won't ever happen
            throw new RuntimeException(e);
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1588,7 +1569,7 @@ public class AccountManager {
            mService.addSharedAccountsFromParentUser(parentUser.getIdentifier(),
                    user.getIdentifier());
        } catch (RemoteException re) {
            throw new IllegalStateException(re);
            throw re.rethrowFromSystemServer();
        }
    }

@@ -1641,8 +1622,7 @@ public class AccountManager {
            boolean val = mService.removeSharedAccountAsUser(account, user.getIdentifier());
            return val;
        } catch (RemoteException re) {
            // won't ever happen
            throw new RuntimeException(re);
            throw re.rethrowFromSystemServer();
        }
    }

@@ -1655,8 +1635,7 @@ public class AccountManager {
        try {
            return mService.getSharedAccountsAsUser(user.getIdentifier());
        } catch (RemoteException re) {
            // won't ever happen
            throw new RuntimeException(re);
            throw re.rethrowFromSystemServer();
        }
    }

@@ -1878,7 +1857,7 @@ public class AccountManager {
        try {
            return mService.someUserHasAccount(account);
        } catch (RemoteException re) {
            throw new RuntimeException(re);
            throw re.rethrowFromSystemServer();
        }
    }

@@ -2039,8 +2018,7 @@ public class AccountManager {
                    try {
                        doWork();
                    } catch (RemoteException e) {
                        // this will only happen if the system process is dead, which means
                        // we will be dying ourselves
                        throw e.rethrowFromSystemServer();
                    }
                } else {
                    set(bundle);
+52 −52
Original line number Diff line number Diff line
@@ -716,7 +716,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getFrontActivityScreenCompatMode();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -725,7 +725,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().setFrontActivityScreenCompatMode(mode);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -734,7 +734,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getPackageScreenCompatMode(packageName);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -743,7 +743,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().setPackageScreenCompatMode(packageName, mode);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -752,7 +752,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getPackageAskScreenCompat(packageName);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -761,7 +761,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().setPackageAskScreenCompat(packageName, ask);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1046,7 +1046,7 @@ public class ActivityManager {
                    return ActivityManagerNative.getDefault().getTaskDescriptionIcon(iconFilename,
                            userId);
                } catch (RemoteException e) {
                    throw e.rethrowAsRuntimeException();
                    throw e.rethrowFromSystemServer();
                }
            }
            return null;
@@ -1427,7 +1427,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
                    flags, UserHandle.myUserId());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1452,7 +1452,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
                    flags, userId);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1587,7 +1587,7 @@ public class ActivityManager {
        try {
            appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
        int numAppTasks = appTasks.size();
        for (int i = 0; i < numAppTasks; i++) {
@@ -1612,7 +1612,7 @@ public class ActivityManager {
            try {
                mAppTaskThumbnailSize = ActivityManagerNative.getDefault().getAppTaskThumbnailSize();
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw e.rethrowFromSystemServer();
            }
        }
    }
@@ -1678,7 +1678,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().addAppTask(activity.getActivityToken(),
                    intent, description, thumbnail);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1720,7 +1720,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getTasks(maxNum, 0);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1736,7 +1736,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().removeTask(taskId);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1895,7 +1895,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getTaskThumbnail(id);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1904,7 +1904,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().isInHomeStack(taskId);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -1953,7 +1953,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().moveTaskToFront(taskId, flags, options);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2139,7 +2139,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault()
                    .getServices(maxNum, 0);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2154,7 +2154,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault()
                    .getRunningServiceControlPanel(service);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2258,7 +2258,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().getMemoryInfo(outInfo);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2377,7 +2377,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().clearApplicationUserData(packageName,
                    observer, UserHandle.myUserId());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2411,7 +2411,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().getGrantedUriPermissions(packageName,
                    UserHandle.myUserId());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2429,7 +2429,7 @@ public class ActivityManager {
            ActivityManagerNative.getDefault().clearGrantedUriPermissions(packageName,
                    UserHandle.myUserId());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2549,7 +2549,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getProcessesInErrorState();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2863,7 +2863,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getRunningExternalApplications();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2880,7 +2880,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().setProcessMemoryTrimLevel(process, userId,
                    level);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2898,7 +2898,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getRunningAppProcesses();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2917,7 +2917,7 @@ public class ActivityManager {
                    mContext.getOpPackageName());
            return RunningAppProcessInfo.procStateToImportance(procState);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2936,7 +2936,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().getMyMemoryState(outState);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2955,7 +2955,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getProcessMemoryInfo(pids);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -2989,7 +2989,7 @@ public class ActivityManager {
            ActivityManagerNative.getDefault().killBackgroundProcesses(packageName,
                    UserHandle.myUserId());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3006,7 +3006,7 @@ public class ActivityManager {
            ActivityManagerNative.getDefault().killUid(UserHandle.getAppId(uid),
                    UserHandle.getUserId(uid), reason);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3033,7 +3033,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3052,7 +3052,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getDeviceConfigurationInfo();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3142,7 +3142,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().isUserAMonkey();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3218,7 +3218,7 @@ public class ActivityManager {
            return AppGlobals.getPackageManager()
                    .checkUidPermission(permission, uid);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3228,7 +3228,7 @@ public class ActivityManager {
            return AppGlobals.getPackageManager()
                    .checkUidPermission(permission, uid);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3265,7 +3265,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().handleIncomingUser(callingPid,
                    callingUid, userId, allowAll, requireFull, name, callerPackage);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3280,7 +3280,7 @@ public class ActivityManager {
            ui = ActivityManagerNative.getDefault().getCurrentUser();
            return ui != null ? ui.id : 0;
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3292,7 +3292,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().switchUser(userid);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3316,7 +3316,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().isUserRunning(userId, 0);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3326,7 +3326,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().isUserRunning(userId,
                    ActivityManager.FLAG_AND_LOCKED);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3336,7 +3336,7 @@ public class ActivityManager {
            return ActivityManagerNative.getDefault().isUserRunning(userId,
                    ActivityManager.FLAG_AND_UNLOCKED);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3421,7 +3421,7 @@ public class ActivityManager {
            ActivityManagerNative.getDefault().setDumpHeapDebugLimit(null, 0, pssSize,
                    mContext.getPackageName());
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3440,7 +3440,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().setDumpHeapDebugLimit(null, 0, 0, null);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3451,7 +3451,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().startLockTaskMode(taskId);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3462,7 +3462,7 @@ public class ActivityManager {
        try {
            ActivityManagerNative.getDefault().stopLockTaskMode();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3489,7 +3489,7 @@ public class ActivityManager {
        try {
            return ActivityManagerNative.getDefault().getLockTaskModeState();
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
            throw e.rethrowFromSystemServer();
        }
    }

@@ -3512,7 +3512,7 @@ public class ActivityManager {
            try {
                mAppTaskImpl.finishAndRemoveTask();
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw e.rethrowFromSystemServer();
            }
        }

@@ -3525,7 +3525,7 @@ public class ActivityManager {
            try {
                return mAppTaskImpl.getTaskInfo();
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw e.rethrowFromSystemServer();
            }
        }

@@ -3539,7 +3539,7 @@ public class ActivityManager {
            try {
                mAppTaskImpl.moveToFront();
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw e.rethrowFromSystemServer();
            }
        }

@@ -3581,7 +3581,7 @@ public class ActivityManager {
            try {
                mAppTaskImpl.setExcludeFromRecents(exclude);
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw e.rethrowFromSystemServer();
            }
        }
    }
Loading