]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
refactor: Introduce and use DEFER macro, replacing util::Finalizer
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 30 Jun 2024 19:22:26 +0000 (21:22 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Tue, 2 Jul 2024 21:08:56 +0000 (23:08 +0200)
src/ccache/ccache.cpp
src/ccache/core/common.cpp
src/ccache/execute.cpp
src/ccache/inodecache.cpp
src/ccache/util/defer.hpp [moved from src/ccache/util/finalizer.hpp with 64% similarity]
src/ccache/util/direntry.cpp
src/ccache/util/file.cpp
unittest/test_bsdmkstemp.cpp
unittest/test_util_direntry.cpp

index bd1e2cd523189286ccf8dc83fc8ff7ada95065f1..5e0c7cd57c8bfee5570a8a4fc34b5230bb7cf4ee 100644 (file)
@@ -47,6 +47,7 @@
 #include <ccache/util/assertions.hpp>
 #include <ccache/util/bytes.hpp>
 #include <ccache/util/conversion.hpp>
+#include <ccache/util/defer.hpp>
 #include <ccache/util/direntry.hpp>
 #include <ccache/util/duration.hpp>
 #include <ccache/util/environment.hpp>
@@ -55,7 +56,6 @@
 #include <ccache/util/file.hpp>
 #include <ccache/util/filestream.hpp>
 #include <ccache/util/filesystem.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/format.hpp>
 #include <ccache/util/logging.hpp>
 #include <ccache/util/path.hpp>
@@ -2438,7 +2438,7 @@ cache_compilation(int argc, const char* const* argv)
     ctx.initialize(std::move(argv_parts.compiler_and_args),
                    argv_parts.config_settings);
     SignalHandler signal_handler(ctx);
-    util::Finalizer finalizer([&ctx] { finalize_at_exit(ctx); });
+    DEFER(finalize_at_exit(ctx));
 
     initialize(ctx, argv, argv_parts.masquerading_as_compiler);
 
index 78c733e25007e73f39ab0c57380e2d85da99e7e2..6e0ab656d1e18977ceffbbc54fc3a59a7c34fd46 100644 (file)
 
 #include <ccache/context.hpp>
 #include <ccache/core/exceptions.hpp>
+#include <ccache/util/defer.hpp>
 #include <ccache/util/expected.hpp>
 #include <ccache/util/file.hpp>
 #include <ccache/util/filesystem.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/format.hpp>
 #include <ccache/util/path.hpp>
 #include <ccache/util/tokenizer.hpp>
@@ -134,7 +134,7 @@ send_to_console(const Context& ctx, std::string_view text, int fd)
   // newlines a second time since we treat output as binary data. Make sure to
   // switch to binary mode.
   int oldmode = _setmode(fd, _O_BINARY);
-  util::Finalizer binary_mode_restorer([=] { _setmode(fd, oldmode); });
+  DEFER(_setmode(fd, oldmode));
 #endif
 
   if (ctx.args_info.strip_diagnostics_colors) {
index 6359c17674eccd9f9a6fbd1613f459f62b6558af..3b5f836fd6ada7d18291a3e556dbf47d3fa75be9 100644 (file)
 #include <ccache/context.hpp>
 #include <ccache/core/exceptions.hpp>
 #include <ccache/signalhandler.hpp>
+#include <ccache/util/defer.hpp>
 #include <ccache/util/direntry.hpp>
 #include <ccache/util/error.hpp>
 #include <ccache/util/expected.hpp>
 #include <ccache/util/fd.hpp>
 #include <ccache/util/file.hpp>
 #include <ccache/util/filesystem.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/format.hpp>
 #include <ccache/util/logging.hpp>
 #include <ccache/util/path.hpp>
@@ -224,7 +224,7 @@ win32execute(const char* path,
   std::string full_path = util::add_exe_suffix(path);
   fs::path tmp_file_path;
 
-  util::Finalizer tmp_file_remover([&tmp_file_path] {
+  DEFER([&] {
     if (!tmp_file_path.empty()) {
       util::remove(tmp_file_path);
     }
index d2309f81e8388d537ad0b70d5130c7748ddec09c..2f282fe9e907f095de880c01d04729f13bf9c8a8 100644 (file)
 #include <ccache/config.hpp>
 #include <ccache/hash.hpp>
 #include <ccache/util/conversion.hpp>
+#include <ccache/util/defer.hpp>
 #include <ccache/util/direntry.hpp>
 #include <ccache/util/fd.hpp>
 #include <ccache/util/file.hpp>
 #include <ccache/util/filesystem.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/format.hpp>
 #include <ccache/util/logging.hpp>
 #include <ccache/util/path.hpp>
@@ -378,8 +378,7 @@ InodeCache::create_new_file(const fs::path& path)
     return false;
   }
 
-  util::Finalizer temp_file_remover(
-    [&] { unlink(util::pstr(tmp_file->path).c_str()); });
+  DEFER(unlink(util::pstr(tmp_file->path).c_str()));
 
   if (!fd_is_on_known_to_work_file_system(*tmp_file->fd)) {
     return false;
similarity index 64%
rename from src/ccache/util/finalizer.hpp
rename to src/ccache/util/defer.hpp
index baea58af0741a8eb78615873c2ae70f53246498f..739a6df4eb6d43102537ba3a544d42ed8ef09f68 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2023 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2024 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
 
 #include <functional>
 
+#define DEFER_CONCAT2(x, y) x##y
+#define DEFER_CONCAT1(x, y) DEFER_CONCAT2(x, y)
+#define DEFER_VARNAME DEFER_CONCAT1(_deferrer_, __LINE__)
+#define DEFER(...) util::Deferrer DEFER_VARNAME([&] { (void)__VA_ARGS__; })
+
 namespace util {
 
-class Finalizer
+class Deferrer
 {
 public:
-  Finalizer(std::function<void()> finalizer);
-  ~Finalizer();
+  Deferrer(std::function<void()> func);
+  ~Deferrer();
 
 private:
-  std::function<void()> m_finalizer;
-}; // namespace class Finalizer
+  std::function<void()> m_func;
+};
 
-inline Finalizer::Finalizer(std::function<void()> finalizer)
-  : m_finalizer(finalizer)
+inline Deferrer::Deferrer(std::function<void()> func) : m_func(func)
 {
 }
 
-inline Finalizer::~Finalizer()
+inline Deferrer::~Deferrer()
 {
-  m_finalizer();
+  m_func();
 }
 
 } // namespace util
index ed11c64c5e78500797530d4230cda457e7ab05d6..034eeeb5de42ee8caa2cf8639779e5db87339783 100644 (file)
@@ -18,8 +18,8 @@
 
 #include "direntry.hpp"
 
+#include <ccache/util/defer.hpp>
 #include <ccache/util/file.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/format.hpp>
 #include <ccache/util/logging.hpp>
 #include <ccache/util/pathstring.hpp>
@@ -166,7 +166,7 @@ win32_stat_impl(const char* path,
     return false;
   }
 
-  util::Finalizer closer([&] { CloseHandle(handle); });
+  DEFER(CloseHandle(handle));
 
   switch (GetFileType(handle)) {
   case FILE_TYPE_DISK: {
index ab5617d6bce878b08c53ec3240fe1f346688f0cc..142ea5ab7128b4cf9291210c17f027e1506be50a 100644 (file)
 #include "file.hpp"
 
 #include <ccache/util/bytes.hpp>
+#include <ccache/util/defer.hpp>
 #include <ccache/util/direntry.hpp>
 #include <ccache/util/error.hpp>
 #include <ccache/util/expected.hpp>
 #include <ccache/util/fd.hpp>
 #include <ccache/util/file.hpp>
 #include <ccache/util/filesystem.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/format.hpp>
 #include <ccache/util/logging.hpp>
 #include <ccache/util/path.hpp>
@@ -254,7 +254,7 @@ fallocate(int fd, size_t new_size)
     lseek(fd, saved_pos, SEEK_SET);
     return tl::unexpected(strerror(ENOMEM));
   }
-  Finalizer buf_freer([&] { free(buf); });
+  DEFER(free(buf));
 
   return write_fd(fd, buf, bytes_to_write)
     .and_then([&]() -> tl::expected<void, std::string> {
@@ -576,7 +576,7 @@ traverse_directory(const fs::path& directory,
       FMT("Failed to traverse {}: {}", directory, strerror(errno)));
   }
 
-  Finalizer dir_closer([&] { closedir(dir); });
+  DEFER(closedir(dir));
 
   struct dirent* entry;
   while ((entry = readdir(dir))) {
index c3324722fa11d23f44af0b9df29ddb6ba933f971..4afd22c945616a5751c50c7dd34b3d06a3883115 100644 (file)
@@ -18,8 +18,8 @@
 
 #include "testutil.hpp"
 
+#include <ccache/util/defer.hpp>
 #include <ccache/util/fd.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/wincompat.hpp>
 
 #include <doctest/doctest.h>
@@ -104,8 +104,7 @@ TEST_CASE("bsd_mkstemps")
     ++rand_iter;
   });
 
-  util::Finalizer reset_random_source(
-    [] { bsd_mkstemp_set_random_source(nullptr); });
+  DEFER(bsd_mkstemp_set_random_source(nullptr));
 
   SUBCASE("successful")
   {
index 0bf4907486c94d98629de56e69ea826096c58b05..84d2aba1cd020a7f3973a115aadba5f345b48d47 100644 (file)
 
 #include "testutil.hpp"
 
+#include <ccache/util/defer.hpp>
 #include <ccache/util/direntry.hpp>
 #include <ccache/util/environment.hpp>
 #include <ccache/util/fd.hpp>
 #include <ccache/util/file.hpp>
 #include <ccache/util/filesystem.hpp>
-#include <ccache/util/finalizer.hpp>
 #include <ccache/util/wincompat.hpp>
 
 #include <doctest/doctest.h>
@@ -608,7 +608,7 @@ TEST_CASE("Win32 Pending Delete" * doctest::skip(running_under_wine()))
                 FILE_ATTRIBUTE_NORMAL,
                 nullptr);
   REQUIRE_MESSAGE(handle != INVALID_HANDLE_VALUE, "err=" << GetLastError());
-  util::Finalizer cleanup([&] { CloseHandle(handle); });
+  DEFER(CloseHandle(handle));
 
   // Mark file as deleted. This puts it into a "pending delete" state that
   // will persist until the handle is closed. Until the file is closed, new
@@ -641,7 +641,7 @@ TEST_CASE("Win32 No Sharing")
                               FILE_ATTRIBUTE_NORMAL,
                               nullptr);
   REQUIRE_MESSAGE(handle != INVALID_HANDLE_VALUE, "err=" << GetLastError());
-  util::Finalizer cleanup([&] { CloseHandle(handle); });
+  DEFER(CloseHandle(handle));
 
   // Sanity check we can't open the file for read/write access.
   REQUIRE(!util::read_file<std::string>("file"));