Merge "Pause watchdog monitor for incfs native lib extraction" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-06-30 18:10:28 +00:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 16 deletions

View File

@@ -40,7 +40,6 @@ import android.os.incremental.IncrementalManager;
import android.os.incremental.IncrementalStorage;
import android.system.ErrnoException;
import android.system.Os;
import android.util.ArraySet;
import android.util.Slog;
import dalvik.system.CloseGuard;
@@ -551,18 +550,4 @@ public class NativeLibraryHelper {
}
return false;
}
/**
* Wait for all native library extraction to complete for the passed storages.
*
* @param incrementalStorages A list of the storages to wait for.
*/
public static void waitForNativeBinariesExtraction(
ArraySet<IncrementalStorage> incrementalStorages) {
for (int i = 0; i < incrementalStorages.size(); ++i) {
IncrementalStorage storage = incrementalStorages.valueAtUnchecked(i);
storage.waitForNativeBinariesExtraction();
}
}
}

View File

@@ -20111,7 +20111,28 @@ public class PackageManagerService extends IPackageManager.Stub
notifyPackageChangeObserversOnUpdate(reconciledPkg);
}
NativeLibraryHelper.waitForNativeBinariesExtraction(incrementalStorages);
waitForNativeBinariesExtraction(incrementalStorages);
}
static void waitForNativeBinariesExtraction(
ArraySet<IncrementalStorage> incrementalStorages) {
if (incrementalStorages.isEmpty()) {
return;
}
try {
// Native library extraction may take very long time: each page could potentially
// wait for either 10s or 100ms (adb vs non-adb data loader), and that easily adds
// up to a full watchdog timeout of 1 min, killing the system after that. It doesn't
// make much sense as blocking here doesn't lock up the framework, but only blocks
// the installation session and the following ones.
Watchdog.getInstance().pauseWatchingCurrentThread("native_lib_extract");
for (int i = 0; i < incrementalStorages.size(); ++i) {
IncrementalStorage storage = incrementalStorages.valueAtUnchecked(i);
storage.waitForNativeBinariesExtraction();
}
} finally {
Watchdog.getInstance().resumeWatchingCurrentThread("native_lib_extract");
}
}
private int[] getInstalledUsers(PackageSetting ps, int userId) {