in src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java [718:756]
private ACTION executeTasks(final SortedSet<InstallTask> tasks) {
if (this.switchStartLevel && this.hasBundleUpdateTask(tasks)) {
// StartLevel service is always available
final ServiceReference ref = ctx.getServiceReference(StartLevel.class.getName());
final StartLevel startLevel = (StartLevel) ctx.getService(ref);
try {
final int targetStartLevel = this.getLowestStartLevel(tasks, startLevel);
final int currentStartLevel = startLevel.getStartLevel();
if (targetStartLevel < currentStartLevel) {
auditLogger.info("Switching to start level {}", targetStartLevel);
try {
startLevel.setStartLevel(targetStartLevel);
// now we have to wait until the start level is reached
while (startLevel.getStartLevel() > targetStartLevel) {
try {
Thread.sleep(300);
} catch (final InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
return doExecuteTasks(tasks);
} finally {
// restore old start level in any case
startLevel.setStartLevel(currentStartLevel);
auditLogger.info("Switching back to start level {} after performing the required " +
"installation tasks", currentStartLevel);
}
}
} finally {
ctx.ungetService(ref);
}
}
return doExecuteTasks(tasks);
}