summaryrefslogtreecommitdiff
path: root/x11/fbpanel/files/patch-plugins__mem__mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11/fbpanel/files/patch-plugins__mem__mem.c')
-rw-r--r--x11/fbpanel/files/patch-plugins__mem__mem.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/x11/fbpanel/files/patch-plugins__mem__mem.c b/x11/fbpanel/files/patch-plugins__mem__mem.c
new file mode 100644
index 000000000000..2e6d61f2b4bd
--- /dev/null
+++ b/x11/fbpanel/files/patch-plugins__mem__mem.c
@@ -0,0 +1,127 @@
+--- ./plugins/mem/mem.c.orig 2010-04-28 04:39:31.000000000 -0700
++++ ./plugins/mem/mem.c 2010-11-17 11:11:10.000000000 -0800
+@@ -1,3 +1,6 @@
++/* vim:set ts=4
++ * Code for FreeBSD added by Charlie Kester <corky1951@comcast.net>
++ */
+ #include <time.h>
+ #include <sys/time.h>
+ #include <sys/types.h>
+@@ -6,6 +9,11 @@
+ #include <string.h>
+ #include <strings.h>
+
++#if defined __FreeBSD__
++#include <sys/sysctl.h>
++#include <sys/resource.h>
++#include <vm/vm_param.h>
++#endif
+
+ #include "panel.h"
+ #include "misc.h"
+@@ -112,11 +120,104 @@
+ stats.swap.total = mt[MT_SwapTotal].val;
+ stats.swap.used = mt[MT_SwapTotal].val - mt[MT_SwapFree].val;
+ }
++#elif defined __FreeBSD__
++
++static void
++mem_usage()
++{
++ static unsigned long realmem;
++ static int mib_freecount[4], mib_cachecount[4], mib_inactivecount[4],
++ mib_swapinfo[16], init = 0, pagesize;
++ static u_int mib_free_size, mib_cache_size, mib_inactive_size,
++ mib_swapinfo_size;
++ struct xswdev xsw;
++ long scale;
++ size_t len;
++ int freecount , cachecount, inactivecount, n;
++
++
++ if (init == 0) {
++ //initialize meminfo
++ len = sizeof(unsigned long);
++ if (sysctlbyname("hw.realmem", &realmem, &len, NULL, 0) == -1) {
++ DBG("Can't get hw.realmem");
++ return;
++ }
++ len = sizeof(int);
++ if (sysctlbyname("vm.stats.vm.v_page_size", &pagesize, &len, NULL, 0) == -1) {
++ DBG("Can't get vm page size");
++ return;
++ }
++ mib_free_size = 4;
++ if (sysctlnametomib("vm.stats.vm.v_free_count", mib_freecount, &mib_free_size) == -1) {
++ DBG("Can't get mib for mem free stat");
++ return;
++ }
++ mib_cache_size = 4;
++ if (sysctlnametomib("vm.stats.vm.v_cache_count", mib_cachecount, &len) == -1) {
++ DBG("Can't get mib for cached mem stat");
++ return;
++ }
++ mib_inactive_size = 4;
++ if (sysctlnametomib("vm.stats.vm.v_inactive_count", mib_inactivecount, &mib_inactive_size) == -1) {
++ DBG("Can't get mib for mem inactive stat");
++ return;
++ }
++ //initialize swapinfo
++ mib_swapinfo_size = sizeof(mib_swapinfo) / sizeof(mib_swapinfo[0]);
++ if (sysctlnametomib("vm.swap_info", mib_swapinfo, &mib_swapinfo_size) == -1) {
++ DBG("Can't get mib for swapinfo");
++ return;
++ }
++ init = 1;
++ }
++ //get current meminfo
++ len = sizeof(int);
++ if (sysctl(mib_freecount, mib_free_size, &freecount, &len, NULL, 0) == -1) {
++ DBG("Couldn't get mem free stat");
++ return;
++ }
++ if (sysctl(mib_cachecount, mib_cache_size, &cachecount, &len, NULL, 0) == -1) {
++ DBG("Couldn't get cached mem stat");
++ return;
++ }
++ if (sysctl(mib_inactivecount, mib_inactive_size, &inactivecount, &len, NULL, 0) == -1) {
++ DBG("Couldn't get inactive mem stat");
++ return;
++ }
++ //save in kilobytes(same as /proc/meminfo)
++ stats.mem.total = realmem / 1024;
++ //For FreeBSD, there doesn't seem to be any firm consensus on the meaning of "memory used".
++ //Some utils count only wired memory as used, while others also include active and inactive memory.
++ //
++ //The 'top' utility doesn't bother to calculate "memory used" at all, but simply reports the values for
++ //active, inactive, wired, cached, and free. Unfortunately we can't follow that sensible approach here.
++ //
++ //The calculation below reflects the interpretation used by the sysinfo and freebsd_memory utils.
++ stats.mem.used = (realmem - pagesize * (freecount + cachecount + inactivecount)) / 1024;
++
++ //get swapinfo
++ scale = pagesize / 1024;
++ for (n = 0;; ++n) {
++ mib_swapinfo[mib_swapinfo_size] = n;
++ len = sizeof xsw;
++ if (sysctl(mib_swapinfo, mib_swapinfo_size + 1, &xsw, &len, 0, 0) == -1) {
++ // not necessarily an error!
++ break;
++ }
++ if (xsw.xsw_version != XSWDEV_VERSION) {
++ DBG("XSW version mismatch");
++ break;
++ }
++ stats.swap.total += xsw.xsw_nblks * scale;
++ stats.swap.used += xsw.xsw_used * scale;
++ }
++}
+ #else
+ static void
+ mem_usage()
+ {
+-
++
+ }
+ #endif
+