| 1 | 
  | 
/* Calculate the size of physical memory. | 
| 2 | 
– | 
   Copyright 2000, 2001, 2003 Free Software Foundation, Inc. | 
| 2 | 
  | 
 | 
| 3 | 
< | 
   This program is free software; you can redistribute it and/or modify | 
| 3 | 
> | 
   Copyright (C) 2000, 2001, 2003, 2005, 2006 Free Software | 
| 4 | 
> | 
   Foundation, Inc. | 
| 5 | 
> | 
 | 
| 6 | 
> | 
   This program is free software: you can redistribute it and/or modify | 
| 7 | 
  | 
   it under the terms of the GNU General Public License as published by | 
| 8 | 
< | 
   the Free Software Foundation; either version 2, or (at your option) | 
| 9 | 
< | 
   any later version. | 
| 8 | 
> | 
   the Free Software Foundation; either version 3 of the License, or | 
| 9 | 
> | 
   (at your option) any later version. | 
| 10 | 
  | 
 | 
| 11 | 
  | 
   This program is distributed in the hope that it will be useful, | 
| 12 | 
  | 
   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 14 | 
  | 
   GNU General Public License for more details. | 
| 15 | 
  | 
 | 
| 16 | 
  | 
   You should have received a copy of the GNU General Public License | 
| 17 | 
< | 
   along with this program; if not, write to the Free Software Foundation, | 
| 16 | 
< | 
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ | 
| 17 | 
> | 
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
| 18 | 
  | 
 | 
| 19 | 
  | 
/* Written by Paul Eggert.  */ | 
| 20 | 
  | 
 | 
| 21 | 
  | 
#include "config.h" | 
| 22 | 
  | 
 | 
| 23 | 
< | 
#if HAVE_UNISTD_H | 
| 23 | 
< | 
# include <unistd.h> | 
| 24 | 
< | 
#endif | 
| 23 | 
> | 
#include "physmem.h" | 
| 24 | 
  | 
 | 
| 25 | 
+ | 
#include <unistd.h> | 
| 26 | 
+ | 
 | 
| 27 | 
  | 
#if HAVE_SYS_PSTAT_H | 
| 28 | 
  | 
# include <sys/pstat.h> | 
| 29 | 
  | 
#endif | 
| 75 | 
  | 
typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); | 
| 76 | 
  | 
#endif | 
| 77 | 
  | 
 | 
| 78 | 
+ | 
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) | 
| 79 | 
+ | 
 | 
| 80 | 
  | 
/* Return the total amount of physical memory.  */ | 
| 81 | 
  | 
double | 
| 82 | 
< | 
physmem_total () | 
| 82 | 
> | 
physmem_total (void) | 
| 83 | 
  | 
{ | 
| 84 | 
  | 
#if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE | 
| 85 | 
  | 
  { /* This works on linux-gnu, solaris2 and cygwin.  */ | 
| 137 | 
  | 
    size_t len = sizeof physmem; | 
| 138 | 
  | 
    static int mib[2] = { CTL_HW, HW_PHYSMEM }; | 
| 139 | 
  | 
 | 
| 140 | 
< | 
    if (sysctl (mib, 2, &physmem, &len, NULL, 0) == 0 | 
| 140 | 
> | 
    if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0 | 
| 141 | 
  | 
        && len == sizeof (physmem)) | 
| 142 | 
  | 
      return (double) physmem; | 
| 143 | 
  | 
  } | 
| 177 | 
  | 
  } | 
| 178 | 
  | 
#endif | 
| 179 | 
  | 
 | 
| 180 | 
< | 
  /* Return 0 if we can't determine the value.  */ | 
| 181 | 
< | 
  return 0; | 
| 180 | 
> | 
  /* Guess 64 MB.  It's probably an older host, so guess small.  */ | 
| 181 | 
> | 
  return 64 * 1024 * 1024; | 
| 182 | 
  | 
} | 
| 183 | 
  | 
 | 
| 184 | 
  | 
/* Return the amount of physical memory available.  */ | 
| 185 | 
  | 
double | 
| 186 | 
< | 
physmem_available () | 
| 186 | 
> | 
physmem_available (void) | 
| 187 | 
  | 
{ | 
| 188 | 
  | 
#if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE | 
| 189 | 
  | 
  { /* This works on linux-gnu, solaris2 and cygwin.  */ | 
| 243 | 
  | 
    size_t len = sizeof usermem; | 
| 244 | 
  | 
    static int mib[2] = { CTL_HW, HW_USERMEM }; | 
| 245 | 
  | 
 | 
| 246 | 
< | 
    if (sysctl (mib, 2, &usermem, &len, NULL, 0) == 0 | 
| 246 | 
> | 
    if (sysctl (mib, ARRAY_SIZE (mib), &usermem, &len, NULL, 0) == 0 | 
| 247 | 
  | 
        && len == sizeof (usermem)) | 
| 248 | 
  | 
      return (double) usermem; | 
| 249 | 
  | 
  } |