We already have global place for intialization:

lldb_private::Initialize ()

This is in lldb.cpp. Feel free to add a HostInfoBase::Initialize() to this 
function. This will solve your problems.

Greg

On Aug 21, 2014, at 10:10 AM, Zachary Turner <ztur...@google.com> wrote:
> 
> 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.
> 
> 
> On Thu, Aug 21, 2014 at 10:09 AM, Zachary Turner <ztur...@google.com> wrote:
> 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:
> 
> // HostInfoBase.h
> class HostInfoBase
> {
> public:
>     static void Initialize();
> 
> private:
>     static HostInfoFields *m_fields;
> };
> 
> // HostInfoBase.cpp
> 
> struct HostInfoFields
> {
>     uint32_t m_number_cpus;
>     std::string m_lldb_shared_library_path;
>     // etc
> };
> 
> HostInfoFields *HostInfoBase::m_fields = nullptr;
> 
> void HostInfoBase::Initialize()
> {
>     m_fields = new HostInfoFields();
> }
> 
> // lldb-main.cpp
> int main(int argc, char **argv)
> {
>     HostInfo::Initialize();
> }
> 
> 
> Thoughts?
> 
> 
> On Thu, Aug 21, 2014 at 10:03 AM, Greg Clayton <gclay...@apple.com> wrote:
> 
> > On Aug 20, 2014, at 2:36 PM, Zachary Turner <ztur...@google.com> wrote:
> >
> > 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.
> >
> > 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.
> >
> > 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.
> >
> > Thoughts?
> 
> 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.
> 
> I would suggest using std::once for any issues you run into:
> 
> static std::once_flag g_once_flag;
> std::call_once(g_once_flag, [](){
>     // Insert code here to run once in a thread safe way
> });
> 
> 
> 
> 
> 

_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to