sensord: caching data to get previous data 79/157479/2 devel/tizen
authorkibak.yoon <kibak.yoon@samsung.com>
Tue, 24 Oct 2017 15:27:04 +0000 (00:27 +0900)
committerKibak Yoon <kibak.yoon@samsung.com>
Wed, 25 Oct 2017 00:53:15 +0000 (00:53 +0000)
- Svace/Coverity : no issue
- tct is passed : utc/itc 100%

Change-Id: If6e023acf3d189869183fc33220562f2013534da
Signed-off-by: kibak.yoon <kibak.yoon@samsung.com>
src/server/sensor_handler.cpp
src/server/sensor_handler.h
src/server/sensor_listener_proxy.cpp

index 2a2eb6a..37c4dc2 100644 (file)
@@ -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;
+}
index 37774e9..db237e4 100644 (file)
@@ -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<sensor_observer *> m_observers;
+
+       sensor_data_t *m_last_data;
+       int m_last_data_size;
 };
 
 }
index a850018..2a704cd 100644 (file)
@@ -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)