sensord: add select before sending the event 12/99912/2
authorkibak.yoon <kibak.yoon@samsung.com>
Wed, 16 Nov 2016 15:04:29 +0000 (00:04 +0900)
committerkibak.yoon <kibak.yoon@samsung.com>
Wed, 30 Nov 2016 13:05:38 +0000 (22:05 +0900)
because check client fd is writable or not, select() is added.

Change-Id: I3189b314ec574fa8201dc79e33b91ad2e7f82deb
Signed-off-by: kibak.yoon <kibak.yoon@samsung.com>
src/shared/csocket.cpp

index c500defcfe495ac438cd48a45fc4c9a15417f249..4a97a3c99e01b93de766250fbc69e8bb8967a142 100644 (file)
@@ -306,9 +306,35 @@ ssize_t csocket::recv_for_stream(void* buffer, size_t size) const
 
 ssize_t csocket::send(const void *buffer, size_t size) const
 {
+       const int TIMEOUT = 5;
+       fd_set write_fds;
+       struct timeval tv;
+
        if (!is_valid())
                return -EINVAL;
 
+       FD_ZERO(&write_fds);
+       FD_SET(m_sock_fd, &write_fds);
+       tv.tv_sec = TIMEOUT;
+       tv.tv_usec = 0;
+
+       int ret;
+
+       ret = select(m_sock_fd + 1, NULL, &write_fds, NULL, &tv);
+
+       if (ret == -1) {
+               _ERRNO(errno, _E, "select error: sock_fd: %d\n for %s", m_sock_fd, get_client_name());
+               return false;
+       } else if (!ret) {
+               _ERRNO(errno, _E, "select timeout: %d seconds elapsed for %s", tv.tv_sec, get_client_name());
+               return false;
+       }
+
+       if (!FD_ISSET(m_sock_fd, &write_fds)) {
+               _ERRNO(errno, _E, "select failed for %s, nothing to write, m_sock_fd : %d", get_client_name(), m_sock_fd);
+               return false;
+       }
+
        if (m_sock_type == SOCK_STREAM)
                return send_for_stream(buffer, size);