From a05084f381c3d63c8e1b643f72f4021935d41d8a Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Sun, 28 Jun 2015 00:00:00 -0500 Subject: [PATCH] library: add chaining provisions to meminfo and vmstat If a caller chooses to reduce the overhead of repeated function calls, this commit provides for acquiring all the desired information in just a single library call. Signed-off-by: Jim Warner --- proc/libprocps.sym | 2 ++ proc/meminfo.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++ proc/meminfo.h | 7 ++++ proc/vmstat.c | 29 ++++++++++++++++ proc/vmstat.h | 7 ++++ 5 files changed, 127 insertions(+) diff --git a/proc/libprocps.sym b/proc/libprocps.sym index 6245ee1d..6b3bcc10 100644 --- a/proc/libprocps.sym +++ b/proc/libprocps.sym @@ -67,6 +67,7 @@ global: procps_meminfo_ref; procps_meminfo_unref; procps_meminfo_get; + procps_meminfo_get_chain; procps_stat_new; procps_stat_read; procps_stat_ref; @@ -78,6 +79,7 @@ global: procps_vmstat_ref; procps_vmstat_unref; procps_vmstat_get; + procps_vmstat_get_chain; local: *; }; diff --git a/proc/meminfo.c b/proc/meminfo.c index ad332c59..7ab1cc9e 100644 --- a/proc/meminfo.c +++ b/proc/meminfo.c @@ -279,3 +279,85 @@ PROCPS_EXPORT unsigned long procps_meminfo_get ( } return 0; } + +PROCPS_EXPORT int procps_meminfo_get_chain ( + struct procps_meminfo *info, + struct meminfo_result *item) +{ + + if (item == NULL) + return -EINVAL; + + do { + switch (item->item) { + case PROCPS_MEM_ACTIVE: + item->result = info->data.active; + break; + case PROCPS_MEM_INACTIVE: + item->result = info->data.inactive; + break; + case PROCPS_MEMHI_FREE: + item->result = info->data.high_free; + break; + case PROCPS_MEMHI_TOTAL: + item->result = info->data.high_total; + break; + case PROCPS_MEMHI_USED: + if (info->data.high_free > info->data.high_total) + item->result = 0; + else + item->result = info->data.high_total - info->data.high_free; + break; + case PROCPS_MEMLO_FREE: + item->result = info->data.low_free; + break; + case PROCPS_MEMLO_TOTAL: + item->result = info->data.low_total; + break; + case PROCPS_MEMLO_USED: + if (info->data.low_free > info->data.low_total) + item->result = 0; + else + item->result = info->data.low_total - info->data.low_free; + break; + case PROCPS_MEM_AVAILABLE: + item->result = info->data.available; + break; + case PROCPS_MEM_BUFFERS: + item->result = info->data.buffers; + break; + case PROCPS_MEM_CACHED: + item->result = info->data.cached; + break; + case PROCPS_MEM_FREE: + item->result = info->data.free; + break; + case PROCPS_MEM_SHARED: + item->result = info->data.shared; + break; + case PROCPS_MEM_TOTAL: + item->result = info->data.total; + break; + case PROCPS_MEM_USED: + item->result = info->data.used; + break; + case PROCPS_SWAP_FREE: + item->result = info->data.swap_free; + break; + case PROCPS_SWAP_TOTAL: + item->result = info->data.swap_total; + break; + case PROCPS_SWAP_USED: + if (info->data.swap_free > info->data.swap_total) + item->result = 0; + else + item->result = info->data.swap_total - info->data.swap_free; + break; + default: + return -EINVAL; + } + item = item->next; + } while (item); + + return 0; +} diff --git a/proc/meminfo.h b/proc/meminfo.h index aaa5dece..31b46d45 100644 --- a/proc/meminfo.h +++ b/proc/meminfo.h @@ -47,6 +47,12 @@ enum meminfo_item { PROCPS_SWAP_USED }; +struct meminfo_result { + enum meminfo_item item; + unsigned long result; + struct meminfo_result *next; +}; + struct procps_meminfo; int procps_meminfo_new (struct procps_meminfo **info); @@ -56,6 +62,7 @@ struct procps_meminfo *procps_meminfo_ref (struct procps_meminfo *info); struct procps_meminfo *procps_meminfo_unref (struct procps_meminfo *info); unsigned long procps_meminfo_get (struct procps_meminfo *info, enum meminfo_item item); +int procps_meminfo_get_chain (struct procps_meminfo *info, struct meminfo_result *item); __END_DECLS #endif diff --git a/proc/vmstat.c b/proc/vmstat.c index 9bb9db21..8f9f1f6f 100644 --- a/proc/vmstat.c +++ b/proc/vmstat.c @@ -157,3 +157,32 @@ PROCPS_EXPORT unsigned long procps_vmstat_get ( return 0; } +PROCPS_EXPORT int procps_vmstat_get_chain ( + struct procps_vmstat *info, + struct vmstat_result *item) +{ + if (item == NULL) + return -EINVAL; + + do { + switch (item->item) { + case PROCPS_VMSTAT_PGPGIN: + item->result = info->data.pgpgin; + break; + case PROCPS_VMSTAT_PGPGOUT: + item->result = info->data.pgpgout; + break; + case PROCPS_VMSTAT_PSWPIN: + item->result = info->data.pswpin; + break; + case PROCPS_VMSTAT_PSWPOUT: + item->result = info->data.pswpout; + break; + default: + return -EINVAL; + } + item = item->next; + } while (item); + + return 0; +} diff --git a/proc/vmstat.h b/proc/vmstat.h index 7c55dcf7..7c22bd71 100644 --- a/proc/vmstat.h +++ b/proc/vmstat.h @@ -34,6 +34,12 @@ enum vmstat_item { PROCPS_VMSTAT_PSWPOUT }; +struct vmstat_result { + enum vmstat_item item; + unsigned long result; + struct vmstat_result *next; +}; + struct procps_vmstat; int procps_vmstat_new (struct procps_vmstat **info); @@ -43,6 +49,7 @@ struct procps_vmstat *procps_vmstat_ref (struct procps_vmstat *info); struct procps_vmstat *procps_vmstat_unref (struct procps_vmstat *info); unsigned long procps_vmstat_get (struct procps_vmstat *info, enum vmstat_item item); +int procps_vmstat_get_chain (struct procps_vmstat *info, struct vmstat_result *item); __END_DECLS #endif