From 9c1f23304a38748b13b653bb3bb2b0e57cc1263d Mon Sep 17 00:00:00 2001 From: Alfonso Villalobos Ulate Date: Tue, 11 Nov 2025 10:54:18 -0600 Subject: [PATCH] Add multi-thread to ObjcExportHeaderGenerator when processing packageFragments KT-82436 --- .../impl/k1/build.gradle.kts | 5 ++ .../objcexport/ObjCExportHeaderGenerator.kt | 50 +++++++++++-------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/native/objcexport-header-generator/impl/k1/build.gradle.kts b/native/objcexport-header-generator/impl/k1/build.gradle.kts index 4462d32b3cb5a..51632572a354a 100644 --- a/native/objcexport-header-generator/impl/k1/build.gradle.kts +++ b/native/objcexport-header-generator/impl/k1/build.gradle.kts @@ -8,7 +8,12 @@ sourceSets { "test" { projectDefault() } } +repositories { + mavenCentral() +} + dependencies { + implementation(libs.kotlinx.coroutines.core) api(project(":native:objcexport-header-generator")) testImplementation(project(":compiler:cli-base")) implementation(project(":compiler:ir.backend.common")) diff --git a/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt b/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt index 1b60e07c1b579..ada73144b2aaf 100644 --- a/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt +++ b/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.SourceFile import org.jetbrains.kotlin.resolve.scopes.MemberScope +import kotlinx.coroutines.* abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor( val moduleDescriptors: List, @@ -23,6 +24,7 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor( val objcExportBlockExplicitParameterNames: Boolean, problemCollector: ObjCExportProblemCollector, ) { + private val mutex = Mutex() private val stubs = mutableListOf() private val classForwardDeclarations = linkedSetOf() @@ -117,30 +119,38 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor( .flatMap { it.getPackageFragments() } .makePackagesOrderStable() - packageFragments.forEach { packageFragment -> - packageFragment.getMemberScope().getContributedDescriptors() - .asSequence() - .filterIsInstance() - .filter { mapper.shouldBeExposed(it) } - .forEach { - val classDescriptor = getClassIfCategory(it) - if (classDescriptor == null) { - topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it - } else { - // If a class is hidden from Objective-C API then it is meaningless - // to export its extensions. - if (!classDescriptor.isHiddenFromObjC()) { - extensions.getOrPut(classDescriptor, { mutableListOf() }) += it + val classesToTranslate = mutableListOf() + + runBlocking { + packageFragments.forEach { packageFragment -> + val memberScope = packageFragment.getMemberScope() + + launch(Dispatchers.Default) { + memberScope.getContributedDescriptors() + .asSequence() + .filterIsInstance() + .filter { mapper.shouldBeExposed(it) } + .forEach { + val classDescriptor = getClassIfCategory(it) + if (classDescriptor == null) { + mutex.withLock { + topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it + } + } else { + // If a class is hidden from Objective-C API then it is meaningless + // to export its extensions. + if (!classDescriptor.isHiddenFromObjC()) { + mutex.withLock { + extnsions.getOrPut(classDescriptor, { mutableListOf() }) += it + } + } + } } - } } + } } - val classesToTranslate = mutableListOf() - - packageFragments.forEach { packageFragment -> - packageFragment.getMemberScope().collectClasses(classesToTranslate) - } + memberScope.collectClasses(classesToTranslate) classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) }