sensord: set signal fd to poller for knowing what signal is received 01/70201/3
authorkibak.yoon <kibak.yoon@samsung.com>
Wed, 18 May 2016 12:04:48 +0000 (21:04 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Thu, 19 May 2016 05:21:27 +0000 (22:21 -0700)
- delete fds which is added to poller when event_poller is destroyed.

Change-Id: I098326f609b215e448c92420d88cfa7616d8f9c9
Signed-off-by: kibak.yoon <kibak.yoon@samsung.com>
src/server/sensor_event_poller.cpp
src/server/sensor_event_poller.h
src/shared/poller.cpp
src/shared/poller.h

index 1327b44..994c1f0 100644 (file)
  *
  */
 
-#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()
@@ -58,7 +64,7 @@ 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)) {
@@ -67,6 +73,20 @@ void sensor_event_poller::init_fd()
        }
 }
 
+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);
index 03e5a59..c6c9ade 100644 (file)
@@ -31,13 +31,17 @@ public:
        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);
index b1a3ded..8e05af8 100644 (file)
@@ -25,6 +25,7 @@
 
 poller::poller()
 : m_epfd(-1)
+, sfd(-1)
 {
        init_poll_fd();
 }
@@ -38,8 +39,8 @@ poller::poller(int fd)
 
 poller::~poller()
 {
-       if (m_epfd)
-               close(m_epfd);
+       if (m_epfd >= 0)
+               ::close(m_epfd);
 }
 
 void poller::init_poll_fd(void)
@@ -47,6 +48,12 @@ 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;
@@ -62,6 +69,20 @@ bool poller::add_fd(int fd)
        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;
@@ -82,7 +103,7 @@ bool poller::fill_event_queue(void)
                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;
@@ -110,6 +131,11 @@ bool poller::poll(struct epoll_event &event)
                                return false;
                        }
 
+                       if (event.data.fd == sfd) {
+                               _E("received signal");
+                               return false;
+                       }
+
                        return true;
                }
        }
index b43d491..e61408d 100644 (file)
@@ -31,12 +31,20 @@ public:
        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);
 };