From 9c33dc764285596524f92f915ac353a133362569 Mon Sep 17 00:00:00 2001 From: Boram Bae Date: Wed, 18 Dec 2019 14:49:33 +0900 Subject: [PATCH] Use vector to cache sensor_data_t in sensor_handler * This patch fixes the memory leak in the Sensord. Change-Id: I6a4f6751465a37e9a0bf71a6cd8cff8abc942e80 Signed-off-by: Boram Bae --- src/sensorctl/testcase/sensor_provider.cpp | 44 ++++++++++++++++++++++++++++++ src/server/sensor_handler.cpp | 33 +++++++++++----------- src/server/sensor_handler.h | 3 +- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/src/sensorctl/testcase/sensor_provider.cpp b/src/sensorctl/testcase/sensor_provider.cpp index e302529..397ab0e 100644 --- a/src/sensorctl/testcase/sensor_provider.cpp +++ b/src/sensorctl/testcase/sensor_provider.cpp @@ -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 diff --git a/src/server/sensor_handler.cpp b/src/server/sensor_handler.cpp index 9ae43a3..33c3e53 100644 --- a/src/server/sensor_handler.cpp +++ b/src/server/sensor_handler.cpp @@ -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; } diff --git a/src/server/sensor_handler.h b/src/server/sensor_handler.h index e42a8e3..e7b3168 100644 --- a/src/server/sensor_handler.h +++ b/src/server/sensor_handler.h @@ -72,8 +72,7 @@ protected: private: std::list m_observers; - sensor_data_t *m_last_data; - int m_last_data_size; + std::vector m_sensor_data_cache; }; } -- 2.7.4