Author: labath
Date: Thu Oct 15 09:44:29 2015
New Revision: 250409

URL: http://llvm.org/viewvc/llvm-project?rev=250409&view=rev
Log:
Fix temporary directory computation on linux (pr25147)

On linux, the environment variables for temp directories that lldb checks for 
are generally not
defined, and the temp directory computation failed. This caused expression 
evaluation to fall
back to creating "/tmp/lldb-*.expr" debugging files instead of the usual
"$TMP/lldb/pid/lldb-*.expr". Crucially, these files were not cleaned up on lldb 
exit, which
caused clutter in the /tmp folder, especially on long-running machines (e.g. 
builtbots). This
commit fixes lldb to use llvm::sys::path::system_temp_directory, which does the 
same environment
variable dance, but (!) also falls back to the P_tmpdir macro, which is how the 
temp directory is
defined on linux.

Since the linux temp path computation now succeeds, I needed to also modify 
Android path
computation to check for actual directory existence, rather then checking 
whether the operation
failed.

Modified:
    lldb/trunk/source/Host/android/HostInfoAndroid.cpp
    lldb/trunk/source/Host/common/HostInfoBase.cpp

Modified: lldb/trunk/source/Host/android/HostInfoAndroid.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/android/HostInfoAndroid.cpp?rev=250409&r1=250408&r2=250409&view=diff
==============================================================================
--- lldb/trunk/source/Host/android/HostInfoAndroid.cpp (original)
+++ lldb/trunk/source/Host/android/HostInfoAndroid.cpp Thu Oct 15 09:44:29 2015
@@ -91,11 +91,14 @@ HostInfoAndroid::ResolveLibraryPath(cons
 bool
 HostInfoAndroid::ComputeTempFileBaseDirectory(FileSpec &file_spec)
 {
-    if (HostInfoLinux::ComputeTempFileBaseDirectory(file_spec))
-        return true;
+    bool success = HostInfoLinux::ComputeTempFileBaseDirectory(file_spec);
 
-    // If the default mechanism for computing the temp directory failed then
-    // fall back to /data/local/tmp
-    file_spec = FileSpec("/data/local/tmp", false);
-    return true;
+    // On Android, there is no path which is guaranteed to be writable. If the 
user has not
+    // provided a path via an environment variable, the generic algorithm will 
deduce /tmp, which
+    // is plain wrong. In that case we have an invalid directory, we 
substitute the path with
+    // /data/local/tmp, which is correct at least in some cases (i.e., when 
running as shell user).
+    if (!success || !file_spec.Exists())
+        file_spec = FileSpec("/data/local/tmp", false);
+
+    return file_spec.Exists();
 }

Modified: lldb/trunk/source/Host/common/HostInfoBase.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/HostInfoBase.cpp?rev=250409&r1=250408&r2=250409&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/HostInfoBase.cpp (original)
+++ lldb/trunk/source/Host/common/HostInfoBase.cpp Thu Oct 15 09:44:29 2015
@@ -20,6 +20,7 @@
 #include "llvm/ADT/Triple.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/Host.h"
+#include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"
 
 #include <thread>
@@ -344,19 +345,9 @@ HostInfoBase::ComputeProcessTempFileDire
 bool
 HostInfoBase::ComputeTempFileBaseDirectory(FileSpec &file_spec)
 {
-    file_spec.Clear();
-
-    const char *tmpdir_cstr = getenv("TMPDIR");
-    if (tmpdir_cstr == nullptr)
-    {
-        tmpdir_cstr = getenv("TMP");
-        if (tmpdir_cstr == nullptr)
-            tmpdir_cstr = getenv("TEMP");
-    }
-    if (!tmpdir_cstr)
-        return false;
-
-    file_spec = FileSpec(tmpdir_cstr, false);
+    llvm::SmallVector<char, 16> tmpdir;
+    llvm::sys::path::system_temp_directory(/*ErasedOnReboot*/ true, tmpdir);
+    file_spec = FileSpec(std::string(tmpdir.data(), tmpdir.size()), true);
     return true;
 }
 


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to