From 361c55c5acb9fa357801bc447611aa2c418804c4 Mon Sep 17 00:00:00 2001 From: Lauris van Rijn Date: Fri, 29 Aug 2025 00:18:59 +0200 Subject: [PATCH] =?UTF-8?q?fix(media):=20remove=20busy=E2=80=91wait=20loop?= =?UTF-8?q?=20in=20library=20personalization=20loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced the infinite `while(libraryPersonalizationsDone > 0){}` spin‑loop with an async counter callback. This prevents pegging the CPU if one personalization never completes, and allows completion to trigger via AtomicInteger decrement. Now the final callback fires only when all libraries have finished loading. --- .../audiobookshelf/app/media/MediaManager.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt b/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt index 39b3c25f..db3ee4ad 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/media/MediaManager.kt @@ -15,6 +15,7 @@ import org.json.JSONException import org.json.JSONObject import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +import java.util.concurrent.atomic.AtomicInteger class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) { val tag = "MediaManager" @@ -175,21 +176,20 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) { * Load personalized shelves from server for all libraries. * [cb] resolves when all libraries are processed */ - fun populatePersonalizedDataForAllLibraries(cb: () -> Unit ) { - serverLibraries.forEach { - libraryPersonalizationsDone++ - Log.d(tag, "Loading personalization for library ${it.name} - ${it.id} - ${it.mediaType}") - populatePersonalizedDataForLibrary(it.id) { - Log.d(tag, "Loaded personalization for library ${it.name} - ${it.id} - ${it.mediaType}") - libraryPersonalizationsDone-- + fun populatePersonalizedDataForAllLibraries(cb: () -> Unit) { + val remaining = AtomicInteger(serverLibraries.size) + + serverLibraries.forEach { lib -> + Log.d(tag, "Loading personalization for library ${lib.name}") + populatePersonalizedDataForLibrary(lib.id) { + Log.d(tag, "Loaded personalization for library ${lib.name}") + if (remaining.decrementAndGet() == 0) { + Log.d(tag, "Finished loading all library personalization data") + allLibraryPersonalizationsDone = true + cb() + } } } - - while (libraryPersonalizationsDone > 0) { } - - Log.d(tag, "Finished loading all library personalization data") - allLibraryPersonalizationsDone = true - cb() } /**