As a final cleanup to these changes, can we get get rid of the preprocessor 
macro in the HostInfo::GetLLDBPath() and change over to using std::once, or 
switch to using a static HostInfo::Initialize()?

> On Aug 25, 2014, at 11:42 AM, Zachary Turner <ztur...@google.com> wrote:
> 
> I've had some questions (both privately and in responses to other messages 
> on-list) about Host and HostInfo.  So I'll explain here in hopes of answering 
> for everyone.
> 
> First, the rationale: Host was getting too big and was starting to turn into 
> something like "well, I need to call a platform-specific API, I'll make it a 
> static method in Host.cpp".  As the platform matrix grows, so does the 
> complexity of managing this file.  Second, there was no attempt in Host.cpp 
> to group logically similar methods together in classes.  There were 
> filesystem methods, process spawning methods, thread manipulation methods, 
> methods to query the value of various os magic numbers, etc.  As I started 
> thinking about what will need to happen to support various things on Windows, 
> I imagined this file exploding in complexity.  Even with HostWindows.cpp, you 
> can see from looking at Host.cpp that it's not always possible or easy to 
> separate platform-specific logic into the platform specific Host files.
> 
> So this refactor attempts to address all of these issues.
> 
> So far I've been focused on (and mostly completed) moving code from Host into 
> two different classes:  Filesystem and HostInfo.   
> 
> HostInfo - answers queries about the operating system that LLDB is running 
> on.  Think of this class as being "const".  It doesn't modify your OS.  If 
> you want to know how much memory is available, or the page size, or the path 
> to lldb.exe, you ask HostInfo.  Instead of #include "Host.h" and writing 
> Host::method(), you #include "HostInfo.h" and write HostInfo::method().  When 
> adding new methods, put your method in the least-derived class possible where 
> it makes sense and will compile on all corresponding platforms.  
> 
> The advantage to this approach is that 
> a) No matter what host OS you're on, you always have all the functionality of 
> that host OS available to you through static binding (e.g. no casting to a 
> derived type)
> b) Almost zero pre-processor complexity
> 
> FileSystem - Has methods like MakeDirectory, RemoveDirectory, GetPermissions, 
> etc.  Where before you would #include "Host.h" and write 
> Host::MakeDirectory(), now you #include "FileSystem.h" and write 
> FileSystem::MakeDirectory(...).
> 
> Remaining work to be done:
> 1) Nuke DynamicLibrary and use LLVM's
> 2) Make a HostProcess instantiatable, non-static class, which represents a 
> process which is running on the Host OS.  Move code from Host.cpp over there.
> 3) Make a HostThread instantiatable, non-static class, which represents a 
> thread inside of a process on the Host OS.  Move code from Host.cpp over 
> there.
> 4) Make a HostProcessLauncher class, of which derived implementations would 
> be WindowsProcessLauncher, PosixSpawnProcessLauncher, XpcProcessLauncher, 
> etc.  Move code from Host.cpp over there.
> 5) Update Process plugins to use the appropriate HostProcessLauncher classes
> 6) Delete Host.cpp, as there will be no code left in it anymore.
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

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

Reply via email to