Read zoneinfo to get total RAM size
[platform/core/api/runtime-info.git] / src / runtime_info_usage.c
index 6e8d3e6..4a05400 100644 (file)
@@ -35,6 +35,7 @@
 #define CPU_USAGE 2
 
 #define kBtoKiB(val) (int)(((long long)val * 1024)/1000)
+#define pagetoKiB(val) (int)((long long)val * 4096 / 1000)
 
 //LCOV_EXCL_START : system error
 static int runtime_info_get_dbus_error(const char *err_name)
@@ -157,9 +158,9 @@ static DBusMessage *runtime_info_dbus_process_usage_info(int *pid, int size, int
 
 API int runtime_info_get_system_memory_info(runtime_memory_info_s *info)
 {
-       FILE *meminfo_fp;
+       FILE *fp;
        char buf[256];
-       unsigned long swap_total, swap_free, value;
+       unsigned long swap_total, swap_free, value, mem_available;
 
        if (info == NULL) {
                _E("INVALID_PARAMETER(0x%08x) : invalid output param",
@@ -167,32 +168,57 @@ API int runtime_info_get_system_memory_info(runtime_memory_info_s *info)
                return RUNTIME_INFO_ERROR_INVALID_PARAMETER;
        }
 
-       swap_total = swap_free = 0;
+       swap_total = swap_free = mem_available = 0;
 
-       meminfo_fp = fopen("/proc/meminfo", "r");
-       if (meminfo_fp == NULL) {
+       fp = fopen("/proc/meminfo", "r");
+       if (fp == NULL) {
                _E("IO_ERROR(0x%08x) : failed to open file to read memory usage",
                                RUNTIME_INFO_ERROR_IO_ERROR);
                return RUNTIME_INFO_ERROR_IO_ERROR;
        }
 
-       while (fgets(buf, sizeof(buf), meminfo_fp) != NULL) {
+       while (fgets(buf, sizeof(buf), fp) != NULL) {
                if (sscanf(buf, "MemTotal: %lu", &value) == 1)
                        info->total = kBtoKiB(value);
                else if (sscanf(buf, "MemFree: %lu", &value) == 1)
                        info->free = kBtoKiB(value);
                else if (sscanf(buf, "Cached: %lu", &value) == 1)
                        info->cache = kBtoKiB(value);
+               else if (sscanf(buf, "MemAvailable: %lu", &value) == 1)
+                       mem_available = kBtoKiB(value);
                else if (sscanf(buf, "SwapTotal: %lu", &value) == 1)
                        swap_total = value;
                else if (sscanf(buf, "SwapFree: %lu", &value) == 1)
                        swap_free = value;
        }
-       fclose(meminfo_fp);
+       fclose(fp);
 
-       info->used = (info->total > info->free) ? (info->total - info->free) : 0;
+       info->used = mem_available ? (info->total - mem_available) : (info->total - info->free - info->cache);
        info->swap = kBtoKiB(((swap_total > swap_free) ? (int)(swap_total - swap_free) : 0));
 
+       /*
+        * Get total memory size from zoneinfo
+        *
+        * meminfo show the total memory size
+        * except kernel reserved memory
+        *
+        * Therefore, we will use (the number of page * page size)
+        */
+       fp = fopen("/proc/zoneinfo", "r");
+       if (fp == NULL) {
+               _E("IO_ERROR(0x%08x) : failed to open file to read memory size",
+                               RUNTIME_INFO_ERROR_IO_ERROR);
+               return RUNTIME_INFO_ERROR_IO_ERROR;
+       }
+
+       info->total = 0;
+       while (fgets(buf, sizeof(buf), fp) != NULL)
+               if (sscanf(buf, " spanned %lu", &value) == 1)
+                       info->total += value;
+       info->total = pagetoKiB(info->total);
+
+       fclose(fp);
+
        return RUNTIME_INFO_ERROR_NONE;
 }