#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)
{
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)