procfs: implement reading process smaps 54/181554/3
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Thu, 14 Jun 2018 16:19:05 +0000 (18:19 +0200)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Mon, 18 Jun 2018 11:59:27 +0000 (13:59 +0200)
Change-Id: I5a338ce451bc37abae16aec540797c8ec8bbea2b

src/procfs.c

index 336a126..a7f822d 100644 (file)
@@ -27,6 +27,7 @@
 #define MEMINFO_FILEPATH "/proc/meminfo"
 #define STAT_FILEPATH "/proc/stat"
 #define PIDSTAT_FILEPATH "/proc/%d/stat"
+#define SMAPS_FILEPATH "/proc/%d/smaps"
 
 int procfs_read_system_load_average(struct procfs_load_average_info *info)
 {
@@ -145,7 +146,42 @@ int procfs_read_system_memory_usage(struct procfs_system_memory_usage_info *usag
 
 int procfs_read_process_memory_usage(int pid, struct procfs_process_memory_usage_info *usage)
 {
-       return -1;
+       ON_NULL_RETURN_VAL(usage, -1);
+       ON_TRUE_RETURN_VAL(pid <= 0, -1);
+
+       char smapspath[64], line[256];
+       unsigned long value;
+
+       snprintf(smapspath, sizeof(smapspath), SMAPS_FILEPATH, pid);
+
+       FILE *smaps_fp = fopen(smapspath, "r");
+       if (!smaps_fp) {
+                ERR("failed to open path: %s", smapspath);
+                return -1;
+       }
+
+       memset(usage, 0x0, sizeof(struct procfs_process_memory_usage_info));
+
+       while (fgets(line, sizeof(line), smaps_fp)) {
+               if (sscanf(line, "Size: %lu", &value) == 1)
+                       usage->vsz += value;
+               else if (sscanf(line, "Rss: %lu", &value) == 1)
+                       usage->rss += value;
+               else if (sscanf(line, "Pss: %lu", &value) == 1)
+                       usage->pss += value;
+               else if (sscanf(line, "Shared_Clean: %lu", &value) == 1)
+                       usage->shared_clean += value;
+               else if (sscanf(line, "Shared_Dirty: %lu", &value) == 1)
+                       usage->shared_dirty += value;
+               else if (sscanf(line, "Private_Clean: %lu", &value) == 1)
+                       usage->private_clean += value;
+               else if (sscanf(line, "Private_Dirty: %lu", &value) == 1)
+                       usage->private_dirty += value;
+       }
+
+       fclose(smaps_fp);
+
+       return 0;
 }
 
 int procfs_read_process_cpu_usage(int pid, struct procfs_process_cpu_usage_info *usage)