Skip to content

Commit fd0e551

Browse files
committed
[Dependency Scanning] Always use a locking diagnostic consumer
Since we enabled parallel dependency scanning by-default, each individual scan needs a diagnostic consumer that is safe to use across many threads. Deprecate the 'Locking' sub-class, making its behavior the default in the base class.
1 parent 3a788a4 commit fd0e551

File tree

2 files changed

+6
-21
lines changed

2 files changed

+6
-21
lines changed

include/swift/DependencyScan/DependencyScanningTool.h

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class DependencyScanDiagnosticCollector : public DiagnosticConsumer {
4040
std::optional<ScannerImportStatementInfo::ImportDiagnosticLocationInfo> ImportLocation;
4141
};
4242
std::vector<ScannerDiagnosticInfo> Diagnostics;
43+
llvm::sys::SmartMutex<true> ScanningDiagnosticConsumerStateLock;
4344

4445
void handleDiagnostic(SourceManager &SM, const DiagnosticInfo &Info) override;
4546

@@ -55,19 +56,6 @@ class DependencyScanDiagnosticCollector : public DiagnosticConsumer {
5556
}
5657
};
5758

58-
/// Locking variant of the above diagnostic collector that guards accesses to
59-
/// its state with a lock.
60-
class LockingDependencyScanDiagnosticCollector
61-
: public DependencyScanDiagnosticCollector {
62-
private:
63-
void addDiagnostic(SourceManager &SM, const DiagnosticInfo &Info) override;
64-
llvm::sys::SmartMutex<true> ScanningDiagnosticConsumerStateLock;
65-
66-
public:
67-
friend DependencyScanningTool;
68-
LockingDependencyScanDiagnosticCollector() {}
69-
};
70-
7159
/// Given a set of arguments to a print-target-info frontend tool query, produce the
7260
/// JSON target info.
7361
llvm::ErrorOr<swiftscan_string_ref_t> getTargetInfo(ArrayRef<const char *> Command,
@@ -118,7 +106,7 @@ class DependencyScanningTool {
118106
llvm::sys::SmartMutex<true> DependencyScanningToolStateLock;
119107

120108
/// A shared consumer that accumulates encountered diagnostics.
121-
LockingDependencyScanDiagnosticCollector CDC;
109+
DependencyScanDiagnosticCollector CDC;
122110
llvm::BumpPtrAllocator Alloc;
123111
llvm::StringSaver Saver;
124112
};

lib/DependencyScan/DependencyScanningTool.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ void DependencyScanDiagnosticCollector::handleDiagnostic(SourceManager &SM,
7474

7575
void DependencyScanDiagnosticCollector::addDiagnostic(
7676
SourceManager &SM, const DiagnosticInfo &Info) {
77+
llvm::sys::SmartScopedLock<true> Lock(ScanningDiagnosticConsumerStateLock);
78+
7779
// Determine what kind of diagnostic we're emitting.
7880
llvm::SourceMgr::DiagKind SMKind;
7981
switch (Info.Kind) {
@@ -129,12 +131,6 @@ void DependencyScanDiagnosticCollector::addDiagnostic(
129131
}
130132
}
131133

132-
void LockingDependencyScanDiagnosticCollector::addDiagnostic(
133-
SourceManager &SM, const DiagnosticInfo &Info) {
134-
llvm::sys::SmartScopedLock<true> Lock(ScanningDiagnosticConsumerStateLock);
135-
DependencyScanDiagnosticCollector::addDiagnostic(SM, Info);
136-
}
137-
138134
swiftscan_diagnostic_set_t *mapCollectedDiagnosticsForOutput(
139135
const DependencyScanDiagnosticCollector *diagnosticCollector) {
140136
auto collectedDiagnostics = diagnosticCollector->getDiagnostics();
@@ -272,7 +268,8 @@ DependencyScanningTool::getDependencies(
272268
StringRef WorkingDirectory) {
273269
// There may be errors as early as in instance initialization, so we must ensure
274270
// we can catch those.
275-
auto ScanDiagnosticConsumer = std::make_shared<DependencyScanDiagnosticCollector>();
271+
auto ScanDiagnosticConsumer =
272+
std::make_shared<DependencyScanDiagnosticCollector>();
276273

277274
// The primary instance used to scan the query Swift source-code
278275
auto QueryContextOrErr = initCompilerInstanceForScan(Command,

0 commit comments

Comments
 (0)