From 6444aa5e415d65d4385c0cb55aeca9044472cc63 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 24 Apr 2017 15:55:55 +0900 Subject: [PATCH] sensord: do not let the listener have sensor pointer directly - Since the sensor could be registered or unregistered in runtime, the sensor pointer of sensor listener can be NULL when the sensor is unregistered. - This patch modifies the listener has only the sensor URI and requests a handle to the sensor manager if needed. Change-Id: I7967a332577eb7a0a41c7e678eea85b6b3f55dfd Signed-off-by: kibak.yoon --- src/server/sensor_listener_proxy.cpp | 54 +++++++++++++++++++++++++++-------- src/server/sensor_listener_proxy.h | 8 ++++-- src/server/server_channel_handler.cpp | 9 ++---- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/server/sensor_listener_proxy.cpp b/src/server/sensor_listener_proxy.cpp index b542af8..7c20c90 100644 --- a/src/server/sensor_listener_proxy.cpp +++ b/src/server/sensor_listener_proxy.cpp @@ -25,12 +25,15 @@ #include #include +#include "sensor_handler.h" + using namespace sensor; -sensor_listener_proxy::sensor_listener_proxy( - uint32_t id, sensor_handler *sensor, ipc::channel *ch) +sensor_listener_proxy::sensor_listener_proxy(uint32_t id, + std::string uri, sensor_manager *manager, ipc::channel *ch) : m_id(id) -, m_sensor(sensor) +, m_uri(uri) +, m_manager(manager) , m_ch(ch) , m_passive(false) , m_pause_policy(SENSORD_PAUSE_ALL) @@ -63,16 +66,22 @@ int sensor_listener_proxy::update(const char *uri, ipc::message *msg) int sensor_listener_proxy::start(void) { + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + /* TODO: listen pause policy */ - return m_sensor->start(this); + return sensor->start(this); } int sensor_listener_proxy::stop(void) { + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + /* TODO: listen pause policy */ int ret; - ret = m_sensor->stop(this); + ret = sensor->stop(this); retv_if(ret < 0, OP_ERROR); /* unset attributes */ @@ -84,12 +93,18 @@ int sensor_listener_proxy::stop(void) int sensor_listener_proxy::set_interval(unsigned int interval) { - return m_sensor->set_interval(this, interval); + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + + return sensor->set_interval(this, interval); } int sensor_listener_proxy::set_max_batch_latency(unsigned int max_batch_latency) { - return m_sensor->set_batch_latency(this, max_batch_latency); + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + + return sensor->set_batch_latency(this, max_batch_latency); } int sensor_listener_proxy::set_passive_mode(bool passive) @@ -101,6 +116,9 @@ int sensor_listener_proxy::set_passive_mode(bool passive) int sensor_listener_proxy::set_attribute(int attribute, int value) { + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + if (attribute == SENSORD_ATTRIBUTE_PAUSE_POLICY) { m_pause_policy = value; return OP_SUCCESS; @@ -109,27 +127,39 @@ int sensor_listener_proxy::set_attribute(int attribute, int value) return OP_SUCCESS; } - return m_sensor->set_attribute(this, attribute, value); + return sensor->set_attribute(this, attribute, value); } int sensor_listener_proxy::set_attribute(int attribute, const char *value, int len) { - return m_sensor->set_attribute(this, attribute, value, len); + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + + return sensor->set_attribute(this, attribute, value, len); } int sensor_listener_proxy::flush(void) { - return m_sensor->flush(this); + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + + return sensor->flush(this); } int sensor_listener_proxy::get_data(sensor_data_t **data, int *len) { + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, -EINVAL); + /* TODO : caching the last data & retry logic if there is no data */ - return m_sensor->get_data(data, len); + return sensor->get_data(data, len); } std::string sensor_listener_proxy::get_required_privileges(void) { - sensor_info info = m_sensor->get_sensor_info(); + sensor_handler *sensor = m_manager->get_sensor(m_uri); + retv_if(!sensor, ""); + + sensor_info info = sensor->get_sensor_info(); return info.get_privilege(); } diff --git a/src/server/sensor_listener_proxy.h b/src/server/sensor_listener_proxy.h index 583cf36..05bc453 100644 --- a/src/server/sensor_listener_proxy.h +++ b/src/server/sensor_listener_proxy.h @@ -23,14 +23,15 @@ #include #include -#include "sensor_handler.h" +#include "sensor_manager.h" #include "sensor_observer.h" namespace sensor { class sensor_listener_proxy : public sensor_observer { public: - sensor_listener_proxy(uint32_t id, sensor_handler *sensor, ipc::channel *ch); + sensor_listener_proxy(uint32_t id, + std::string uri, sensor_manager *manager, ipc::channel *ch); ~sensor_listener_proxy(); uint32_t get_id(void); @@ -52,8 +53,9 @@ public: private: uint32_t m_id; + std::string m_uri; - sensor_handler *m_sensor; + sensor_manager *m_manager; ipc::channel *m_ch; bool m_passive; diff --git a/src/server/server_channel_handler.cpp b/src/server/server_channel_handler.cpp index d5ad86f..3a0fb44 100644 --- a/src/server/server_channel_handler.cpp +++ b/src/server/server_channel_handler.cpp @@ -116,16 +116,13 @@ int server_channel_handler::manager_get_sensor_list(channel *ch, message &msg) int server_channel_handler::listener_connect(channel *ch, message &msg) { static uint32_t listener_id = 1; - sensor_handler *sensor; cmd_listener_connect_t buf; msg.disclose((char *)&buf); - sensor = m_manager->get_sensor(buf.sensor); - retv_if(!sensor, OP_ERROR); - - sensor_listener_proxy *listener = - new(std::nothrow) sensor_listener_proxy(listener_id, sensor, ch); + sensor_listener_proxy *listener; + listener = new(std::nothrow) sensor_listener_proxy(listener_id, + buf.sensor, m_manager, ch); retvm_if(!listener, OP_ERROR, "Failed to allocate memory"); retvm_if(!has_privileges(ch->get_fd(), listener->get_required_privileges()), -EACCES, "Permission denied"); -- 2.7.4