[HAVE_SYS_PSTAT_H]: Include <sys/pstat.h>.
authorJim Meyering <jim@meyering.net>
Fri, 16 Nov 2001 09:20:25 +0000 (09:20 +0000)
committerJim Meyering <jim@meyering.net>
Fri, 16 Nov 2001 09:20:25 +0000 (09:20 +0000)
(physmem_total) [HAVE_PSTAT_GETSTATIC]: If sysconf couldn't be used to
determine the amount of total physical memory, use pstat_getstatic.
HPUX-11 doesn't define _SC_PHYS_PAGES.
(physmem_available) [HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC]:
If sysconf couldn't be used to determine the amount of available
physical memory, use both pstat_getstatic and pstat_getdynamic.
Based on a patch from Bob Proulx.

lib/physmem.c

index d0e252f1ecf9556663233a007ba1b68243600434..4219c7011be2f2e0213b692f3c6c3ed9f9c4e92d 100644 (file)
@@ -1,5 +1,5 @@
 /* Calculate the size of physical memory.
-   Copyright 2000 Free Software Foundation, Inc.
+   Copyright 2000, 2001 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 # include <unistd.h>
 #endif
 
+#if HAVE_SYS_PSTAT_H
+# include <sys/pstat.h>
+#endif
+
 /* Return the total amount of physical memory.  */
 double
 physmem_total (void)
 {
 #if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE
-  double pages = sysconf (_SC_PHYS_PAGES);
-  double pagesize = sysconf (_SC_PAGESIZE);
-  if (0 <= pages && 0 <= pagesize)
-    return pages * pagesize;
+  {
+    double pages = sysconf (_SC_PHYS_PAGES);
+    double pagesize = sysconf (_SC_PAGESIZE);
+    if (0 <= pages && 0 <= pagesize)
+      return pages * pagesize;
+  }
+#endif
+
+#if HAVE_PSTAT_GETSTATIC
+  {
+    struct pst_static pss;
+    if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0))
+      {
+       double pages = pss.physical_memory;
+       double pagesize = pss.page_size;
+       if (0 <= pages && 0 <= pagesize)
+         return pages * pagesize;
+      }
+  }
 #endif
 
   /* Guess 64 MB.  It's probably an older host, so guess small.  */
@@ -47,10 +66,27 @@ double
 physmem_available (void)
 {
 #if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE
-  double pages = sysconf (_SC_AVPHYS_PAGES);
-  double pagesize = sysconf (_SC_PAGESIZE);
-  if (0 <= pages && 0 <= pagesize)
-    return pages * pagesize;
+  {
+    double pages = sysconf (_SC_AVPHYS_PAGES);
+    double pagesize = sysconf (_SC_PAGESIZE);
+    if (0 <= pages && 0 <= pagesize)
+      return pages * pagesize;
+  }
+#endif
+
+#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC
+  {
+    struct pst_static pss;
+    struct pst_dynamic psd;
+    if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0)
+       && 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0))
+      {
+       double pages = psd.psd_free;
+       double pagesize = pss.page_size;
+       if (0 <= pages && 0 <= pagesize)
+         return pages * pagesize;
+      }
+  }
 #endif
 
   /* Guess 25% of physical memory.  */