From aaf347d3a48a5b313fcba57cb85c30a7cec773b2 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 25 Oct 2017 00:27:04 +0900 Subject: [PATCH] sensord: caching data to get previous data - Svace/Coverity : no issue - tct is passed : utc/itc 100% Change-Id: If6e023acf3d189869183fc33220562f2013534da Signed-off-by: kibak.yoon --- src/server/sensor_handler.cpp | 28 ++++++++++++++++++++++++++++ src/server/sensor_handler.h | 6 ++++++ src/server/sensor_listener_proxy.cpp | 3 +-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/server/sensor_handler.cpp b/src/server/sensor_handler.cpp index 2a2eb6a..37c4dc2 100644 --- a/src/server/sensor_handler.cpp +++ b/src/server/sensor_handler.cpp @@ -28,6 +28,8 @@ using namespace sensor; sensor_handler::sensor_handler(const sensor_info &info) : m_info(info) +, m_last_data(NULL) +, m_last_data_size(0) { const char *priv = sensor::utils::get_privilege(m_info.get_uri()); m_info.set_privilege(priv); @@ -84,6 +86,8 @@ int sensor_handler::notify(const char *uri, sensor_data_t *data, int len) if (msg->ref_count() == 0) msg->unref(); + set_cache(data, len); + return OP_SUCCESS; } @@ -91,3 +95,27 @@ uint32_t sensor_handler::observer_count(void) { return m_observers.size(); } + +void sensor_handler::set_cache(sensor_data_t *data, int size) +{ + if (m_last_data == NULL) { + m_last_data = (sensor_data_t*)malloc(size); + retm_if(m_last_data == NULL, "Memory allocation failed"); + } + + m_last_data_size = size; + memcpy(m_last_data, data, size); +} + +int sensor_handler::get_cache(sensor_data_t **data, int *len) +{ + retv_if(m_last_data == NULL, -ENODATA); + + *data = (sensor_data_t *)malloc(m_last_data_size); + retvm_if(*data == NULL, -ENOMEM, "Memory allocation failed"); + + memcpy(*data, m_last_data, m_last_data_size); + *len = m_last_data_size; + + return 0; +} diff --git a/src/server/sensor_handler.h b/src/server/sensor_handler.h index 37774e9..db237e4 100644 --- a/src/server/sensor_handler.h +++ b/src/server/sensor_handler.h @@ -52,11 +52,17 @@ public: virtual int flush(sensor_observer *ob) = 0; virtual int get_data(sensor_data_t **data, int *len) = 0; + void set_cache(sensor_data_t *data, int size); + int get_cache(sensor_data_t **data, int *len); + protected: sensor_info m_info; private: std::list m_observers; + + sensor_data_t *m_last_data; + int m_last_data_size; }; } diff --git a/src/server/sensor_listener_proxy.cpp b/src/server/sensor_listener_proxy.cpp index a850018..2a704cd 100644 --- a/src/server/sensor_listener_proxy.cpp +++ b/src/server/sensor_listener_proxy.cpp @@ -191,8 +191,7 @@ 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 sensor->get_data(data, len); + return sensor->get_cache(data, len); } std::string sensor_listener_proxy::get_required_privileges(void) -- 2.7.4