#define JIFFY_TO_MS_FACTOR 10 // 1000 / 100
#define JIFFY_TO_MS(x) ((x) >= UINT_MAX / JIFFY_TO_MS_FACTOR ? UINT_MAX : (x) * JIFFY_TO_MS_FACTOR)
+#define DATA_FROM_2ND_TOKEN "SUBSTR(data, INSTR(data, ' ') + 1)"
+#define SQLITE_QUERY \
+"SELECT" \
+" appid, data," \
+" SUBSTR(data, len_utime + len_stime + 1, len_pid - 1) AS pid" \
+" FROM (SELECT *," \
+" INSTR(data, ' ') AS len_utime," \
+" INSTR(" DATA_FROM_2ND_TOKEN ", ' ') AS len_stime," \
+" INSTR(SUBSTR(" DATA_FROM_2ND_TOKEN ", INSTR(" DATA_FROM_2ND_TOKEN ", ' ') + 1), ' ') AS len_pid" \
+" FROM cpu" \
+" )" \
+" WHERE time BETWEEN %ld AND %ld" \
+" GROUP BY appid, pid" \
+" HAVING MAX(time)"
+
struct app_status {
pid_t pid;
time_t used_time; // utime + stime
/* Sqlite */
sqlite3 *db;
sqlite3_stmt *stmt;
- char query[128];
+ char query[512];
/* DB row */
const char *appid;
/* Read data from HEART-CPU DB */
_I("Gather CPU usage : %ld ~ %ld", last_requested_time, current_time);
- snprintf(query, 128, "SELECT appid,data FROM cpu WHERE (time >= %ld AND time < %ld)", last_requested_time, current_time);
+ snprintf(query, 512, SQLITE_QUERY, last_requested_time, current_time);
ret = sqlite3_prepare_v2(db, query, -1, &stmt, 0);
while (sqlite3_step(stmt) == SQLITE_ROW) {
appid = (const char *)sqlite3_column_text(stmt, 0);