rx: add file lock utility

This commit is contained in:
DH 2025-04-08 18:23:25 +03:00
parent 2b9232e4aa
commit b33e2662b6
5 changed files with 63 additions and 4 deletions

View file

@ -9,6 +9,7 @@ add_library(${PROJECT_NAME} OBJECT
src/hexdump.cpp
src/mem.cpp
src/Version.cpp
src/FileLock.cpp
)
target_include_directories(${PROJECT_NAME}

View file

@ -0,0 +1,37 @@
#pragma once
#include <cstdio>
#include <utility>
namespace rx {
void fileLock(std::FILE *file);
void fileUnlock(std::FILE *file);
class ScopedFileLock {
std::FILE *mFile = nullptr;
public:
ScopedFileLock() = default;
ScopedFileLock(const ScopedFileLock &) = delete;
ScopedFileLock &operator=(const ScopedFileLock &) = delete;
ScopedFileLock(ScopedFileLock &&other) noexcept
: mFile(std::exchange(other.mFile, nullptr)) {}
ScopedFileLock &operator=(ScopedFileLock &&other) noexcept {
std::swap(mFile, other.mFile);
return *this;
}
ScopedFileLock(std::FILE *file) : mFile(file) {
if (file) {
fileLock(file);
}
}
~ScopedFileLock() {
if (mFile) {
fileUnlock(mFile);
}
}
};
} // namespace rx

View file

@ -4,5 +4,8 @@
#include <span>
namespace rx {
void hexdump(std::span<std::byte> bytes);
void hexdump(std::span<const std::byte> bytes);
inline void hexdump(const void *data, std::size_t size) {
hexdump({reinterpret_cast<const std::byte *>(data), size});
}
} // namespace rx

18
rx/src/FileLock.cpp Normal file
View file

@ -0,0 +1,18 @@
#include "FileLock.hpp"
#include <cstdio>
void rx::fileLock(std::FILE *file) {
#ifdef _WIN32
_lock_file(file);
#else
flockfile(file);
#endif
}
void rx::fileUnlock(std::FILE *file) {
#ifdef _WIN32
_unlock_file(file);
#else
funlockfile(file);
#endif
}

View file

@ -1,10 +1,11 @@
#include "hexdump.hpp"
#include "FileLock.hpp"
#include <cstdio>
#include <cstring>
#include <print>
#include <string>
void rx::hexdump(std::span<std::byte> bytes) {
void rx::hexdump(std::span<const std::byte> bytes) {
unsigned sizeWidth = 1;
{
@ -16,7 +17,7 @@ void rx::hexdump(std::span<std::byte> bytes) {
}
}
flockfile(stderr);
rx::ScopedFileLock stderrLock(stderr);
std::print(stderr, "{} ", std::string(sizeWidth, ' '));
for (unsigned i = 0; i < 16; ++i) {
std::print(stderr, " {:02x}", i);
@ -82,5 +83,4 @@ void rx::hexdump(std::span<std::byte> bytes) {
}
}
std::println(stderr, "");
funlockfile(stderr);
}