int kernel_get_total_cpu_stat(struct cpu_stat *total);
int kernel_get_per_cpu_stat(struct cpu_stat *cpus, int num_possible_cpus,
int *num_online_cpus);
+
+int kernel_get_memory_info(const char *key);
+int kernel_get_memory_total(void);
#endif
#include <tmonitor/tmonitor.h>
-#define PROC_MEM_INFO_PATH "/proc/meminfo"
-#define PROC_MEM_INFO_MEM_TOTAL "MemTotal"
#define PROC_MEM_INFO_MEM_AVAILABLE "MemAvailable"
#define PROC_MEM_INFO_MEM_FREE "MemFree"
-static int __memory_read_val_from_proc_node(const char *key)
-{
- int ret = -EINVAL;
- char buf[BUFF_MAX];
- char str[BUFF_MAX];
- FILE *fp = NULL;
-
- fp = fopen(PROC_MEM_INFO_PATH, "r");
- if (!fp)
- return -EIO;
-
- while (fgets(buf, BUFF_MAX, fp)) {
- if (!strncmp(buf, key, strlen(key))) {
- sscanf(buf, "%s %d", str, &ret);
- break;
- }
- }
- fclose(fp);
-
- return ret;
-}
-
static inline int memory_read_val_from_proc_node(uint32_t val_id)
{
switch (val_id) {
case MEMORY_TOTAL:
- return __memory_read_val_from_proc_node(PROC_MEM_INFO_MEM_TOTAL);
+ return kernel_get_memory_total();
case MEMORY_AVAILABLE:
- return __memory_read_val_from_proc_node(PROC_MEM_INFO_MEM_AVAILABLE);
+ return kernel_get_memory_info(PROC_MEM_INFO_MEM_AVAILABLE);
case MEMORY_FREE:
- return __memory_read_val_from_proc_node(PROC_MEM_INFO_MEM_FREE);
+ return kernel_get_memory_info(PROC_MEM_INFO_MEM_FREE);
}
return -EINVAL;
}
return ret;
}
+
+int kernel_get_memory_info(const char *key)
+{
+ int ret = -EINVAL;
+ char buf[BUFF_MAX];
+ char str[BUFF_MAX];
+ FILE *fp = NULL;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (!fp)
+ return -EIO;
+
+ while (fgets(buf, BUFF_MAX, fp)) {
+ if (!strncmp(buf, key, strlen(key))) {
+ sscanf(buf, "%s %d", str, &ret);
+ break;
+ }
+ }
+ fclose(fp);
+
+ return ret;
+}
+
+int kernel_get_memory_total(void)
+{
+ static u_int64_t mem_total = 0;
+
+ if (!mem_total)
+ mem_total = kernel_get_memory_info("MemTotal");
+
+ return mem_total;
+}