[PATCH] D52578: Thread safety analysis: Allow scoped releasing of capabilities
Delesley Hutchins via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 27 15:53:37 PDT 2018
delesley added inline comments.
================
Comment at: lib/Analysis/ThreadSafety.cpp:893
private:
- SmallVector<const til::SExpr *, 4> UnderlyingMutexes;
+ enum UnderlyingCapabilityKind {
+ UCK_Acquired, ///< Any kind of acquired capability.
----------------
IMHO, it would make more sense to break this into two properties (or bits): acquired/released and shared/exclusive.
================
Comment at: lib/Analysis/ThreadSafety.cpp:916
+ for (const auto &M : ShrdRel)
+ UnderlyingMutexes.emplace_back(M.sexpr(), UCK_ReleasedExclusive);
}
----------------
UCK_ReleasedShared? (Shouldn't this have been caught by a test case?)
================
Comment at: lib/Analysis/ThreadSafety.cpp:926
+ FactMan, CapabilityExpr(UnderlyingMutex.getPointer(), false));
+ if ((UnderlyingMutex.getInt() == UCK_Acquired) == (Entry != nullptr)) {
// If this scoped lock manages another mutex, and if the underlying
----------------
This if statement makes my head hurt. Can you find a different way of expressing it?
================
Comment at: lib/Analysis/ThreadSafety.cpp:951
+ }
} else {
+ // We're removing the underlying mutex. Warn on double unlocking.
----------------
I find this very confusing. A lock here unlocks the underlying mutex, and vice versa. At the very least, some methods need to be renamed, or maybe we can have separate classes for ScopedLockable and ScopedUnlockable.
================
Comment at: lib/Analysis/ThreadSafety.cpp:992
+ FSet.removeLock(FactMan, UnderCp);
+ FSet.addLock(FactMan, std::move(UnderEntry));
+ }
----------------
Shouldn't this be outside of the else?
Repository:
rC Clang
https://reviews.llvm.org/D52578
More information about the cfe-commits
mailing list