common/selectableevent.cpp (66 lines of code) (raw):

#include <stdio.h> #include <string.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <iostream> #include <system_error> #include "common/logger.h" #include "common/selectableevent.h" namespace swss { SelectableEvent::SelectableEvent(int pri) : Selectable(pri), m_efd(0) { m_efd = eventfd(0, 0); if (m_efd == -1) { SWSS_LOG_ERROR("failed to create eventfd, errno: %s", strerror(errno)); throw std::runtime_error("failed to create eventfd"); } } SelectableEvent::~SelectableEvent() { int err; do { err = close(m_efd); } while(err == -1 && errno == EINTR); } int SelectableEvent::getFd() { return m_efd; } uint64_t SelectableEvent::readData() { uint64_t r; ssize_t s; do { s = read(m_efd, &r, sizeof(uint64_t)); } while(s == -1 && errno == EINTR); if (s != sizeof(uint64_t)) { SWSS_LOG_THROW("SelectableEvent read failed, s:%zd errno: %s", s, strerror(errno)); } return 0; } void SelectableEvent::notify() { SWSS_LOG_ENTER(); uint64_t value = 1; ssize_t s; do { s = write(m_efd, &value, sizeof(uint64_t)); } while(s == -1 && errno == EINTR); if (s != sizeof(uint64_t)) { SWSS_LOG_ERROR("write failed, errno: %s", strerror(errno)); throw std::runtime_error("write failed"); } } }