From 4b3bd422534277d9753c2c24cbf310e9c288b7c5 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Sun, 6 Apr 2014 03:21:44 +0000 Subject: [PATCH] [Frontend] If the module file lock owner have died, try to get the lock again. Needs llvm r205683. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205684 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Frontend/CompilerInstance.cpp | 55 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index ce47674edb..f12f6303f0 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -770,31 +770,10 @@ static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { /// \brief Compile a module file for the given module, using the options /// provided by the importing compiler instance. -static void compileModule(CompilerInstance &ImportingInstance, +static void compileModuleImpl(CompilerInstance &ImportingInstance, SourceLocation ImportLoc, Module *Module, StringRef ModuleFileName) { - // FIXME: have LockFileManager return an error_code so that we can - // avoid the mkdir when the directory already exists. - StringRef Dir = llvm::sys::path::parent_path(ModuleFileName); - llvm::sys::fs::create_directories(Dir); - - llvm::LockFileManager Locked(ModuleFileName); - switch (Locked) { - case llvm::LockFileManager::LFS_Error: - return; - - case llvm::LockFileManager::LFS_Owned: - // We're responsible for building the module ourselves. Do so below. - break; - - case llvm::LockFileManager::LFS_Shared: - // Someone else is responsible for building the module. Wait for them to - // finish. - Locked.waitForUnlock(); - return; - } - ModuleMap &ModMap = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap(); @@ -914,6 +893,38 @@ static void compileModule(CompilerInstance &ImportingInstance, } } +static void compileModule(CompilerInstance &ImportingInstance, + SourceLocation ImportLoc, + Module *Module, + StringRef ModuleFileName) { + // FIXME: have LockFileManager return an error_code so that we can + // avoid the mkdir when the directory already exists. + StringRef Dir = llvm::sys::path::parent_path(ModuleFileName); + llvm::sys::fs::create_directories(Dir); + + while (1) { + llvm::LockFileManager Locked(ModuleFileName); + switch (Locked) { + case llvm::LockFileManager::LFS_Error: + return; + + case llvm::LockFileManager::LFS_Owned: + // We're responsible for building the module ourselves. Do so below. + break; + + case llvm::LockFileManager::LFS_Shared: + // Someone else is responsible for building the module. Wait for them to + // finish. + if (Locked.waitForUnlock() == llvm::LockFileManager::Res_OwnerDied) + continue; // try again to get the lock. + return; + } + + return compileModuleImpl(ImportingInstance, ImportLoc, Module, + ModuleFileName); + } +} + /// \brief Diagnose differences between the current definition of the given /// configuration macro and the definition provided on the command line. static void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro, -- 2.40.0