[Lldb-commits] [PATCH] D29288: Switch std::call_once to llvm::call_once

Kamil Rytarowski via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Sat Feb 4 18:47:32 PST 2017


krytarowski added inline comments.


================
Comment at: include/lldb/Core/Debugger.h:379
   lldb::ListenerSP m_forward_listener_sp;
-  std::once_flag m_clear_once;
+  llvm::once_flag m_clear_once;
 
----------------
labath wrote:
> The code in llvm says you should only ever use the LLVM_DEFINE_ONCE_FLAG to declare flags. I am guessing it's because it forces the `static` keyword into the declaration, which in turn guarantees your object will be zero-initialized by the linker. If you declare the flag as a local variable like this, it will be initialized to a random value, and you will have a fun time debugging issues in the future (it will only affect netbsd, as std::call_once platforms will still be correctly initialized).
I was thinking about it, there is `m_clear_once()` in  `lldb/source/Core/Debugger.cpp` used in the initializer. But apparently there is no zeroing it with this.

Similar case is in DWARFDataSegment.

```
struct DWARFDataSegment {
    llvm::once_flag m_flag;
    lldb_private::DWARFDataExtractor m_data;
  };
```

And another one with `static llvm::ManagedStatic<llvm::once_flag> g_once_flag;` (I don't fully understand the impact here).

Is there an option to turn `llvm::once_flag` to behave like `std::once_flag`? For example changing once_flag to a class like:

```
class once_flag
{
once_flag() : status(Uninitialized) {};
llvm::sys::cas_flag status;
};
```

and replace occurrences of `flag` with `flag.status`.

Perhaps it would change the code to mechanical replacement of `std::once_flag` and `std::call_ones` to `llvm::` versions.


Repository:
  rL LLVM

https://reviews.llvm.org/D29288





More information about the lldb-commits mailing list