From aeddeba1659370ab1b553c9e3f285dcf1a814f45 Mon Sep 17 00:00:00 2001 From: Nikita Lipsky Date: Mon, 27 Jan 2025 15:10:23 +0200 Subject: [PATCH] Benchmarks: fix OOM crash on a real iOS device. Part 2. (#5211) - add memory warning monitor to do explicit GC ## Release Notes N/A --- .../commonMain/kotlin/MeasureComposable.kt | 1 + .../benchmarks/src/iosMain/kotlin/main.ios.kt | 8 ++++++-- .../multiplatform/iosApp/iosApp/iOSApp.swift | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/benchmarks/multiplatform/benchmarks/src/commonMain/kotlin/MeasureComposable.kt b/benchmarks/multiplatform/benchmarks/src/commonMain/kotlin/MeasureComposable.kt index ee25a987bc..830c38996f 100644 --- a/benchmarks/multiplatform/benchmarks/src/commonMain/kotlin/MeasureComposable.kt +++ b/benchmarks/multiplatform/benchmarks/src/commonMain/kotlin/MeasureComposable.kt @@ -124,5 +124,6 @@ suspend fun measureComposable( ) } finally { scene.close() + runGC() // cleanup for next benchmarks } } diff --git a/benchmarks/multiplatform/benchmarks/src/iosMain/kotlin/main.ios.kt b/benchmarks/multiplatform/benchmarks/src/iosMain/kotlin/main.ios.kt index c49b912015..e048bb6d9a 100644 --- a/benchmarks/multiplatform/benchmarks/src/iosMain/kotlin/main.ios.kt +++ b/benchmarks/multiplatform/benchmarks/src/iosMain/kotlin/main.ios.kt @@ -3,9 +3,13 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. */ -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch fun main(args : List) { Args.parseArgs(args.toTypedArray()) - runBlocking { runBenchmarks(graphicsContext = graphicsContext()) } + MainScope().launch { + runBenchmarks(graphicsContext = graphicsContext()) + println("Completed!") + } } diff --git a/benchmarks/multiplatform/iosApp/iosApp/iOSApp.swift b/benchmarks/multiplatform/iosApp/iosApp/iOSApp.swift index 622565288f..c54e451afc 100644 --- a/benchmarks/multiplatform/iosApp/iosApp/iOSApp.swift +++ b/benchmarks/multiplatform/iosApp/iosApp/iOSApp.swift @@ -1,9 +1,28 @@ import SwiftUI import benchmarks +import Combine + +class MemoryWarningMonitor: ObservableObject { + private var cancellable: AnyCancellable? + + init() { + self.cancellable = NotificationCenter.default + .publisher(for: UIApplication.didReceiveMemoryWarningNotification) + .sink { _ in + self.didReceiveMemoryWarning() + } + } + + private func didReceiveMemoryWarning() { +// print("Memory warning received! Cleaning resources.") + RunGC_nativeKt.runGC() + } +} @main struct iOSApp: App { init() { + MemoryWarningMonitor() Main_iosKt.main(args: ProcessInfo.processInfo.arguments) }