@@ -467,7 +467,7 @@ public IncludeScanningHeaderData.Builder createIncludeScanningHeaderData(
467
467
for (HeaderInfo transitiveHeaderInfo : transitiveHeaderInfos ) {
468
468
boolean isModule = createModularHeaders && transitiveHeaderInfo .getModule (usePic ) != null ;
469
469
handleHeadersForIncludeScanning (
470
- transitiveHeaderInfo .modularHeaders ,
470
+ transitiveHeaderInfo .getModularHeaders () ,
471
471
pathToLegalArtifact ,
472
472
treeArtifacts ,
473
473
isModule ,
@@ -492,7 +492,7 @@ public IncludeScanningHeaderData.Builder createIncludeScanningHeaderData(
492
492
if (transitiveHeaderCount == -1 ) {
493
493
transitiveHeaderCount = pathToLegalArtifact .size ();
494
494
}
495
- removeArtifactsFromSet (modularHeaders , headerInfo .modularHeaders );
495
+ removeArtifactsFromSet (modularHeaders , headerInfo .getModularHeaders () );
496
496
removeArtifactsFromSet (modularHeaders , headerInfo .textualHeaders );
497
497
removeArtifactsFromSet (modularHeaders , headerInfo .separateModuleHeaders );
498
498
return new IncludeScanningHeaderData .Builder (pathToLegalArtifact , modularHeaders );
@@ -514,8 +514,9 @@ public Set<DerivedArtifact> computeUsedModules(
514
514
}
515
515
// Not using range-based for loops here as often there is exactly one element in this list
516
516
// 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 );
519
520
if (includes .contains (header )) {
520
521
modules .add (module );
521
522
break ;
@@ -603,7 +604,7 @@ ImmutableList<Artifact> getHeaderModuleSrcs(boolean separateModule) {
603
604
return headerInfo .separateModuleHeaders ;
604
605
}
605
606
return new ImmutableSet .Builder <Artifact >()
606
- .addAll (headerInfo .modularHeaders )
607
+ .addAll (headerInfo .getModularHeaders () )
607
608
.addAll (headerInfo .textualHeaders )
608
609
.addAll (headerInfo .separateModuleHeaders )
609
610
.build ()
@@ -918,7 +919,7 @@ public Builder addSystemIncludeDirs(Iterable<PathFragment> systemIncludeDirs) {
918
919
return this ;
919
920
}
920
921
921
- /** Add framewrok include directories to be added with "-F". */
922
+ /** Add framework include directories to be added with "-F". */
922
923
@ CanIgnoreReturnValue
923
924
public Builder addFrameworkIncludeDirs (Iterable <PathFragment > frameworkIncludeDirs ) {
924
925
this .frameworkIncludeDirs .addAll (frameworkIncludeDirs );
@@ -1181,9 +1182,6 @@ static final class HeaderInfo {
1181
1182
/** All private header files that are compiled into this module. */
1182
1183
final ImmutableList <Artifact > modularPrivateHeaders ;
1183
1184
1184
- /** All header files that are compiled into this module. */
1185
- private final ImmutableList <Artifact > modularHeaders ;
1186
-
1187
1185
/** All textual header files that are contained in this module. */
1188
1186
final ImmutableList <Artifact > textualHeaders ;
1189
1187
@@ -1196,6 +1194,13 @@ static final class HeaderInfo {
1196
1194
/** HeaderInfos of direct dependencies of C++ target represented by this context. */
1197
1195
final ImmutableList <HeaderInfo > deps ;
1198
1196
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
+
1199
1204
/** Collection representing the memoized form of transitive information, set by flatten(). */
1200
1205
private TransitiveHeaderCollection memo = null ;
1201
1206
@@ -1213,8 +1218,6 @@ static final class HeaderInfo {
1213
1218
this .picHeaderModule = picHeaderModule ;
1214
1219
this .modularPublicHeaders = modularPublicHeaders ;
1215
1220
this .modularPrivateHeaders = modularPrivateHeaders ;
1216
- this .modularHeaders =
1217
- ImmutableList .copyOf (Iterables .concat (modularPublicHeaders , modularPrivateHeaders ));
1218
1221
this .textualHeaders = textualHeaders ;
1219
1222
this .separateModuleHeaders = separateModuleHeaders ;
1220
1223
this .separateModule = separateModule ;
@@ -1271,6 +1274,18 @@ private void addOthers(Set<HeaderInfo> result, List<HeaderInfo> additionalDeps)
1271
1274
}
1272
1275
}
1273
1276
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
+
1274
1289
/** Represents the memoized transitive information for a HeaderInfo instance. */
1275
1290
private class TransitiveHeaderCollection extends AbstractCollection <HeaderInfo > {
1276
1291
private final int size ;
0 commit comments