[PATCH] D49885: Thread safety analysis: Allow relockable scopes
Aaron Puchert via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 26 16:47:44 PDT 2018
aaronpuchert added a comment.
Imagine having a producer loop, where we check a loop condition while holding a mutex, but release it in the loop body to let other producers/consumers do their work. In that scenario it makes sense to allow "relocking" a scope.
RelockableScope Scope(mu);
while (WorkToDo()) {
Scope.Unlock();
// Produce something...
Scope.Lock();
PublishWork();
}
================
Comment at: lib/Analysis/ThreadSafety.cpp:960-961
+ FSet.removeLock(FactMan, !UnderCp);
+ FSet.addLock(FactMan, llvm::make_unique<LockableFactEntry>(UnderCp, LK,
+ RelockLoc));
+ }
----------------
Looks a bit weird, but `clang-format` told me to do that.
================
Comment at: lib/Analysis/ThreadSafety.cpp:1318-1321
+ // FIXME: It's possible to manually destruct the scope and then relock it.
+ // Should that be a separate warning? For now we pretend nothing happened.
+ // It's undefined behavior, so not related to thread safety.
+ return;
----------------
Not sure about this part, but it's probably not worth worrying about. A user would have to call a member function on a scoped object after manually ending its lifetime by calling the destructor, see test `RelockableScopedLock::destructLock`.
================
Comment at: lib/Analysis/ThreadSafety.cpp:1324-1325
+
+ // We should only land here if Cp is a scoped capability, so if we have any
+ // fact, it must be a ScopedLockableFactEntry.
+ auto SLDat = static_cast<const ScopedLockableFactEntry *>(LDat);
----------------
I hope this reasoning is sufficient to justify the following static_cast, otherwise I need to introduce LLVM-style RTTI into `FactEntry`.
Repository:
rC Clang
https://reviews.llvm.org/D49885
More information about the cfe-commits
mailing list