Skip to content

Commit 1cf97df

Browse files
committed
Add multi-thread to ObjcExportHeaderGenerator when processing packageFragments
KT-82436
1 parent 04ce680 commit 1cf97df

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
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: 27 additions & 20 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,29 +118,35 @@ 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<ClassDescriptor>()
122+
123+
runBlocking {
124+
packageFragments.forEach { packageFragment ->
125+
val memberScope = packageFragment.getMemberScope()
126+
127+
launch(Dispatchers.Default) {
128+
memberScope.getContributedDescriptors()
129+
.asSequence()
130+
.filterIsInstance<CallableMemberDescriptor>()
131+
.filter { mapper.shouldBeExposed(it) }
132+
.forEach {
133+
val classDescriptor = getClassIfCategory(it)
134+
if (classDescriptor == null) {
135+
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
136+
} else {
137+
// If a class is hidden from Objective-C API then it is meaningless
138+
// to export its extensions.
139+
if (!classDescriptor.isHiddenFromObjC()) {
140+
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
141+
}
142+
}
134143
}
135-
}
136144
}
137-
}
138145

139-
val classesToTranslate = mutableListOf<ClassDescriptor>()
140-
141-
packageFragments.forEach { packageFragment ->
142-
packageFragment.getMemberScope().collectClasses(classesToTranslate)
146+
launch(Dispatchers.Default) {
147+
memberScope.collectClasses(classesToTranslate)
148+
}
149+
}
143150
}
144151

145152
classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) }

0 commit comments

Comments
 (0)