Skip to content

Commit e5d5e4d

Browse files
committed
Add multi-thread to ObjcExportHeaderGenerator when processing packageFragments
KT-82436
1 parent c58bd12 commit e5d5e4d

File tree

2 files changed

+37
-21
lines changed

2 files changed

+37
-21
lines changed

native/objcexport-header-generator/impl/k1/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ sourceSets {
88
"test" { projectDefault() }
99
}
1010

11+
repositories {
12+
mavenCentral()
13+
}
14+
1115
dependencies {
16+
implementation(libs.kotlinx.coroutines.core)
1217
api(project(":native:objcexport-header-generator"))
1318
testImplementation(project(":compiler:cli-base"))
1419
implementation(project(":compiler:ir.backend.common"))

native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
1414
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
1515
import org.jetbrains.kotlin.descriptors.SourceFile
1616
import org.jetbrains.kotlin.resolve.scopes.MemberScope
17+
import kotlinx.coroutines.*
1718

1819
abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
1920
val moduleDescriptors: List<ModuleDescriptor>,
@@ -117,32 +118,42 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
117118
.flatMap { it.getPackageFragments() }
118119
.makePackagesOrderStable()
119120

120-
packageFragments.forEach { packageFragment ->
121-
packageFragment.getMemberScope().getContributedDescriptors()
122-
.asSequence()
123-
.filterIsInstance<CallableMemberDescriptor>()
124-
.filter { mapper.shouldBeExposed(it) }
125-
.forEach {
126-
val classDescriptor = getClassIfCategory(it)
127-
if (classDescriptor == null) {
128-
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
129-
} else {
130-
// If a class is hidden from Objective-C API then it is meaningless
131-
// to export its extensions.
132-
if (!classDescriptor.isHiddenFromObjC()) {
133-
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
121+
val classesToTranslate = mutableListOf<MutableList<ClassDescriptor>>()
122+
123+
runBlocking {
124+
packageFragments.forEach { packageFragment ->
125+
val memberScope = packageFragment.getMemberScope()
126+
127+
// Keep Order
128+
val inOrderCollector = mutableListOf<ClassDescriptor>()
129+
classesToTranslate.add(inOrderCollector)
130+
131+
launch(Dispatchers.Default) {
132+
memberScope.getContributedDescriptors()
133+
.asSequence()
134+
.filterIsInstance<CallableMemberDescriptor>()
135+
.filter { mapper.shouldBeExposed(it) }
136+
.forEach {
137+
val classDescriptor = getClassIfCategory(it)
138+
if (classDescriptor == null) {
139+
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
140+
} else {
141+
// If a class is hidden from Objective-C API then it is meaningless
142+
// to export its extensions.
143+
if (!classDescriptor.isHiddenFromObjC()) {
144+
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
145+
}
146+
}
134147
}
135-
}
136148
}
137-
}
138-
139-
val classesToTranslate = mutableListOf<ClassDescriptor>()
140149

141-
packageFragments.forEach { packageFragment ->
142-
packageFragment.getMemberScope().collectClasses(classesToTranslate)
150+
launch(Dispatchers.Default) {
151+
memberScope.collectClasses(inOrderCollector)
152+
}
153+
}
143154
}
144155

145-
classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) }
156+
classesToTranslate.flatten().makeClassesOrderStable().forEach { translateClass(it) }
146157

147158
extensions.makeCategoriesOrderStable().forEach { (classDescriptor, declarations) ->
148159
generateExtensions(classDescriptor, declarations)

0 commit comments

Comments
 (0)