diff --git a/rx/CMakeLists.txt b/rx/CMakeLists.txt index 7ddbf70aa..215c659d4 100644 --- a/rx/CMakeLists.txt +++ b/rx/CMakeLists.txt @@ -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} diff --git a/rx/include/rx/FileLock.hpp b/rx/include/rx/FileLock.hpp new file mode 100644 index 000000000..1b510d9b3 --- /dev/null +++ b/rx/include/rx/FileLock.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +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 diff --git a/rx/include/rx/hexdump.hpp b/rx/include/rx/hexdump.hpp index 20110774b..07e927707 100644 --- a/rx/include/rx/hexdump.hpp +++ b/rx/include/rx/hexdump.hpp @@ -4,5 +4,8 @@ #include namespace rx { -void hexdump(std::span bytes); +void hexdump(std::span bytes); +inline void hexdump(const void *data, std::size_t size) { + hexdump({reinterpret_cast(data), size}); +} } // namespace rx diff --git a/rx/src/FileLock.cpp b/rx/src/FileLock.cpp new file mode 100644 index 000000000..8625afc3f --- /dev/null +++ b/rx/src/FileLock.cpp @@ -0,0 +1,18 @@ +#include "FileLock.hpp" +#include + +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 +} diff --git a/rx/src/hexdump.cpp b/rx/src/hexdump.cpp index df28d8f04..1f570cb39 100644 --- a/rx/src/hexdump.cpp +++ b/rx/src/hexdump.cpp @@ -1,10 +1,11 @@ #include "hexdump.hpp" +#include "FileLock.hpp" #include #include #include #include -void rx::hexdump(std::span bytes) { +void rx::hexdump(std::span bytes) { unsigned sizeWidth = 1; { @@ -16,7 +17,7 @@ void rx::hexdump(std::span 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 bytes) { } } std::println(stderr, ""); - funlockfile(stderr); }