diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt index c7477e16..d05454ca 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/AvatarRepository.kt @@ -45,6 +45,7 @@ class AvatarRepository(context: Context) { val edits: StateFlow> = _edits private val loads = mutableSetOf() private val objectLoads = mutableMapOf>() + private val objectWaiters = mutableMapOf() private val memberRequests = mutableMapOf() private val editTokens = mutableMapOf() private val replications = mutableSetOf() @@ -163,7 +164,8 @@ class AvatarRepository(context: Context) { if (p.type in 49..50 && NativeLib.isReady()) { p.cancelled = true; NativeLib.cancelAvatar(id) } } scope.coroutineContext.cancelChildren() - pending.clear(); loads.clear(); objectLoads.clear(); replications.clear(); dirtyGroups.clear(); memberRequests.clear(); editTokens.clear() + pending.clear(); loads.clear(); objectLoads.clear(); objectWaiters.clear() + replications.clear(); dirtyGroups.clear(); memberRequests.clear(); editTokens.clear() account = 0; defaultAvatar = null; cache.evictAll() _members.value = emptyMap(); _groups.value = emptyMap(); _edits.value = emptyMap(); changed() } @@ -325,8 +327,18 @@ class AvatarRepository(context: Context) { alive(epoch); log("DEBUG", "Object ready file=$file cache=$hit group=$group") } }.also { objectLoads[file]=it } + objectWaiters[file]=(objectWaiters[file] ?: 0)+1 try { operation.await(); alive(epoch) } - finally { if (generation==epoch && operation.isCompleted && objectLoads[file]===operation) objectLoads.remove(file) } + finally { + if (generation==epoch) { + val remaining=(objectWaiters[file] ?: 1)-1 + if (remaining==0) { + objectWaiters.remove(file) + if (objectLoads[file]===operation) objectLoads.remove(file) + if (!operation.isCompleted) { log("DEBUG", "Cancel unused object=$file"); operation.cancel() } + } else objectWaiters[file]=remaining + } + } } suspend fun loadAvatar(group: String, m: ChatMember, original: Boolean): Bitmap {