diff --git a/proc/libprocps.sym b/proc/libprocps.sym index 7f4c30b0..b4d19065 100644 --- a/proc/libprocps.sym +++ b/proc/libprocps.sym @@ -78,7 +78,7 @@ global: procps_vmstat_ref; procps_vmstat_unref; procps_vmstat_get; - procps_vmstat_get_chain; + procps_vmstat_getstack; local: *; }; diff --git a/proc/vmstat.c b/proc/vmstat.c index 775cf1fd..e3294b48 100644 --- a/proc/vmstat.c +++ b/proc/vmstat.c @@ -1,11 +1,29 @@ +/* + * libprocps - Library to read proc filesystem + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ #include +#include #include #include #include + #include #include -#include #include #include "procps-private.h" @@ -162,36 +180,40 @@ PROCPS_EXPORT unsigned long procps_vmstat_get ( return info->data.pswpin; case PROCPS_VMSTAT_PSWPOUT: return info->data.pswpout; + default: + return 0; } - return 0; } -PROCPS_EXPORT int procps_vmstat_get_chain ( +PROCPS_EXPORT int procps_vmstat_getstack ( struct procps_vmstat *info, - struct vmstat_result *item) + struct vmstat_result *these) { - if (item == NULL) + if (these == NULL) return -EINVAL; - do { - switch (item->item) { + for (;;) { + switch (these->item) { case PROCPS_VMSTAT_PGPGIN: - item->result = info->data.pgpgin; + these->result.ul_int = info->data.pgpgin; break; case PROCPS_VMSTAT_PGPGOUT: - item->result = info->data.pgpgout; + these->result.ul_int = info->data.pgpgout; break; case PROCPS_VMSTAT_PSWPIN: - item->result = info->data.pswpin; + these->result.ul_int = info->data.pswpin; break; case PROCPS_VMSTAT_PSWPOUT: - item->result = info->data.pswpout; + these->result.ul_int = info->data.pswpout; break; + case PROCPS_VMSTAT_noop: + // don't disturb potential user data in the result struct + break; + case PROCPS_VMSTAT_stack_end: + return 0; default: return -EINVAL; } - item = item->next; - } while (item); - - return 0; + ++these; + } } diff --git a/proc/vmstat.h b/proc/vmstat.h index 4b97df45..1179aa3b 100644 --- a/proc/vmstat.h +++ b/proc/vmstat.h @@ -28,16 +28,19 @@ __BEGIN_DECLS enum vmstat_item { - PROCPS_VMSTAT_PGPGIN, - PROCPS_VMSTAT_PGPGOUT, - PROCPS_VMSTAT_PSWPIN, - PROCPS_VMSTAT_PSWPOUT + PROCPS_VMSTAT_PGPGIN, // ul_int + PROCPS_VMSTAT_PGPGOUT, // ul_int + PROCPS_VMSTAT_PSWPIN, // ul_int + PROCPS_VMSTAT_PSWPOUT, // ul_int + PROCPS_VMSTAT_noop, // n/a + PROCPS_VMSTAT_stack_end // n/a }; struct vmstat_result { enum vmstat_item item; - unsigned long result; - struct vmstat_result *next; + union { + unsigned long ul_int; + } result; }; struct procps_vmstat; @@ -48,8 +51,13 @@ int procps_vmstat_read (struct procps_vmstat *info); int procps_vmstat_ref (struct procps_vmstat *info); int 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); +unsigned long procps_vmstat_get ( + struct procps_vmstat *info, + enum vmstat_item item); + +int procps_vmstat_getstack ( + struct procps_vmstat *info, + struct vmstat_result *these); __END_DECLS #endif