<div dir="ltr">BTW, another problem with std::call_once is that, like thread-safe function local statics as well, any kind of thread synchronization is undesirable if it can be avoided.</div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On Thu, Aug 21, 2014 at 10:09 AM, Zachary Turner <span dir="ltr"><<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">std::call_once would solve the problem, but it's also going to be ugly putting that all over the place.  Another potential solution is to do something like this:<div><br></div><div>// HostInfoBase.h</div>

<div>class HostInfoBase</div><div>{</div><div>public:</div><div>    static void Initialize();</div><div><br></div><div>private:</div><div>    static HostInfoFields *m_fields;</div><div>};</div><div><br></div><div>// HostInfoBase.cpp</div>

<div><br></div><div>struct HostInfoFields<br></div><div>{</div><div>    uint32_t m_number_cpus;</div><div>    std::string m_lldb_shared_library_path;</div><div>    // etc</div><div>};</div><div><br></div><div>HostInfoFields *HostInfoBase::m_fields = nullptr;</div>

<div><br></div><div>void HostInfoBase::Initialize()</div><div>{</div><div>    m_fields = new HostInfoFields();</div><div>}</div><div><br></div><div>// lldb-main.cpp</div><div>int main(int argc, char **argv)</div><div>{</div>

<div>    HostInfo::Initialize();</div><div>}</div><div><br></div><div><br></div><div>Thoughts?</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 21, 2014 at 10:03 AM, Greg Clayton <span dir="ltr"><<a href="mailto:gclayton@apple.com" target="_blank">gclayton@apple.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><br>
> On Aug 20, 2014, at 2:36 PM, Zachary Turner <<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>> wrote:<br>
><br>
> As part of my moving code from Host to HostInfo, I moved some function-local statics to global class-member statics.  The reason for this is that MSVC doesn't support thread-safe function local statics until VS2014, which is still only in technology preview, whereas LLVM, clang, and by extension LLDB support building as far back as VS2012.<br>


><br>
> Greg submitted r216080 to convert these global statics back to function-local statics, but this had a bug in it which broke things for all platforms, so I reverted it in r216123.  A simple fix would have just been to address the bug, but my original transition from function-local statics to global statics was intentional due to the fact that any use of them on a non-primitive type is undefined behavior on MSVC.<br>


><br>
> So, I want to see if people have a strong preference one way or the other.  If the issue is just silencing the compiler warning that clang gives about global constructors, then we can do that in CMake and/or the Xcode project.  On the other hand, I understand that global static constructors increase application startup times.  Is this a concern for anyone?  If so, I can try to come up with a solution.  I think if we try to keep the use of statics to a minimum, and make sure that they are generally simple types (e.g std::string, which simply does a malloc), then there should be no noticeable performance impact on startup.<br>


><br>
> Thoughts?<br>
<br>
</div></div>For our build submissions here at Apple we need to keep the number of global constructors to a minimum. We need to apply for exceptions for each global constructor that is added to a shared library or framework. This is the main reason for the change I made. global constructors are fine for apps and they get to make that decision, but for shared libraries, they should be avoided if possible.<br>


<br>
I would suggest using std::once for any issues you run into:<br>
<br>
static std::once_flag g_once_flag;<br>
std::call_once(g_once_flag, [](){<br>
    // Insert code here to run once in a thread safe way<br>
});<br>
<br>
<br>
<br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>