Skip to content

Commit 08f8202

Browse files
committed
Avoid waiting to serializer the link hierarchy
1 parent a5f823e commit 08f8202

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

Sources/SwiftDocC/Infrastructure/ConvertActionConverter.swift

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ package enum ConvertActionConverter {
103103
let resultsSyncQueue = DispatchQueue(label: "Convert Serial Queue", qos: .unspecified, attributes: [])
104104
let resultsGroup = DispatchGroup()
105105

106+
let linkHierarchySerializationProblems = Synchronized<[Problem]>([])
107+
if FeatureFlags.current.isLinkHierarchySerializationEnabled {
108+
resultsGroup.async(queue: resultsSyncQueue) {
109+
signposter.withIntervalSignpost("Serialize link hierarchy", id: signposter.makeSignpostID()) {
110+
do {
111+
let serializableLinkInformation = try context.linkResolver.localResolver.prepareForSerialization(bundleID: bundle.id)
112+
try outputConsumer.consume(linkResolutionInformation: serializableLinkInformation)
113+
} catch {
114+
linkHierarchySerializationProblems.sync {
115+
recordProblem(from: error, in: &$0, withIdentifier: "link-resolver")
116+
}
117+
}
118+
}
119+
}
120+
}
121+
106122
let renderSignpostHandle = signposter.beginInterval("Render", id: signposter.makeSignpostID(), "Render \(context.knownPages.count) pages")
107123

108124
var conversionProblems: [Problem] = context.knownPages.concurrentPerform { identifier, results in
@@ -164,44 +180,25 @@ package enum ConvertActionConverter {
164180
// Wait for any concurrent updates to complete.
165181
resultsGroup.wait()
166182

183+
conversionProblems += linkHierarchySerializationProblems.sync { $0 }
184+
167185
signposter.endInterval("Render", renderSignpostHandle)
168186

169187
guard !Task.isCancelled else { return [] }
170188

171189
// Write various metadata
172-
if emitDigest {
190+
if emitDigest || FeatureFlags.current.isLinkHierarchySerializationEnabled {
173191
signposter.withIntervalSignpost("Emit digest", id: signposter.makeSignpostID()) {
174192
do {
175193
try outputConsumer.finishedConsumingLinkElementSummaries()
176-
try outputConsumer.consume(indexingRecords: indexingRecords)
177-
try outputConsumer.consume(assets: assets)
178-
} catch {
179-
recordProblem(from: error, in: &conversionProblems, withIdentifier: "metadata")
180-
}
181-
}
182-
}
183-
184-
if FeatureFlags.current.isLinkHierarchySerializationEnabled {
185-
signposter.withIntervalSignpost("Serialize link hierarchy", id: signposter.makeSignpostID()) {
186-
do {
187-
let serializableLinkInformation = try context.linkResolver.localResolver.prepareForSerialization(bundleID: bundle.id)
188-
try outputConsumer.consume(linkResolutionInformation: serializableLinkInformation)
189-
190-
if !emitDigest {
191-
try outputConsumer.finishedConsumingLinkElementSummaries()
194+
if emitDigest {
195+
// Only emit the other digest files if `--emit-digest` is passed
196+
try outputConsumer.consume(indexingRecords: indexingRecords)
197+
try outputConsumer.consume(assets: assets)
198+
try outputConsumer.consume(problems: context.problems + conversionProblems)
192199
}
193200
} catch {
194-
recordProblem(from: error, in: &conversionProblems, withIdentifier: "link-resolver")
195-
}
196-
}
197-
}
198-
199-
if emitDigest {
200-
signposter.withIntervalSignpost("Emit digest", id: signposter.makeSignpostID()) {
201-
do {
202-
try outputConsumer.consume(problems: context.problems + conversionProblems)
203-
} catch {
204-
recordProblem(from: error, in: &conversionProblems, withIdentifier: "problems")
201+
recordProblem(from: error, in: &conversionProblems, withIdentifier: "metadata")
205202
}
206203
}
207204
}

0 commit comments

Comments
 (0)