/** * Copyright (C) ARM Limited 2013-2014. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include "Monitor.h" #include #include #include #include "Logging.h" Monitor::Monitor() : mFd(-1) { } Monitor::~Monitor() { if (mFd >= -1) { close(mFd); } } bool Monitor::init() { mFd = epoll_create(16); if (mFd < 0) { logg->logMessage("%s(%s:%i): epoll_create1 failed", __FUNCTION__, __FILE__, __LINE__); return false; } return true; } bool Monitor::add(const int fd) { struct epoll_event event; memset(&event, 0, sizeof(event)); event.data.fd = fd; event.events = EPOLLIN; if (epoll_ctl(mFd, EPOLL_CTL_ADD, fd, &event) != 0) { logg->logMessage("%s(%s:%i): epoll_ctl failed", __FUNCTION__, __FILE__, __LINE__); return false; } return true; } int Monitor::wait(struct epoll_event *const events, int maxevents, int timeout) { int result = epoll_wait(mFd, events, maxevents, timeout); if (result < 0) { // Ignore if the call was interrupted as this will happen when SIGINT is received if (errno == EINTR) { result = 0; } else { logg->logMessage("%s(%s:%i): epoll_wait failed", __FUNCTION__, __FILE__, __LINE__); } } return result; }