in src/com/facebook/buck/parser/PerBuildStateFactory.java [92:301]
private PerBuildState create(
ParsingContext parsingContext,
DaemonicParserState daemonicParserState,
Optional<AtomicLong> parseProcessedBytes) {
Cells cells = new Cells(parsingContext.getCell().getCell(CanonicalCellName.rootCell()));
ListeningExecutorService executorService = parsingContext.getExecutor();
SymlinkCache symlinkCache = new SymlinkCache(eventBus, daemonicParserState);
CellManager cellManager = new CellManager(cells.getRootCell(), symlinkCache);
TargetNodeListener<TargetNode<?>> symlinkCheckers = cellManager::registerInputsUnderSymlinks;
ParserConfig parserConfig = cells.getRootCell().getBuckConfig().getView(ParserConfig.class);
TargetConfigurationDetector targetConfigurationDetector =
TargetConfigurationDetectorFactory.fromBuckConfig(
parserConfig,
unconfiguredBuildTargetFactory,
cells.getRootCell().getCellPathResolver(),
cells.getRootCell().getCellNameResolver());
int numParsingThreads = parserConfig.getNumParsingThreads();
DefaultProjectBuildFileParserFactory projectBuildFileParserFactory =
new DefaultProjectBuildFileParserFactory(
typeCoercerFactory,
parserPythonInterpreterProvider,
parsingContext.isProfilingEnabled(),
parseProcessedBytes,
knownRuleTypesProvider);
ProjectBuildFileParserPool projectBuildFileParserPool =
new ProjectBuildFileParserPool(
numParsingThreads, // Max parsers to create per cell.
projectBuildFileParserFactory,
parsingContext.isProfilingEnabled());
TargetNodeFactory targetNodeFactory =
new TargetNodeFactory(typeCoercerFactory, new DefaultCellNameResolverProvider(cells));
SelectorListFactory selectorListFactory =
new SelectorListFactory(new SelectorFactory(unconfiguredBuildTargetFactory));
BuildFileRawNodeParsePipeline buildFileRawNodeParsePipeline =
new BuildFileRawNodeParsePipeline(
new PipelineNodeCache<>(daemonicParserState.getRawNodeCache(), n -> false),
projectBuildFileParserPool,
executorService,
eventBus,
watchman);
BuildTargetRawNodeParsePipeline buildTargetRawNodeParsePipeline =
new BuildTargetRawNodeParsePipeline(executorService, buildFileRawNodeParsePipeline);
PackageFileParserFactory packageFileParserFactory =
new PackageFileParserFactory(
typeCoercerFactory,
parserPythonInterpreterProvider,
knownRuleTypesProvider,
parsingContext.isProfilingEnabled());
PackageFileParserPool packageFileParserPool =
new PackageFileParserPool(
numParsingThreads, // Max parsers to create per cell.
packageFileParserFactory);
PackageFileParsePipeline packageFileParsePipeline =
new PackageFileParsePipeline(
new PipelineNodeCache<>(daemonicParserState.getPackageFileCache(), n -> false),
packageFileParserPool,
executorService,
eventBus,
watchman);
PerBuildStateCache perBuildStateCache = new PerBuildStateCache(numParsingThreads);
PackagePipeline packagePipeline =
new PackagePipeline(
executorService,
eventBus,
packageFileParsePipeline,
perBuildStateCache.getPackageCache());
ListeningExecutorService pipelineExecutorService =
parserConfig.getEnableParallelParsing()
? executorService
: MoreExecutors.newDirectExecutorService();
boolean enableSpeculativeParsing =
parserConfig.getEnableParallelParsing()
&& parsingContext.getSpeculativeParsing() == SpeculativeParsing.ENABLED;
UnconfiguredTargetNodePipeline unconfiguredTargetNodePipeline =
new UnconfiguredTargetNodePipeline(
pipelineExecutorService,
daemonicParserState.getOrCreateNodeCache(
DaemonicParserState.RAW_TARGET_NODE_CACHE_TYPE),
eventBus,
buildFileRawNodeParsePipeline,
buildTargetRawNodeParsePipeline,
packagePipeline,
new DefaultUnconfiguredTargetNodeFactory(
knownRuleTypesProvider,
new BuiltTargetVerifier(),
cells,
selectorListFactory,
typeCoercerFactory));
PackageBoundaryChecker packageBoundaryChecker =
new ThrowingPackageBoundaryChecker(daemonicParserState.getBuildFileTrees());
ParserTargetNodeFromUnconfiguredTargetNodeFactory nonResolvingRawTargetNodeToTargetNodeFactory =
new UnconfiguredTargetNodeToTargetNodeFactory(
typeCoercerFactory,
knownRuleTypesProvider,
marshaller,
targetNodeFactory,
packageBoundaryChecker,
symlinkCheckers,
new ThrowingSelectorListResolver(),
new ThrowingPlatformResolver(),
new MultiPlatformTargetConfigurationTransformer(new ThrowingPlatformResolver()),
hostConfiguration,
parsingContext.getCell().getBuckConfig(),
Optional.empty());
// This pipeline uses a direct executor instead of pipelineExecutorService to avoid
// deadlocks happening when too many node are requested from targetNodeParsePipeline.
// That pipeline does blocking calls to get nodes from nonResolvingTargetNodeParsePipeline
// which can lead to deadlocks.
UnconfiguredTargetNodeToTargetNodeParsePipeline nonResolvingTargetNodeParsePipeline =
new UnconfiguredTargetNodeToTargetNodeParsePipeline(
daemonicParserState.getOrCreateNodeCache(DaemonicParserState.TARGET_NODE_CACHE_TYPE),
MoreExecutors.newDirectExecutorService(),
unconfiguredTargetNodePipeline,
targetConfigurationDetector,
eventBus,
"nonresolving_raw_target_node_parse_pipeline",
enableSpeculativeParsing,
nonResolvingRawTargetNodeToTargetNodeFactory,
parserConfig.getRequireTargetPlatform());
ConfigurationRuleRegistry configurationRuleRegistry =
ConfigurationRuleRegistryFactory.createRegistry(
(target, callerContext) ->
nonResolvingTargetNodeParsePipeline
.getNode(cellManager.getCell(target.getCell()), target, callerContext)
.assertGetTargetNode(DependencyStack.root()));
SelectableResolver selectableResolver =
new ConfigurationRuleSelectableResolver(
configurationRuleRegistry.getConfigurationRuleResolver());
SelectorListResolver selectorListResolver;
if (parsingContext.useUnconfiguredSelectorResolver()) {
selectorListResolver = new UnconfiguredSelectorListResolver(selectableResolver);
} else {
selectorListResolver = new DefaultSelectorListResolver(selectableResolver);
}
UnconfiguredTargetNodeToTargetNodeFactory unconfiguredTargetNodeToTargetNodeFactory =
new UnconfiguredTargetNodeToTargetNodeFactory(
typeCoercerFactory,
knownRuleTypesProvider,
marshaller,
targetNodeFactory,
packageBoundaryChecker,
symlinkCheckers,
selectorListResolver,
configurationRuleRegistry.getTargetPlatformResolver(),
new MultiPlatformTargetConfigurationTransformer(
configurationRuleRegistry.getTargetPlatformResolver()),
hostConfiguration,
parsingContext.getCell().getBuckConfig(),
(parsingContext.excludeUnsupportedTargets()
&& parsingContext.enableTargetCompatibilityChecks())
? Optional.of(configurationRuleRegistry)
: Optional.empty());
ListeningExecutorService configuredPipelineExecutor =
MoreExecutors.listeningDecorator(
createExecutorService(cells.getRootCell().getBuckConfig(), "configured-pipeline"));
UnconfiguredTargetNodeToTargetNodeParsePipeline targetNodeParsePipeline =
new UnconfiguredTargetNodeToTargetNodeParsePipeline(
daemonicParserState.getOrCreateNodeCache(DaemonicParserState.TARGET_NODE_CACHE_TYPE),
configuredPipelineExecutor,
unconfiguredTargetNodePipeline,
targetConfigurationDetector,
eventBus,
"configured_raw_target_node_parse_pipeline",
enableSpeculativeParsing,
unconfiguredTargetNodeToTargetNodeFactory,
parserConfig.getRequireTargetPlatform()) {
@Override
public void close() {
super.close();
nonResolvingTargetNodeParsePipeline.close();
unconfiguredTargetNodePipeline.close();
try {
MostExecutors.shutdown(configuredPipelineExecutor, 1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
}
}
};
return new PerBuildState(
cellManager,
buildFileRawNodeParsePipeline,
targetNodeParsePipeline,
parsingContext,
selectorListResolver,
selectorListFactory,
configurationRuleRegistry);
}