From 05a4b68c3fc190d714b3f3070f9ff0b91c9ebf7b Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Sun, 30 Jun 2024 21:22:26 +0200 Subject: [PATCH] refactor: Introduce and use DEFER macro, replacing util::Finalizer --- src/ccache/ccache.cpp | 4 ++-- src/ccache/core/common.cpp | 4 ++-- src/ccache/execute.cpp | 4 ++-- src/ccache/inodecache.cpp | 5 ++-- src/ccache/util/{finalizer.hpp => defer.hpp} | 24 ++++++++++++-------- src/ccache/util/direntry.cpp | 4 ++-- src/ccache/util/file.cpp | 6 ++--- unittest/test_bsdmkstemp.cpp | 5 ++-- unittest/test_util_direntry.cpp | 6 ++--- 9 files changed, 32 insertions(+), 30 deletions(-) rename src/ccache/util/{finalizer.hpp => defer.hpp} (64%) diff --git a/src/ccache/ccache.cpp b/src/ccache/ccache.cpp index bd1e2cd52..5e0c7cd57 100644 --- a/src/ccache/ccache.cpp +++ b/src/ccache/ccache.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -55,7 +56,6 @@ #include #include #include -#include #include #include #include @@ -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); diff --git a/src/ccache/core/common.cpp b/src/ccache/core/common.cpp index 78c733e25..6e0ab656d 100644 --- a/src/ccache/core/common.cpp +++ b/src/ccache/core/common.cpp @@ -20,10 +20,10 @@ #include #include +#include #include #include #include -#include #include #include #include @@ -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) { diff --git a/src/ccache/execute.cpp b/src/ccache/execute.cpp index 6359c1767..3b5f836fd 100644 --- a/src/ccache/execute.cpp +++ b/src/ccache/execute.cpp @@ -24,13 +24,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include #include #include #include @@ -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); } diff --git a/src/ccache/inodecache.cpp b/src/ccache/inodecache.cpp index d2309f81e..2f282fe9e 100644 --- a/src/ccache/inodecache.cpp +++ b/src/ccache/inodecache.cpp @@ -21,11 +21,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include @@ -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; diff --git a/src/ccache/util/finalizer.hpp b/src/ccache/util/defer.hpp similarity index 64% rename from src/ccache/util/finalizer.hpp rename to src/ccache/util/defer.hpp index baea58af0..739a6df4e 100644 --- a/src/ccache/util/finalizer.hpp +++ b/src/ccache/util/defer.hpp @@ -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. // @@ -20,26 +20,30 @@ #include +#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 finalizer); - ~Finalizer(); + Deferrer(std::function func); + ~Deferrer(); private: - std::function m_finalizer; -}; // namespace class Finalizer + std::function m_func; +}; -inline Finalizer::Finalizer(std::function finalizer) - : m_finalizer(finalizer) +inline Deferrer::Deferrer(std::function func) : m_func(func) { } -inline Finalizer::~Finalizer() +inline Deferrer::~Deferrer() { - m_finalizer(); + m_func(); } } // namespace util diff --git a/src/ccache/util/direntry.cpp b/src/ccache/util/direntry.cpp index ed11c64c5..034eeeb5d 100644 --- a/src/ccache/util/direntry.cpp +++ b/src/ccache/util/direntry.cpp @@ -18,8 +18,8 @@ #include "direntry.hpp" +#include #include -#include #include #include #include @@ -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: { diff --git a/src/ccache/util/file.cpp b/src/ccache/util/file.cpp index ab5617d6b..142ea5ab7 100644 --- a/src/ccache/util/file.cpp +++ b/src/ccache/util/file.cpp @@ -19,13 +19,13 @@ #include "file.hpp" #include +#include #include #include #include #include #include #include -#include #include #include #include @@ -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 { @@ -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))) { diff --git a/unittest/test_bsdmkstemp.cpp b/unittest/test_bsdmkstemp.cpp index c3324722f..4afd22c94 100644 --- a/unittest/test_bsdmkstemp.cpp +++ b/unittest/test_bsdmkstemp.cpp @@ -18,8 +18,8 @@ #include "testutil.hpp" +#include #include -#include #include #include @@ -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") { diff --git a/unittest/test_util_direntry.cpp b/unittest/test_util_direntry.cpp index 0bf490748..84d2aba1c 100644 --- a/unittest/test_util_direntry.cpp +++ b/unittest/test_util_direntry.cpp @@ -18,12 +18,12 @@ #include "testutil.hpp" +#include #include #include #include #include #include -#include #include #include @@ -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("file")); -- 2.47.2