if (condition & (EVENT_OUT | EVENT_HUP))
return false;
- if (!m_ch->read_sync(msg))
+ if (!m_ch->read_sync(msg, false))
return false;
return false;
return true;
}
-bool channel::read_sync(message &msg)
+bool channel::read_sync(message &msg, bool select)
{
message_header header;
ssize_t size = 0;
char buf[MAX_MSG_CAPACITY];
/* header */
- size = m_socket->recv(&header, sizeof(message_header), true);
+ size = m_socket->recv(&header, sizeof(message_header), select);
retv_if(size <= 0, false);
/* check error from header */
/* body */
if (header.length > 0) {
- size = m_socket->recv(&buf, header.length, true);
+ size = m_socket->recv(&buf, header.length, select);
retv_if(size <= 0, false);
}
bool send_sync(message *msg);
bool read(void);
- bool read_sync(message &msg);
+ bool read_sync(message &msg, bool select = true);
bool get_option(int type, int &value) const;
bool set_option(int type, int value);
ssize_t socket::recv(void* buffer, size_t size, bool select) const
{
- /* WARNING: if select() is called here, it affects performance */
+ if (select) {
+ const int TIMEOUT = 1;
+ fd_set read_fds;
+ FD_ZERO(&read_fds);
+ FD_SET(m_sock_fd, &read_fds);
+
+ if (!select_fds(m_sock_fd, &read_fds, NULL, TIMEOUT)) {
+ _E("Failed to receive message(timeout)");
+ return 0;
+ }
+ }
+
return on_recv(buffer, size);
}