From 76bead9fd862f6b8f8294075526eaf617d5e92f0 Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Fri, 8 Mar 2024 17:26:57 +0800 Subject: [PATCH] nixd: add basic "Auto" classes --- nixd/tools/nixd/meson.build | 2 ++ nixd/tools/nixd/src/AutoCloseFD.cpp | 26 ++++++++++++++++++++++ nixd/tools/nixd/src/AutoCloseFD.h | 31 +++++++++++++++++++++++++++ nixd/tools/nixd/src/AutoRemoveShm.cpp | 14 ++++++++++++ nixd/tools/nixd/src/AutoRemoveShm.h | 22 +++++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 nixd/tools/nixd/src/AutoCloseFD.cpp create mode 100644 nixd/tools/nixd/src/AutoCloseFD.h create mode 100644 nixd/tools/nixd/src/AutoRemoveShm.cpp create mode 100644 nixd/tools/nixd/src/AutoRemoveShm.h diff --git a/nixd/tools/nixd/meson.build b/nixd/tools/nixd/meson.build index 1d35c1a98..e6d964ced 100644 --- a/nixd/tools/nixd/meson.build +++ b/nixd/tools/nixd/meson.build @@ -1,4 +1,6 @@ nixd_next = executable('nixd', + 'src/AutoCloseFD.cpp', + 'src/AutoRemoveShm.cpp', 'src/CodeAction.cpp', 'src/Convert.cpp', 'src/Diagnostics.cpp', diff --git a/nixd/tools/nixd/src/AutoCloseFD.cpp b/nixd/tools/nixd/src/AutoCloseFD.cpp new file mode 100644 index 000000000..930d6bd4a --- /dev/null +++ b/nixd/tools/nixd/src/AutoCloseFD.cpp @@ -0,0 +1,26 @@ +#include "AutoCloseFD.h" + +#include + +namespace nixd { + +AutoCloseFD::~AutoCloseFD() { + if (FD != ReleasedFD) [[likely]] + close(FD); +} + +AutoCloseFD::AutoCloseFD(AutoCloseFD &&That) noexcept : FD(That.get()) { + That.release(); +} + +AutoCloseFD::FDTy AutoCloseFD::get() const { return FD; } + +void AutoCloseFD::release() { FD = ReleasedFD; } + +bool AutoCloseFD::isReleased(FDTy FD) { return FD == ReleasedFD; } + +bool AutoCloseFD::isReleased() const { return isReleased(FD); } + +AutoCloseFD::AutoCloseFD(FDTy FD) : FD(FD) {} + +} // namespace nixd diff --git a/nixd/tools/nixd/src/AutoCloseFD.h b/nixd/tools/nixd/src/AutoCloseFD.h new file mode 100644 index 000000000..ad340d4f5 --- /dev/null +++ b/nixd/tools/nixd/src/AutoCloseFD.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace nixd { + +/// \brief File Descriptor RAII wrapper +class AutoCloseFD { +public: + using FDTy = int; + +private: + static constexpr FDTy ReleasedFD = -EBADF; + FDTy FD; + +public: + AutoCloseFD(FDTy FD); + AutoCloseFD(const AutoCloseFD &) = delete; + AutoCloseFD(AutoCloseFD &&That) noexcept; + + [[nodiscard]] bool isReleased() const; + static bool isReleased(FDTy FD); + + ~AutoCloseFD(); + + [[nodiscard]] FDTy get() const; + void release(); +}; + +} // namespace nixd diff --git a/nixd/tools/nixd/src/AutoRemoveShm.cpp b/nixd/tools/nixd/src/AutoRemoveShm.cpp new file mode 100644 index 000000000..3d239c42e --- /dev/null +++ b/nixd/tools/nixd/src/AutoRemoveShm.cpp @@ -0,0 +1,14 @@ +#include "AutoRemoveShm.h" + +namespace nixd { + +AutoRemoveShm::AutoRemoveShm(std::string ShmName, + boost::interprocess::offset_t Size) + : ShmName(std::move(ShmName)) { + Shm = boost::interprocess::shared_memory_object( + boost::interprocess::open_or_create, this->ShmName.c_str(), + boost::interprocess::read_write); + Shm.truncate(Size); +} + +} // namespace nixd diff --git a/nixd/tools/nixd/src/AutoRemoveShm.h b/nixd/tools/nixd/src/AutoRemoveShm.h new file mode 100644 index 000000000..90001bda6 --- /dev/null +++ b/nixd/tools/nixd/src/AutoRemoveShm.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +namespace nixd { + +/// Shared memory object, the object will be removed in dtor. +class AutoRemoveShm { + boost::interprocess::shared_memory_object Shm; + std::string ShmName; + +public: + AutoRemoveShm(std::string ShmName, boost::interprocess::offset_t Size); + + ~AutoRemoveShm() { Shm.remove(ShmName.c_str()); } + + [[nodiscard]] const std::string &shmName() const { return ShmName; } + + boost::interprocess::shared_memory_object &get() { return Shm; } +}; + +} // namespace nixd