diff options
author | DeLesley Hutchins <delesley@google.com> | 2012-07-02 21:59:24 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2012-07-02 21:59:24 +0000 |
commit | c4a6e515969a3f62100673cf4d400eaee0d9df82 (patch) | |
tree | 7cd514ac0a5f0c62dbd069308a3986432309ac85 /clang | |
parent | f0190752711546267a9e4ffd47b285c0ba0d1bc5 (diff) | |
download | bcm5719-llvm-c4a6e515969a3f62100673cf4d400eaee0d9df82.tar.gz bcm5719-llvm-c4a6e515969a3f62100673cf4d400eaee0d9df82.zip |
Thread Safety Analysis: turn off checking within trylock functions.
llvm-svn: 159601
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Analysis/ThreadSafety.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 27 |
2 files changed, 33 insertions, 0 deletions
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp index fd4551b975d..7406f324ae5 100644 --- a/clang/lib/Analysis/ThreadSafety.cpp +++ b/clang/lib/Analysis/ThreadSafety.cpp @@ -1654,6 +1654,12 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) { } else if (isa<SharedLockFunctionAttr>(Attr)) { // Don't try to check lock functions for now return; + } else if (isa<ExclusiveTrylockFunctionAttr>(Attr)) { + // Don't try to check trylock functions for now + return; + } else if (isa<SharedTrylockFunctionAttr>(Attr)) { + // Don't try to check trylock functions for now + return; } } } diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp index 1c47035c2b2..cda25142387 100644 --- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp @@ -2403,6 +2403,33 @@ void Foo::test3() { } // end namespace ReleasableScopedLock +namespace TrylockFunctionTest { + +class Foo { +public: + Mutex mu1_; + Mutex mu2_; + bool c; + + bool lockBoth() EXCLUSIVE_TRYLOCK_FUNCTION(true, mu1_, mu2_); +}; + +bool Foo::lockBoth() { + if (!mu1_.TryLock()) + return false; + + mu2_.Lock(); + if (!c) { + mu1_.Unlock(); + mu2_.Unlock(); + return false; + } + + return true; +} + + +} // end namespace TrylockFunctionTest |