From ae46b290aad15164222174892a42bf830bce7ab8 Mon Sep 17 00:00:00 2001 From: Somin Kim Date: Thu, 22 Dec 2016 00:05:36 +0900 Subject: [PATCH] [battery-stats] Request heart db sync Change-Id: I1e76bfa2ef8f64322f80eb61339445a15b604ae9 Signed-off-by: Somin Kim --- src/battery-stats/BatteryMonitor.cpp | 33 ++++++++-- src/battery-stats/BatteryMonitor.h | 3 + src/battery-stats/BatteryUsage.cpp | 3 + src/battery-stats/HeartDbReader.cpp | 76 ++++++++++++++++++++++-- src/battery-stats/HeartDbReader.h | 15 +++-- src/battery-stats/RecentBatteryUsage.cpp | 2 + 6 files changed, 118 insertions(+), 14 deletions(-) diff --git a/src/battery-stats/BatteryMonitor.cpp b/src/battery-stats/BatteryMonitor.cpp index e196338..d7dee42 100644 --- a/src/battery-stats/BatteryMonitor.cpp +++ b/src/battery-stats/BatteryMonitor.cpp @@ -21,7 +21,6 @@ #include #include #include -#include "HeartDbReader.h" #include "BatteryMonitor.h" #define DEFAULT_ROW_ID_STR "1" @@ -34,7 +33,8 @@ BatteryMonitor* BatteryMonitor::__instance = NULL; BatteryMonitor::BatteryMonitor() : __bootingTime(0), __lastFullTime(0), - __lastHeartAccessTime(0) + __lastHeartAccessTime(0), + __heartReader(NULL) { } @@ -136,6 +136,9 @@ gboolean BatteryMonitor::__timeoutCb(gpointer data) int BatteryMonitor::start() { + __heartReader = new(std::nothrow) HeartDbReader(); + IF_FAIL_RETURN_TAG(__heartReader, ERR_OUT_OF_MEMORY, _E, "Memory allocation failed"); + __loadLastInfo(); int error = device_add_callback(DEVICE_CALLBACK_BATTERY_CHARGING, __chargerChangeCb, this); @@ -149,6 +152,11 @@ int BatteryMonitor::start() int BatteryMonitor::stop() { + if (__heartReader) { + delete __heartReader; + __heartReader = NULL; + } + int error = device_remove_callback(DEVICE_CALLBACK_BATTERY_CHARGING, __chargerChangeCb); IF_FAIL_RETURN_TAG(error == DEVICE_ERROR_NONE, ERR_OPERATION_FAILED, _E, "Failed to remove callback for charger status"); @@ -189,13 +197,12 @@ bool BatteryMonitor::__getLastCpuUsageTable(CpuUsageMap* lastHeartCpuLog) bool BatteryMonitor::__processBatteryUsage() { // Read from heart cpu table - HeartDbReader heartReader; - bool ret = heartReader.open(); + bool ret = __heartReader->dbOpen(); IF_FAIL_RETURN_TAG(ret, true, _E, "Failed to open heart db"); std::vector heartCpuLog; - ret = heartReader.readCpuLog(__lastHeartAccessTime, &heartCpuLog); - heartReader.close(); + ret = __heartReader->readCpuLog(__lastHeartAccessTime, &heartCpuLog); + __heartReader->dbClose(); IF_FAIL_RETURN_TAG(ret, true, _E, "Cannot read from heart cpu table"); IF_FAIL_RETURN_TAG(heartCpuLog.size() > 0, true, _W, "Heart cpu data is not prepared"); @@ -259,6 +266,7 @@ bool BatteryMonitor::__insertBatteryUsageLog(std::vector& usage) bool BatteryMonitor::__updateLastCpuUsageLog(CpuUsageMap& usage) { IF_FAIL_RETURN_TAG(usage.size(), true, _W, "No data"); + _D("Delete all rows from app last times table"); __dbMgr.executeSync("DELETE FROM " BATTERY_LAST_CPU_USAGE_TABLE, NULL); std::string query("INSERT INTO " BATTERY_LAST_CPU_USAGE_TABLE "(" BATTERY_APP_ID ", " BATTERY_UTIME ", " BATTERY_STIME ", " BATTERY_TIMESTAMP ", " BATTERY_PID ") VALUES"); @@ -298,3 +306,16 @@ int BatteryMonitor::getLastFullTime() return __lastFullTime; } + +void BatteryMonitor::prepareData() +{ + int timeDiff = CURRENT_TIME - __lastHeartAccessTime; + IF_FAIL_VOID_TAG(timeDiff >= 5 * 60 * 1000, + _D, "Battery usage was updated %d minutes ago", timeDiff / 60000); + + _D("Request to sync heart cpu data"); + bool ret = __heartReader->requestSync(); + IF_FAIL_VOID_TAG(ret, _E, "Failed to sync heart db"); + + __processBatteryUsage(); +} diff --git a/src/battery-stats/BatteryMonitor.h b/src/battery-stats/BatteryMonitor.h index c6c10a8..89bf7f0 100644 --- a/src/battery-stats/BatteryMonitor.h +++ b/src/battery-stats/BatteryMonitor.h @@ -20,6 +20,7 @@ #include #include #include "BatteryUsageAnalyzer.h" +#include "HeartDbReader.h" namespace ctx { @@ -35,6 +36,7 @@ namespace ctx { int start(); int stop(); int getLastFullTime(); + void prepareData(); private: bool __loadLastInfo(); @@ -55,6 +57,7 @@ namespace ctx { DatabaseManager __dbMgr; BatteryUsageAnalyzer __analyzer; + HeartDbReader *__heartReader; }; } /* namespace ctx */ diff --git a/src/battery-stats/BatteryUsage.cpp b/src/battery-stats/BatteryUsage.cpp index c443f62..532234c 100644 --- a/src/battery-stats/BatteryUsage.cpp +++ b/src/battery-stats/BatteryUsage.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "BatteryMonitor.h" #include "BatteryUsage.h" #define SECONDS_IN_A_DAY 86400 @@ -31,6 +32,8 @@ BatteryUsageProvider::~BatteryUsageProvider() int BatteryUsageProvider::read(Json option, Json *requestResult) { + BatteryMonitor::getInstance()->prepareData(); + int startTime; int endTime; int timeSpan = DEFAULT_TIME_SPAN; diff --git a/src/battery-stats/HeartDbReader.cpp b/src/battery-stats/HeartDbReader.cpp index 5d8126a..d8db28f 100644 --- a/src/battery-stats/HeartDbReader.cpp +++ b/src/battery-stats/HeartDbReader.cpp @@ -31,33 +31,52 @@ using namespace ctx; HeartDbReader::HeartDbReader() : - __heartDb(NULL) + __heartDb(NULL), + __connection(NULL), + __dbRefCount(0) { + __initializeDBusConnection(); } HeartDbReader::~HeartDbReader() { if (__heartDb) { - close(); + dbClose(); + } + + if (__connection) { + __releaseDBusConnection(); } } -bool HeartDbReader::open() +bool HeartDbReader::dbOpen() { + if (__heartDb) { + __dbRefCount++; + return true; + } + sqlite3 *db = NULL; int ret; ret = sqlite3_open_v2(HEART_DB_PATH, &db, SQLITE_OPEN_READONLY, NULL); IF_FAIL_RETURN_TAG(ret == SQLITE_OK, false, _E, "Failed to open HEART db: %s", sqlite3_errmsg(db)); __heartDb = db; + __dbRefCount++; return true; } -void HeartDbReader::close() +void HeartDbReader::dbClose() { + if (__dbRefCount > 1) { + __dbRefCount--; + return; + } + sqlite3_close(__heartDb); __heartDb = NULL; + __dbRefCount = 0; } bool HeartDbReader::readCpuLog(int lastHeartAccessTime, std::vector* cpuUsageLog) @@ -134,3 +153,52 @@ void HeartDbReader::__convertCpuUsageLog(Json& row, Json* newRow) newRow->set(NULL, BATTERY_INDEX, index); newRow->set(NULL, BATTERY_PID, pid); } + +bool HeartDbReader::__initializeDBusConnection() +{ +#if !GLIB_CHECK_VERSION(2, 36, 0) + g_type_init(); +#endif + GError *error = NULL; + + __connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (!__connection) { + _E("dbus connection get failed: %s", error->message); + g_error_free(error); + return false; + } + + return true; +} + +void HeartDbReader::__releaseDBusConnection() +{ + if (__connection) { + g_object_unref(__connection); + __connection = NULL; + } +} + +bool HeartDbReader::requestSync() +{ + IF_FAIL_RETURN_TAG(__connection, false, _E, "Dbus connection is not initialized"); + + GError *error = NULL; + GVariant* ret = NULL; + ret = g_dbus_connection_call_sync(__connection, + "org.tizen.resourced", "/Org/Tizen/ResourceD/Logging", "org.tizen.resourced.logging", + "SyncCpuData", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, 2000, NULL, &error); + + if (error) { + _E("Failed to dbus call: %s", error->message); + g_clear_error(&error); + return false; + } + + int result; + g_variant_get(ret, "(i)", &result); + g_variant_unref(ret); + IF_FAIL_RETURN_TAG(result != -1, false, _E, "Failed to sync heart cpu data"); + + return true; +} diff --git a/src/battery-stats/HeartDbReader.h b/src/battery-stats/HeartDbReader.h index ddf600e..b219919 100644 --- a/src/battery-stats/HeartDbReader.h +++ b/src/battery-stats/HeartDbReader.h @@ -17,9 +17,11 @@ #ifndef _CONTEXT_HEART_DB_READER_H_ #define _CONTEXT_HEART_DB_READER_H_ -#include #include +#include +#include #include +#include namespace ctx { @@ -28,16 +30,21 @@ namespace ctx { HeartDbReader(); ~HeartDbReader(); - bool open(); - void close(); - + bool dbOpen(); + void dbClose(); bool readCpuLog(int __lastHeartAccessTime, std::vector* cpuUsageLog); + bool requestSync(); private: static int __cpuUsageLogCb(void *userData, int dim, char **value, char **column); static void __convertCpuUsageLog(Json& row, Json* newRow); + bool __initializeDBusConnection(); + void __releaseDBusConnection(); + sqlite3 *__heartDb; + GDBusConnection *__connection; + int __dbRefCount; }; } /* namespace ctx */ diff --git a/src/battery-stats/RecentBatteryUsage.cpp b/src/battery-stats/RecentBatteryUsage.cpp index f6954c7..eda9d8e 100644 --- a/src/battery-stats/RecentBatteryUsage.cpp +++ b/src/battery-stats/RecentBatteryUsage.cpp @@ -30,6 +30,8 @@ RecentBatteryUsageProvider::~RecentBatteryUsageProvider() int RecentBatteryUsageProvider::read(Json option, Json *requestResult) { + BatteryMonitor::getInstance()->prepareData(); + int resultSize; bool hasLimit = option.get(NULL, KEY_RESULT_SIZE, &resultSize); -- 2.34.1