#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>
#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>
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);
#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>
// 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) {
#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>
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);
}
#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>
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;
-// 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
#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>
return false;
}
- util::Finalizer closer([&] { CloseHandle(handle); });
+ DEFER(CloseHandle(handle));
switch (GetFileType(handle)) {
case FILE_TYPE_DISK: {
#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>
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> {
FMT("Failed to traverse {}: {}", directory, strerror(errno)));
}
- Finalizer dir_closer([&] { closedir(dir); });
+ DEFER(closedir(dir));
struct dirent* entry;
while ((entry = readdir(dir))) {
#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>
++rand_iter;
});
- util::Finalizer reset_random_source(
- [] { bsd_mkstemp_set_random_source(nullptr); });
+ DEFER(bsd_mkstemp_set_random_source(nullptr));
SUBCASE("successful")
{
#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>
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
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"));