Use vector<char> to cache sensor_data_t in sensor_handler 13/220413/1 accepted/tizen/5.5/unified/20200108.120656 accepted/tizen/unified/20200116.101829 submit/tizen/20200115.045858 submit/tizen_5.5/20191219.060634 submit/tizen_5.5/20191220.063605 submit/tizen_5.5/20191227.001507 submit/tizen_5.5/20200108.003557
authorBoram Bae <boram21.bae@samsung.com>
Wed, 18 Dec 2019 05:49:33 +0000 (14:49 +0900)
committerBoram Bae <boram21.bae@samsung.com>
Wed, 18 Dec 2019 05:49:33 +0000 (14:49 +0900)
* This patch fixes the memory leak in the Sensord.

Change-Id: I6a4f6751465a37e9a0bf71a6cd8cff8abc942e80
Signed-off-by: Boram Bae <boram21.bae@samsung.com>
src/sensorctl/testcase/sensor_provider.cpp
src/server/sensor_handler.cpp
src/server/sensor_handler.h

index e302529..397ab0e 100644 (file)
@@ -515,4 +515,48 @@ TESTCASE(skip_sensor_provider, mysensor_get_data_list)
        ASSERT_TRUE(ret);
 
        return true;
+}
+
+TESTCASE(skip_sensor_provider, mysensor_get_data)
+{
+       int err;
+       bool ret;
+       int handle;
+       sensor_t sensor;
+       sensor_type_t type;
+
+       called = false;
+
+       err = sensord_get_default_sensor_by_uri(MYSENSOR_BATCH_URI, &sensor);
+       ASSERT_EQ(err, 0);
+
+       handle = sensord_connect(sensor);
+
+       sensord_get_type(sensor, &type);
+       ASSERT_EQ(err, 0);
+
+       ret = sensord_start(handle, 0);
+       ASSERT_TRUE(ret);
+
+       sensor_data_t data ;
+       unsigned int data_id = type << SENSOR_SHIFT_TYPE | 0x1;
+
+       ret = sensord_get_data(handle, data_id, &data);
+       ASSERT_TRUE(ret);
+
+       _I("[%llu]", data.timestamp);
+       for (int j = 0; j < data.value_count; j++)
+               _I(" %f", data.values[j]);
+       _I("\n");
+
+       ret = sensord_stop(handle);
+       ASSERT_TRUE(ret);
+
+       ret = sensord_unregister_events(handle, 1);
+       ASSERT_TRUE(ret);
+
+       ret = sensord_disconnect(handle);
+       ASSERT_TRUE(ret);
+
+       return true;
 }
\ No newline at end of file
index 9ae43a3..33c3e53 100644 (file)
@@ -30,8 +30,6 @@ 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);
@@ -100,28 +98,29 @@ uint32_t sensor_handler::observer_count(void)
 
 void sensor_handler::set_cache(sensor_data_t *data, int size)
 {
-       if (m_last_data_size != size) {
-               m_last_data_size = size;
-               if (m_last_data) {
-                       free(m_last_data);
-               }
-               m_last_data = (sensor_data_t*)malloc(m_last_data_size);
-               retm_if(m_last_data == NULL, "Memory allocation failed");
-       }
+       char* p = (char*) data;
 
-       m_last_data_size = size;
-       memcpy(m_last_data, data, size);
+       try {
+               m_sensor_data_cache.reserve(size);
+       } catch (...) {
+               _E("Memory allocation failed");
+               return;
+       }
+       m_sensor_data_cache.clear();
+       m_sensor_data_cache.insert(m_sensor_data_cache.begin(), p, p + size);
 }
 
 int sensor_handler::get_cache(sensor_data_t **data, int *len)
 {
-       retv_if(m_last_data == NULL, -ENODATA);
+       auto size = m_sensor_data_cache.size();
+       retv_if(size == 0, -ENODATA);
 
-       *data = (sensor_data_t *)malloc(m_last_data_size);
-       retvm_if(*data == NULL, -ENOMEM, "Memory allocation failed");
+       char* temp = (char *)malloc(size);
+       retvm_if(temp == NULL, -ENOMEM, "Memory allocation failed");
+       std::copy(m_sensor_data_cache.begin(), m_sensor_data_cache.end(), temp);
 
-       memcpy(*data, m_last_data, m_last_data_size);
-       *len = m_last_data_size;
+       *len = size;
+       *data = (sensor_data_t *)temp;
 
        return 0;
 }
index e42a8e3..e7b3168 100644 (file)
@@ -72,8 +72,7 @@ protected:
 private:
        std::list<sensor_observer *> m_observers;
 
-       sensor_data_t *m_last_data;
-       int m_last_data_size;
+       std::vector<char> m_sensor_data_cache;
 };
 
 }