- delete fds which is added to poller when event_poller is destroyed.
Change-Id: I098326f609b215e448c92420d88cfa7616d8f9c9
Signed-off-by: kibak.yoon <kibak.yoon@samsung.com>
*
*/
-#include <vector>
+#include <signal.h>
+#include <sys/signalfd.h>
#include <sensor_base.h>
#include <physical_sensor.h>
#include <sensor_event_poller.h>
#include <sensor_loader.h>
#include <algorithm>
+#include <vector>
sensor_event_poller::sensor_event_poller()
{
init_sensor_map();
init_fd();
+ init_signal_fd();
}
sensor_event_poller::~sensor_event_poller()
{
+ fd_sensors_t::iterator it;
+ for (it = m_fd_sensors.begin(); it != m_fd_sensors.end(); it = m_fd_sensors.upper_bound(it->first))
+ m_poller.del_fd(it->first);
}
void sensor_event_poller::init_sensor_map()
}
}
-void sensor_event_poller::init_fd()
+void sensor_event_poller::init_fd(void)
{
fd_sensors_t::iterator it;
for (it = m_fd_sensors.begin(); it != m_fd_sensors.end(); it = m_fd_sensors.upper_bound(it->first)) {
}
}
+void sensor_event_poller::init_signal_fd(void)
+{
+ int sfd;
+ sigset_t mask;
+
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGTERM);
+ sigaddset(&mask, SIGABRT);
+ sigaddset(&mask, SIGINT);
+
+ sfd = signalfd(-1, &mask, 0);
+ m_poller.add_signal_fd(sfd);
+}
+
bool sensor_event_poller::add_poll_fd(int fd)
{
return m_poller.add_fd(fd);
sensor_event_poller();
virtual ~sensor_event_poller();
- bool poll();
+ bool poll(void);
+
private:
poller m_poller;
fd_sensors_t m_fd_sensors;
- void init_fd();
- void init_sensor_map();
+private:
+ void init_sensor_map(void);
+ void init_fd(void);
+ void init_signal_fd(void);
+
bool add_poll_fd(int fd);
bool read_fd(int fd, std::vector<uint32_t> &ids);
bool process_event(int fd, const std::vector<uint32_t> &ids);
poller::poller()
: m_epfd(-1)
+, sfd(-1)
{
init_poll_fd();
}
poller::~poller()
{
- if (m_epfd)
- close(m_epfd);
+ if (m_epfd >= 0)
+ ::close(m_epfd);
}
void poller::init_poll_fd(void)
m_epfd = epoll_create(EPOLL_MAX);
}
+bool poller::add_signal_fd(int fd)
+{
+ sfd = fd;
+ return add_fd(fd);
+}
+
bool poller::add_fd(int fd)
{
struct epoll_event event;
return true;
}
+bool poller::del_fd(int fd)
+{
+ struct epoll_event event;
+
+ event.data.fd = fd;
+
+ if (epoll_ctl(m_epfd, EPOLL_CTL_DEL, fd, &event)) {
+ _ERRNO(errno, _E, "Failed to del fd[%d]", fd);
+ return false;
+ }
+
+ return true;
+}
+
bool poller::fill_event_queue(void)
{
const int EPOLL_MAX_EVENT = 1;
return false;
}
- for (int i = 0; i < nr_events; i++)
+ for (int i = 0; i < nr_events; i++)
m_event_queue.push(event_items[i]);
return true;
return false;
}
+ if (event.data.fd == sfd) {
+ _E("received signal");
+ return false;
+ }
+
return true;
}
}
poller(int fd);
virtual ~poller();
+ bool add_signal_fd(int fd);
+
bool add_fd(int fd);
+ bool del_fd(int fd);
+
bool poll(struct epoll_event &event);
+
private:
int m_epfd;
+ int sfd;
+
std::queue<struct epoll_event> m_event_queue;
+private:
void init_poll_fd(void);
bool fill_event_queue(void);
};