From 24224530d1f4a70808d003ba8dce849b77625b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 19 Nov 2021 14:53:25 +0100 Subject: [PATCH] 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'. --- nix/libutil/util.cc | 9 ++++++--- 1 file 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); }