If listener connection is failed, it should be handled as an error.
Previously, if connection is failed, it is not handled and treated as
success.
To handle 'connection failure' situation, return statement and state
member variable(indicates if sensor_listener is successfully
initialized) are added.
Change-Id: I4801ac7fb78cbbf1dea7808eed3ba84e9f3ab362
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
listener = new(std::nothrow) sensor::sensor_listener(sensor, reader.get_event_loop());
retvm_if(!listener, -ENOMEM, "Failed to allocate memory");
+ if (listener->get_initialized() == false) {
+ _E("Failed to initialize listener");
+ delete listener;
+ return -1;
+ }
listeners[listener->get_id()] = listener;
};
sensor_listener::sensor_listener(sensor_t sensor)
-: m_id(0)
+: m_initialized(false)
+, m_id(0)
, m_sensor(reinterpret_cast<sensor_info *>(sensor))
, m_client(NULL)
, m_cmd_channel(NULL)
, m_connected(false)
, m_started(false)
{
- init();
+ m_initialized = init();
}
sensor_listener::sensor_listener(sensor_t sensor, ipc::event_loop *loop)
-: m_id(0)
+: m_initialized(false)
+, m_id(0)
, m_sensor(reinterpret_cast<sensor_info *>(sensor))
, m_client(NULL)
, m_cmd_channel(NULL)
, m_connected(false)
, m_started(false)
{
- init();
+ m_initialized = init();
}
sensor_listener::~sensor_listener()
}
if (!connect()) {
+ _E("Failed to connect");
delete m_handler;
delete m_client;
m_handler = NULL;
m_attributes_int.clear();
m_attributes_str.clear();
+
+ m_initialized = false;
+
_D("Deinitialized..");
}
+bool sensor_listener::get_initialized(void)
+{
+ return m_initialized;
+}
+
int sensor_listener::get_id(void)
{
return m_id;
memcpy(buf.sensor, m_sensor->get_uri().c_str(), m_sensor->get_uri().size());
msg.set_type(CMD_LISTENER_CONNECT);
msg.enclose((const char *)&buf, sizeof(buf));
- m_evt_channel->send_sync(msg);
- m_evt_channel->read_sync(reply);
+ if (m_evt_channel->send_sync(msg)) {
+ _E("Failed to send message");
+ return false;
+ }
+ if (!m_evt_channel->read_sync(reply)) {
+ _E("Failed to receive message");
+ return false;
+ }
reply.disclose((char *)&buf, sizeof(buf));
m_id = buf.listener_id;
sensor_listener(sensor_t sensor, ipc::event_loop *loop);
virtual ~sensor_listener();
+ bool get_initialized(void);
int get_id(void);
sensor_t get_sensor(void);
void disconnect(void);
bool is_connected(void);
+ bool m_initialized;
int m_id;
sensor_info *m_sensor;
/* header */
size = m_socket->recv(&header, sizeof(message_header), select);
- if (size <= 0)
- return false;
+ retvm_if(size <= 0, false, "Failed to receive header");
/* check error from header */
if (m_handler && header.err != 0) {
if (header.length > 0) {
size = m_socket->recv(&buf, header.length, select);
- if (size <= 0)
- return false;
+ retvm_if(size <= 0, false, "Failed to receive body");
}
buf[header.length] = '\0';
static bool select_fds(int fd, fd_set *read_fds, fd_set *write_fds, const int timeout)
{
struct timeval tv;
- int err;
+ int fds_num = 0;
tv.tv_sec = timeout;
tv.tv_usec = 0;
while (true) {
- err = ::select(fd + 1, read_fds, write_fds, NULL, &tv);
- if (err <= 0)
+ fds_num = ::select(fd + 1, read_fds, write_fds, NULL, &tv);
+ if (fds_num < 0) {
+ _ERRNO(errno, _E, "Failed to select[%d]", fds_num);
return false;
+ }
+ if (fds_num == 0) {
+ _E("Failed to select(timeout)");
+ return false;
+ }
if (read_fds && FD_ISSET(fd, read_fds))
break;
FD_SET(m_sock_fd, &write_fds);
if (!select_fds(m_sock_fd, NULL, &write_fds, SOCK_TIMEOUT)) {
- _E("Failed to send message(timeout)");
+ _E("Failed to send message");
return 0;
}
}
FD_SET(m_sock_fd, &read_fds);
if (!select_fds(m_sock_fd, &read_fds, NULL, SOCK_TIMEOUT)) {
- _E("Failed to receive message(timeout)");
+ _E("Failed to receive message");
return 0;
}
}