aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-11-19 14:53:25 +0100
committerLudovic Courtès <ludo@gnu.org>2021-11-19 23:04:19 +0100
commit24224530d1f4a70808d003ba8dce849b77625b79 (patch)
tree553e894234a993037eeb90a3a3074ecf28c36c96
parent256c3e714a459af6db2343c9120c7180c5a14462 (diff)
downloadguix-24224530d1f4a70808d003ba8dce849b77625b79.tar.gz
guix-24224530d1f4a70808d003ba8dce849b77625b79.zip
daemon: Micro-optimize 'deletePath'.
'remove' calls 'unlink' first and falls back to 'rmdir' upon EISDIR. This change gets rid of the 'unlink' call for every directory being removed. * nix/libutil/util.cc (_deletePath): Call 'unlink' or 'rmdir' depending on 'st.st_mode', rather than call 'remove'.
-rw-r--r--nix/libutil/util.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc
index 69f1c634a9..4d3780e3c2 100644
--- a/nix/libutil/util.cc
+++ b/nix/libutil/util.cc
@@ -337,12 +337,15 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed, size
for (auto & i : readDirectory(path))
_deletePath(path + "/" + i.name, bytesFreed, linkThreshold);
}
+
+ int ret;
+ ret = S_ISDIR(st.st_mode) ? rmdir(path.c_str()) : unlink(path.c_str());
+ if (ret == -1)
+ throw SysError(format("cannot unlink `%1%'") % path);
+
#undef st_mode
#undef st_size
#undef st_nlink
-
- if (remove(path.c_str()) == -1)
- throw SysError(format("cannot unlink `%1%'") % path);
}