[clang-tools-extra] r296737 - [clangd] Fix a potential race by copying the FixIts out of ASTManager before releasing the lock.
Benjamin Kramer via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 2 02:25:00 PST 2017
Author: d0k
Date: Thu Mar 2 04:25:00 2017
New Revision: 296737
URL: http://llvm.org/viewvc/llvm-project?rev=296737&view=rev
Log:
[clangd] Fix a potential race by copying the FixIts out of ASTManager before releasing the lock.
Also document the locking semantics a bit better.
Modified:
clang-tools-extra/trunk/clangd/ASTManager.cpp
clang-tools-extra/trunk/clangd/ASTManager.h
clang-tools-extra/trunk/clangd/DocumentStore.h
Modified: clang-tools-extra/trunk/clangd/ASTManager.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ASTManager.cpp?rev=296737&r1=296736&r2=296737&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ASTManager.cpp (original)
+++ clang-tools-extra/trunk/clangd/ASTManager.cpp Thu Mar 2 04:25:00 2017
@@ -224,11 +224,11 @@ ASTManager::createASTUnitForFile(StringR
/*AllowPCHWithCompilerErrors=*/true));
}
-llvm::ArrayRef<clang::tooling::Replacement>
+std::vector<clang::tooling::Replacement>
ASTManager::getFixIts(const clangd::Diagnostic &D) {
std::lock_guard<std::mutex> Guard(FixItLock);
auto I = FixIts.find(D);
if (I != FixIts.end())
return I->second;
- return llvm::None;
+ return {};
}
Modified: clang-tools-extra/trunk/clangd/ASTManager.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ASTManager.h?rev=296737&r1=296736&r2=296737&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ASTManager.h (original)
+++ clang-tools-extra/trunk/clangd/ASTManager.h Thu Mar 2 04:25:00 2017
@@ -39,7 +39,10 @@ public:
// FIXME: Implement codeComplete
/// Get the fixes associated with a certain diagnostic as replacements.
- llvm::ArrayRef<clang::tooling::Replacement>
+ ///
+ /// This function is thread-safe. It returns a copy to avoid handing out
+ /// references to unguarded data.
+ std::vector<clang::tooling::Replacement>
getFixIts(const clangd::Diagnostic &D);
DocumentStore &getStore() const { return Store; }
Modified: clang-tools-extra/trunk/clangd/DocumentStore.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/DocumentStore.h?rev=296737&r1=296736&r2=296737&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/DocumentStore.h (original)
+++ clang-tools-extra/trunk/clangd/DocumentStore.h Thu Mar 2 04:25:00 2017
@@ -49,6 +49,9 @@ public:
Listener->onDocumentRemove(Uri);
}
/// Retrieve a document from the store. Empty string if it's unknown.
+ ///
+ /// This function is thread-safe. It returns a copy to avoid handing out
+ /// references to unguarded data.
std::string getDocument(StringRef Uri) const {
// FIXME: This could be a reader lock.
std::lock_guard<std::mutex> Guard(DocsMutex);
@@ -59,6 +62,9 @@ public:
void addListener(DocumentStoreListener *DSL) { Listeners.push_back(DSL); }
/// Get name and constents of all documents in this store.
+ ///
+ /// This function is thread-safe. It returns a copies to avoid handing out
+ /// references to unguarded data.
std::vector<std::pair<std::string, std::string>> getAllDocuments() const {
std::vector<std::pair<std::string, std::string>> AllDocs;
std::lock_guard<std::mutex> Guard(DocsMutex);
More information about the cfe-commits
mailing list