Program Listing for File EventSignalHandle.cpp

Return to documentation for file (EventLoop/EventSignalHandle.cpp)

#include "netio3-backend/EventLoop/EventSignalHandle.hpp"

#include <cstdint>
#include <memory>
#include <unistd.h>

#include "netio3-backend/EventLoop/BaseEventLoop.hpp"
#include "netio3-backend/EventLoop/Utility.hpp"

netio3::EventSignalHandle::EventSignalHandle(const int fd,
                                             const std::shared_ptr<BaseEventLoop>& evloop) :
  m_fd{std::make_shared<int>(fd)}, m_evloop{evloop}
{}

netio3::EventSignalHandle::~EventSignalHandle()
{
  if (m_fd.use_count() > 1) {
    return;
  }
  if (auto spt = m_evloop.lock()) {
    spt->remove_signal(*this);
  }
}

void netio3::EventSignalHandle::fire() const
{
  const auto buf = std::uint64_t{1};
  const auto ret = write(*m_fd, &buf, sizeof(buf));
  constexpr static auto NBYTES = 8;
  if (ret != NBYTES) {
    ers::error(FailedFireSignal(ERS_HERE, *m_fd, ret, utility::error_message(errno)));
  }
}