]> granicus.if.org Git - clang/commit
<rdar://problem/13363214> Eliminate race condition between module rebuild and the...
authorDouglas Gregor <dgregor@apple.com>
Tue, 19 Mar 2013 00:28:20 +0000 (00:28 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 19 Mar 2013 00:28:20 +0000 (00:28 +0000)
commit677e15ffee2ecc9c1c8f46fd77cab4b5afb59640
tree7d1d3c5c95436eb48920bf6acd83de504828bec6
parentaa624954c50a741528752b85d3a3bf11ef9771db
<rdar://problem/13363214> Eliminate race condition between module rebuild and the global module index.

The global module index was querying the file manager for each of the
module files it knows about at load time, to prune out any out-of-date
information. The file manager would then cache the results of the
stat() falls used to find that module file.

Later, the same translation unit could end up trying to import one of the
module files that had previously been ignored by the module cache, but
after some other Clang instance rebuilt the module file to bring it
up-to-date. The stale stat() results in the file manager would
trigger a second rebuild of the already-up-to-date module, causing
failures down the line.

The global module index now lazily resolves its module file references
to actual AST reader module files only after the module file has been
loaded, eliminating the stat-caching race. Moreover, the AST reader
can communicate to its caller that a module file is missing (rather
than simply being out-of-date), allowing us to simplify the
module-loading logic and allowing the compiler to recover if a
dependent module file ends up getting deleted.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177367 91177308-0d34-0410-b5e6-96231b3b80d8
13 files changed:
include/clang/Serialization/ASTReader.h
include/clang/Serialization/GlobalModuleIndex.h
include/clang/Serialization/ModuleManager.h
lib/Frontend/ASTUnit.cpp
lib/Frontend/ChainedIncludesSource.cpp
lib/Frontend/CompilerInstance.cpp
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp
lib/Serialization/GlobalModuleIndex.cpp
lib/Serialization/ModuleManager.cpp
test/Modules/Inputs/Modified/B.h
test/Modules/Inputs/Modified/module.map
test/Modules/modify-module.m