[Lldb-commits] [PATCH] D30702: Fix remaining threading issues in Log.h
Zachary Turner via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Tue Mar 7 13:46:07 PST 2017
zturner added inline comments.
================
Comment at: source/Utility/Log.cpp:90-91
uint32_t options, uint32_t flags) {
- log.GetMask().Set(flags);
- if (log.GetMask().Get()) {
- log.GetOptions().Reset(options);
+ uint32_t mask = log.m_mask.load(std::memory_order_acquire) | flags;
+ log.m_mask.store(mask, std::memory_order_release);
+ if (mask) {
----------------
How about
```
uint32_t old_mask = log.m_mask.fetch_or(flags);
if (old_mask & flags) {
...
}
```
Also, there is still a race if two people call this function at the same time.
================
Comment at: source/Utility/Log.cpp:103-104
return;
- log->GetMask().Clear(flags);
- if (!log->GetMask().Get()) {
+ uint32_t mask = log->m_mask.load(std::memory_order_acquire) & ~flags;
+ log->m_mask.store(mask, std::memory_order_release);
+ if (!mask) {
----------------
```
uint32_t old_mask = log->m_mask.fetch_and(~flags);
if (!(old_mask & ~flags)) {
...
}
```
================
Comment at: source/Utility/Log.cpp:116
+const Flags Log::GetMask() const {
+ return m_mask.load(std::memory_order_acquire);
+}
----------------
Any reason you always use the explicit `load(memory_order_acquire)` syntax instead of using the default sequentially consistent ordering?
https://reviews.llvm.org/D30702
More information about the lldb-commits
mailing list