Skip to content

Commit

Permalink
nixd: add basic "Auto" classes
Browse files Browse the repository at this point in the history
  • Loading branch information
inclyc committed Mar 8, 2024
1 parent 098aa89 commit 76bead9
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 0 deletions.
2 changes: 2 additions & 0 deletions nixd/tools/nixd/meson.build
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
nixd_next = executable('nixd',
'src/AutoCloseFD.cpp',
'src/AutoRemoveShm.cpp',
'src/CodeAction.cpp',
'src/Convert.cpp',
'src/Diagnostics.cpp',
Expand Down
26 changes: 26 additions & 0 deletions nixd/tools/nixd/src/AutoCloseFD.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#include "AutoCloseFD.h"

#include <unistd.h>

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
31 changes: 31 additions & 0 deletions nixd/tools/nixd/src/AutoCloseFD.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include <cerrno>
#include <optional>

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
14 changes: 14 additions & 0 deletions nixd/tools/nixd/src/AutoRemoveShm.cpp
Original file line number Diff line number Diff line change
@@ -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
22 changes: 22 additions & 0 deletions nixd/tools/nixd/src/AutoRemoveShm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include <boost/interprocess/shared_memory_object.hpp>

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

0 comments on commit 76bead9

Please sign in to comment.