Skip to content

Commit f5c8deb

Browse files
aoeuicopybara-github
authored andcommitted
Make HeaderInfo.modularHeaders lazy.
This makes later serialization work slightly simpler. PiperOrigin-RevId: 607735291 Change-Id: I17f980c8f947d1eeb43fa0099c2434ed5590d037
1 parent dcda51e commit f5c8deb

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ public IncludeScanningHeaderData.Builder createIncludeScanningHeaderData(
467467
for (HeaderInfo transitiveHeaderInfo : transitiveHeaderInfos) {
468468
boolean isModule = createModularHeaders && transitiveHeaderInfo.getModule(usePic) != null;
469469
handleHeadersForIncludeScanning(
470-
transitiveHeaderInfo.modularHeaders,
470+
transitiveHeaderInfo.getModularHeaders(),
471471
pathToLegalArtifact,
472472
treeArtifacts,
473473
isModule,
@@ -492,7 +492,7 @@ public IncludeScanningHeaderData.Builder createIncludeScanningHeaderData(
492492
if (transitiveHeaderCount == -1) {
493493
transitiveHeaderCount = pathToLegalArtifact.size();
494494
}
495-
removeArtifactsFromSet(modularHeaders, headerInfo.modularHeaders);
495+
removeArtifactsFromSet(modularHeaders, headerInfo.getModularHeaders());
496496
removeArtifactsFromSet(modularHeaders, headerInfo.textualHeaders);
497497
removeArtifactsFromSet(modularHeaders, headerInfo.separateModuleHeaders);
498498
return new IncludeScanningHeaderData.Builder(pathToLegalArtifact, modularHeaders);
@@ -514,8 +514,9 @@ public Set<DerivedArtifact> computeUsedModules(
514514
}
515515
// Not using range-based for loops here as often there is exactly one element in this list
516516
// and the amount of garbage created by SingletonImmutableList.iterator() is significant.
517-
for (int i = 0; i < transitiveHeaderInfo.modularHeaders.size(); i++) {
518-
Artifact header = transitiveHeaderInfo.modularHeaders.get(i);
517+
ImmutableList<Artifact> modularHeaders = transitiveHeaderInfo.getModularHeaders();
518+
for (int i = 0; i < modularHeaders.size(); i++) {
519+
Artifact header = modularHeaders.get(i);
519520
if (includes.contains(header)) {
520521
modules.add(module);
521522
break;
@@ -603,7 +604,7 @@ ImmutableList<Artifact> getHeaderModuleSrcs(boolean separateModule) {
603604
return headerInfo.separateModuleHeaders;
604605
}
605606
return new ImmutableSet.Builder<Artifact>()
606-
.addAll(headerInfo.modularHeaders)
607+
.addAll(headerInfo.getModularHeaders())
607608
.addAll(headerInfo.textualHeaders)
608609
.addAll(headerInfo.separateModuleHeaders)
609610
.build()
@@ -918,7 +919,7 @@ public Builder addSystemIncludeDirs(Iterable<PathFragment> systemIncludeDirs) {
918919
return this;
919920
}
920921

921-
/** Add framewrok include directories to be added with "-F". */
922+
/** Add framework include directories to be added with "-F". */
922923
@CanIgnoreReturnValue
923924
public Builder addFrameworkIncludeDirs(Iterable<PathFragment> frameworkIncludeDirs) {
924925
this.frameworkIncludeDirs.addAll(frameworkIncludeDirs);
@@ -1181,9 +1182,6 @@ static final class HeaderInfo {
11811182
/** All private header files that are compiled into this module. */
11821183
final ImmutableList<Artifact> modularPrivateHeaders;
11831184

1184-
/** All header files that are compiled into this module. */
1185-
private final ImmutableList<Artifact> modularHeaders;
1186-
11871185
/** All textual header files that are contained in this module. */
11881186
final ImmutableList<Artifact> textualHeaders;
11891187

@@ -1196,6 +1194,13 @@ static final class HeaderInfo {
11961194
/** HeaderInfos of direct dependencies of C++ target represented by this context. */
11971195
final ImmutableList<HeaderInfo> deps;
11981196

1197+
/**
1198+
* All header files that are compiled into this module.
1199+
*
1200+
* <p>Lazily initialized. Use {@link #getModularHeaders} instead.
1201+
*/
1202+
private transient volatile ImmutableList<Artifact> lazyModularHeaders;
1203+
11991204
/** Collection representing the memoized form of transitive information, set by flatten(). */
12001205
private TransitiveHeaderCollection memo = null;
12011206

@@ -1213,8 +1218,6 @@ static final class HeaderInfo {
12131218
this.picHeaderModule = picHeaderModule;
12141219
this.modularPublicHeaders = modularPublicHeaders;
12151220
this.modularPrivateHeaders = modularPrivateHeaders;
1216-
this.modularHeaders =
1217-
ImmutableList.copyOf(Iterables.concat(modularPublicHeaders, modularPrivateHeaders));
12181221
this.textualHeaders = textualHeaders;
12191222
this.separateModuleHeaders = separateModuleHeaders;
12201223
this.separateModule = separateModule;
@@ -1271,6 +1274,18 @@ private void addOthers(Set<HeaderInfo> result, List<HeaderInfo> additionalDeps)
12711274
}
12721275
}
12731276

1277+
private ImmutableList<Artifact> getModularHeaders() {
1278+
if (lazyModularHeaders == null) {
1279+
synchronized (this) {
1280+
if (lazyModularHeaders == null) {
1281+
lazyModularHeaders =
1282+
ImmutableList.copyOf(Iterables.concat(modularPublicHeaders, modularPrivateHeaders));
1283+
}
1284+
}
1285+
}
1286+
return lazyModularHeaders;
1287+
}
1288+
12741289
/** Represents the memoized transitive information for a HeaderInfo instance. */
12751290
private class TransitiveHeaderCollection extends AbstractCollection<HeaderInfo> {
12761291
private final int size;

0 commit comments

Comments
 (0)