00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include "freemem.h"
00024
00025 #include <sys/types.h>
00026 #include <climits>
00027 #include "safeunistd.h"
00028 #ifdef HAVE_SYS_SYSCTL_H
00029 # include <sys/sysctl.h>
00030 #endif
00031 #ifdef HAVE_VM_VM_PARAM_H
00032 # include <vm/vm_param.h>
00033 #endif
00034 #ifdef HAVE_SYS_VMMETER_H
00035 # include <sys/vmmeter.h>
00036 #endif
00037 #ifdef HAVE_SYS_SYSMP_H
00038 # include <sys/sysmp.h>
00039 #endif
00040 #ifdef HAVE_SYS_SYSINFO_H
00041 # include <sys/sysinfo.h>
00042 #endif
00043 #ifdef HAVE_SYS_PSTAT_H
00044 # include <sys/pstat.h>
00045 #endif
00046
00047 #ifdef __WIN32__
00048 # include "safewindows.h"
00049 #endif
00050
00051
00052
00053
00054
00055 long
00056 get_free_physical_memory()
00057 {
00058 #ifndef __WIN32__
00059 long pagesize = 1;
00060 long pages = -1;
00061 #if defined(_SC_PAGESIZE) && defined(_SC_PHYS_PAGES)
00062
00063
00064
00065
00066
00067
00068
00069 pagesize = sysconf(_SC_PAGESIZE);
00070 pages = sysconf(_SC_PHYS_PAGES);
00071 #elif defined HAVE_SYSMP
00072
00073 struct rminfo meminfo;
00074 if (sysmp(MP_SAGET, MPSA_RMINFO, &meminfo, sizeof(meminfo)) == 0) {
00075 pagesize = sysconf(_SC_PAGESIZE);
00076 pages = meminfo.availrmem;
00077 }
00078 #elif defined HAVE_PSTAT_GETDYNAMIC
00079
00080 struct pst_dynamic info;
00081 if (pstat_getdynamic(&info, sizeof(info), 1, 0) == 1) {
00082 pagesize = getpagesize();
00083 pages = info.psd_free;
00084 }
00085 #elif defined CTL_VM && (defined VM_TOTAL || defined VM_METER)
00086
00087 struct vmtotal vm_info;
00088 int mib[2] = {
00089 CTL_VM,
00090 #ifdef VM_TOTAL
00091 VM_TOTAL
00092 #else
00093 VM_METER
00094 #endif
00095 };
00096 size_t len = sizeof(vm_info);
00097 if (sysctl(mib, 2, &vm_info, &len, NULL, 0) == 0) {
00098 pagesize = getpagesize();
00099 pages = vm_info.t_free;
00100 }
00101 #endif
00102 if (pagesize > 0 && pages > 0) {
00103 long mem = LONG_MAX;
00104 if (pages < LONG_MAX / pagesize) {
00105 mem = pages * pagesize;
00106 }
00107 return mem;
00108 }
00109 return -1;
00110 #else
00111 MEMORYSTATUSEX statex;
00112 statex.dwLength = sizeof(statex);
00113 GlobalMemoryStatusEx(&statex);
00114 return statex.ullAvailPhys;
00115 #endif
00116 }
00117
00118
00119
00120
00121
00122 long
00123 get_total_physical_memory()
00124 {
00125 #ifndef __WIN32__
00126 long pagesize = 1;
00127 long pages = -1;
00128 #if defined(_SC_PAGESIZE) && defined(_SC_AVPHYS_PAGES)
00129
00130 pagesize = sysconf(_SC_PAGESIZE);
00131 pages = sysconf(_SC_PHYS_PAGES);
00132 #elif defined HAVE_SYSMP
00133
00134 struct rminfo meminfo;
00135 if (sysmp(MP_SAGET, MPSA_RMINFO, &meminfo, sizeof(meminfo)) == 0) {
00136 pagesize = sysconf(_SC_PAGESIZE);
00137 pages = meminfo.physmem;
00138 }
00139 #elif defined HAVE_PSTAT_GETDYNAMIC
00140
00141 struct pst_dynamic info;
00142 if (pstat_getdynamic(&info, sizeof(info), 1, 0) == 1) {
00143 pagesize = getpagesize();
00144 pages = info.psd_rm;
00145 }
00146 #elif defined CTL_VM && (defined VM_TOTAL || defined VM_METER)
00147
00148 struct vmtotal vm_info;
00149 int mib[2] = {
00150 CTL_VM,
00151 #ifdef VM_TOTAL
00152 VM_TOTAL
00153 #else
00154 VM_METER
00155 #endif
00156 };
00157 size_t len = sizeof(vm_info);
00158 if (sysctl(mib, 2, &vm_info, &len, NULL, 0) == 0) {
00159 pagesize = getpagesize();
00160 pages = vm_info.t_rm;
00161 }
00162 #endif
00163 if (pagesize > 0 && pages > 0) {
00164 long mem = LONG_MAX;
00165 if (pages < LONG_MAX / pagesize) {
00166 mem = pages * pagesize;
00167 }
00168 return mem;
00169 }
00170 return -1;
00171 #else
00172 MEMORYSTATUSEX statex;
00173 statex.dwLength = sizeof(statex);
00174 GlobalMemoryStatusEx(&statex);
00175 return statex.ullTotalPhys;
00176 #endif
00177 }