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



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to