diff options
Diffstat (limited to 'lldb/source/Host/common/Host.cpp')
-rw-r--r-- | lldb/source/Host/common/Host.cpp | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp index eb45f4a82a5..e5a0f339e9d 100644 --- a/lldb/source/Host/common/Host.cpp +++ b/lldb/source/Host/common/Host.cpp @@ -12,6 +12,7 @@ // C includes #include <errno.h> #include <limits.h> +#include <stdlib.h> #include <sys/types.h> #ifdef _WIN32 #include "lldb/Host/windows/windows.h" @@ -1008,6 +1009,20 @@ Host::GetModuleFileSpecForHostAddress (const void *host_addr) #endif + +static void CleanupProcessSpecificLLDBTempDir () +{ + // Get the process specific LLDB temporary directory and delete it. + FileSpec tmpdir_file_spec; + if (Host::GetLLDBPath (ePathTypeLLDBTempSystemDir, tmpdir_file_spec)) + { + // Remove the LLDB temporary directory if we have one. Set "recurse" to + // true to all files that were created for the LLDB process can be cleaned up. + const bool recurse = true; + Host::RemoveDirectory(tmpdir_file_spec.GetDirectory().GetCString(), recurse); + } +} + bool Host::GetLLDBPath (PathType path_type, FileSpec &file_spec) { @@ -1279,9 +1294,22 @@ Host::GetLLDBPath (PathType path_type, FileSpec &file_spec) } if (tmpdir_cstr) { - g_lldb_tmp_dir.SetCString(tmpdir_cstr); - if (log) - log->Printf("Host::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_lldb_tmp_dir.GetCString()); + StreamString pid_tmpdir; + pid_tmpdir.Printf("%s/lldb", tmpdir_cstr); + if (Host::MakeDirectory(pid_tmpdir.GetString().c_str(), eFilePermissionsDirectoryDefault).Success()) + { + pid_tmpdir.Printf("/%" PRIu64, Host::GetCurrentProcessID()); + if (Host::MakeDirectory(pid_tmpdir.GetString().c_str(), eFilePermissionsDirectoryDefault).Success()) + { + // Make an atexit handler to clean up the process specify LLDB temp dir + // and all of its contents. + ::atexit (CleanupProcessSpecificLLDBTempDir); + g_lldb_tmp_dir.SetCString(pid_tmpdir.GetString().c_str()); + if (log) + log->Printf("Host::GetLLDBPath(ePathTypeLLDBTempSystemDir) => '%s'", g_lldb_tmp_dir.GetCString()); + + } + } } } file_spec.GetDirectory() = g_lldb_tmp_dir; @@ -2141,6 +2169,14 @@ Host::Unlink (const char *path) return error; } +Error +Host::RemoveDirectory (const char* path, bool recurse) +{ + Error error; + error.SetErrorStringWithFormat("%s is not supported on this host", __PRETTY_FUNCTION__); + return error; +} + #else Error @@ -2189,6 +2225,33 @@ Host::MakeDirectory (const char* path, uint32_t file_permissions) } return error; } + +Error +Host::RemoveDirectory (const char* path, bool recurse) +{ + Error error; + if (path && path[0]) + { + if (recurse) + { + StreamString command; + command.Printf("rm -rf \"%s\"", path); + int status = ::system(command.GetString().c_str()); + if (status != 0) + error.SetError(status, eErrorTypeGeneric); + } + else + { + if (::rmdir(path) != 0) + error.SetErrorToErrno(); + } + } + else + { + error.SetErrorString("empty path"); + } + return error; +} Error Host::GetFilePermissions (const char* path, uint32_t &file_permissions) |