Skip to content

Commit 1dbbd5f

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

File tree

4 files changed

+57
-12
lines changed

4 files changed

+57
-12
lines changed

kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.objcexport.ObjCExportCodeGenerato
1515
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
1616
import org.jetbrains.kotlin.cli.common.messages.MessageUtil
1717
import org.jetbrains.kotlin.config.nativeBinaryOptions.BinaryOptions
18+
import org.jetbrains.kotlin.config.parallelBackendThreads
1819
import org.jetbrains.kotlin.descriptors.*
1920
import org.jetbrains.kotlin.konan.exec.Command
2021
import org.jetbrains.kotlin.konan.file.File
@@ -85,7 +86,7 @@ internal fun produceObjCExportInterface(
8586
val additionalImports = context.config.configuration.getNotNull(KonanConfigKeys.FRAMEWORK_IMPORT_HEADERS)
8687
val headerGenerator = ObjCExportHeaderGenerator.createInstance(
8788
moduleDescriptors, mapper, namer, problemCollector, objcGenerics, objcExportBlockExplicitParameterNames, shouldExportKDoc = shouldExportKDoc,
88-
additionalImports = additionalImports)
89+
additionalImports = additionalImports, config.threadsCount)
8990
headerGenerator.translateModule()
9091
return headerGenerator.buildInterface()
9192
}

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

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ 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 java.util.concurrent.Executors
18+
import java.util.concurrent.TimeUnit
19+
import java.util.Collections.synchronizedList
1720

1821
abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
1922
val moduleDescriptors: List<ModuleDescriptor>,
@@ -22,6 +25,7 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
2225
val objcGenerics: Boolean,
2326
val objcExportBlockExplicitParameterNames: Boolean,
2427
problemCollector: ObjCExportProblemCollector,
28+
val threadsCount: Int = Runtime.getRuntime().availableProcessors()
2529
) {
2630
private val stubs = mutableListOf<ObjCExportStub>()
2731

@@ -117,31 +121,49 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
117121
.flatMap { it.getPackageFragments() }
118122
.makePackagesOrderStable()
119123

124+
val classesToTranslate = synchronizedList(mutableListOf<ClassDescriptor>())
125+
126+
val executor = if (threadsCount > 1) {
127+
Executors.newFixedThreadPool(threadsCount)
128+
} else {
129+
null
130+
}
131+
132+
120133
packageFragments.forEach { packageFragment ->
121-
packageFragment.getMemberScope().getContributedDescriptors()
134+
val memberScope = packageFragment.getMemberScope()
135+
136+
val task = {
137+
memberScope.getContributedDescriptors()
122138
.asSequence()
123139
.filterIsInstance<CallableMemberDescriptor>()
124140
.filter { mapper.shouldBeExposed(it) }
125141
.forEach {
126142
val classDescriptor = getClassIfCategory(it)
127143
if (classDescriptor == null) {
128-
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
144+
synchronized(topLevel) {
145+
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
146+
}
129147
} else {
130148
// If a class is hidden from Objective-C API then it is meaningless
131149
// to export its extensions.
132150
if (!classDescriptor.isHiddenFromObjC()) {
133-
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
151+
synchronized(extensions) {
152+
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
153+
}
134154
}
135155
}
136156
}
137-
}
157+
}
138158

139-
val classesToTranslate = mutableListOf<ClassDescriptor>()
159+
executor?.submit(task) ?: task()
140160

141-
packageFragments.forEach { packageFragment ->
142-
packageFragment.getMemberScope().collectClasses(classesToTranslate)
161+
memberScope.collectClasses(classesToTranslate)
143162
}
144163

164+
executor?.shutdown()
165+
executor?.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS)
166+
145167
classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) }
146168

147169
extensions.makeCategoriesOrderStable().forEach { (classDescriptor, declarations) ->
@@ -247,6 +269,7 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
247269
objcExportBlockExplicitParameterNames: Boolean,
248270
shouldExportKDoc: Boolean,
249271
additionalImports: List<String>,
272+
threadsCount: Int
250273
): ObjCExportHeaderGenerator = ObjCExportHeaderGeneratorImpl(
251274
moduleDescriptors,
252275
mapper,
@@ -255,7 +278,8 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
255278
objcGenerics,
256279
objcExportBlockExplicitParameterNames,
257280
shouldExportKDoc,
258-
additionalImports
281+
additionalImports,
282+
threadsCount
259283
)
260284
}
261285
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,16 @@ internal class ObjCExportHeaderGeneratorImpl(
1616
objcExportBlockExplicitParameterNames: Boolean,
1717
override val shouldExportKDoc: Boolean,
1818
private val additionalImports: List<String>,
19-
) : ObjCExportHeaderGenerator(moduleDescriptors, mapper, namer, objcGenerics, objcExportBlockExplicitParameterNames, problemCollector) {
19+
threadsCount: Int,
20+
) : ObjCExportHeaderGenerator(
21+
moduleDescriptors,
22+
mapper,
23+
namer,
24+
objcGenerics,
25+
objcExportBlockExplicitParameterNames,
26+
problemCollector,
27+
threadsCount
28+
) {
2029
override fun getAdditionalImports(): List<String> =
2130
additionalImports
2231
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,16 @@ class ObjcExportHeaderGeneratorMobile internal constructor(
1919
objcGenerics: Boolean,
2020
objcExportBlockExplicitParameterNames: Boolean,
2121
private val restrictToLocalModules: Boolean,
22-
) : ObjCExportHeaderGenerator(moduleDescriptors, mapper, namer, objcGenerics, objcExportBlockExplicitParameterNames, problemCollector) {
22+
threadsCount: Int,
23+
) : ObjCExportHeaderGenerator(
24+
moduleDescriptors,
25+
mapper,
26+
namer,
27+
objcGenerics,
28+
objcExportBlockExplicitParameterNames,
29+
problemCollector,
30+
threadsCount
31+
) {
2332

2433
companion object {
2534
fun createInstance(
@@ -30,6 +39,7 @@ class ObjcExportHeaderGeneratorMobile internal constructor(
3039
deprecationResolver: DeprecationResolver? = null,
3140
local: Boolean = false,
3241
restrictToLocalModules: Boolean = false,
42+
threadsCount: Int = Runtime.getRuntime().availableProcessors(),
3343
): ObjCExportHeaderGenerator {
3444
val mapper = ObjCExportMapper(deprecationResolver, local, configuration.unitSuspendFunctionExport, configuration.entryPoints)
3545
val namerConfiguration = createNamerConfiguration(configuration)
@@ -42,7 +52,8 @@ class ObjcExportHeaderGeneratorMobile internal constructor(
4252
problemCollector,
4353
configuration.objcGenerics,
4454
configuration.objcExportBlockExplicitParameterNames,
45-
restrictToLocalModules
55+
restrictToLocalModules,
56+
threadsCount,
4657
)
4758
}
4859
}

0 commit comments

Comments
 (0)