[Libreoffice-commits] online.git: common/FileUtil.cpp common/FileUtil.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Jan 30 05:10:27 UTC 2017


 common/FileUtil.cpp |   39 +++++++++++++++++++++++++++++++++++++++
 common/FileUtil.hpp |   12 +-----------
 2 files changed, 40 insertions(+), 11 deletions(-)

New commits:
commit 0d4d506ea39d43beeccff54935b72485cb3fd545
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Mon Jan 30 00:04:10 2017 -0500

    wsd: faster jail directory cleanup
    
    Around 1.5x faster than Poco,
    which first enumerates files into
    a container, then iterates over
    them and stats before unlinking.
    
    Here we enumerate and unlink in
    a single pass.
    
    Change-Id: I79d1c0f1b5ec557ccc4f0e2ec7a0609051d8d212
    Reviewed-on: https://gerrit.libreoffice.org/33680
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/common/FileUtil.cpp b/common/FileUtil.cpp
index 8973d72..078379b 100644
--- a/common/FileUtil.cpp
+++ b/common/FileUtil.cpp
@@ -10,6 +10,7 @@
 #include "FileUtil.hpp"
 #include "config.h"
 
+#include <ftw.h>
 #include <sys/stat.h>
 #include <sys/vfs.h>
 
@@ -114,6 +115,44 @@ namespace FileUtil
         }
     }
 
+    static int nftw_cb(const char *fpath, const struct stat*, int type, struct FTW*)
+    {
+        if (type == FTW_DP)
+        {
+            rmdir(fpath);
+        }
+        else if (type == FTW_F || type == FTW_SL)
+        {
+            unlink(fpath);
+        }
+
+        // Always continue even when things go wrong.
+        return 0;
+    }
+
+    void removeFile(const std::string& path, const bool recursive)
+    {
+        try
+        {
+            struct stat sb;
+            if (!recursive || stat(path.c_str(), &sb) == -1 || S_ISREG(sb.st_mode))
+            {
+                // Non-recursive directories, and files.
+                Poco::File(path).remove(recursive);
+            }
+            else
+            {
+                // Directories only.
+                nftw(path.c_str(), nftw_cb, 128, FTW_DEPTH | FTW_PHYS);
+            }
+        }
+        catch (const std::exception&)
+        {
+            // Already removed or we don't care about failures.
+        }
+    }
+
+
 } // namespace FileUtil
 
 namespace
diff --git a/common/FileUtil.hpp b/common/FileUtil.hpp
index c8e7a3f..0a172b9 100644
--- a/common/FileUtil.hpp
+++ b/common/FileUtil.hpp
@@ -63,17 +63,7 @@ namespace FileUtil
     /// Supresses exception when the file is already removed.
     /// This can happen when there is a race (unavoidable) or when
     /// we don't care to check before we remove (when no race exists).
-    inline void removeFile(const std::string& path, const bool recursive = false)
-    {
-        try
-        {
-            Poco::File(path).remove(recursive);
-        }
-        catch (const std::exception&)
-        {
-            // Already removed or we don't care about failures.
-        }
-    }
+    void removeFile(const std::string& path, const bool recursive = false);
 
     inline void removeFile(const Poco::Path& path, const bool recursive = false)
     {


More information about the Libreoffice-commits mailing list