kernel32: Prefer HW_MEMSIZE sysctl variable over HW_PHYSMEM, if available, since it's 64 bits.

This commit is contained in:
Ken Thomases 2014-02-16 20:43:38 -06:00 committed by Alexandre Julliard
parent 6953189271
commit 95df19efed

View File

@ -1147,6 +1147,7 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
#ifdef linux #ifdef linux
FILE *f; FILE *f;
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__) #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
DWORDLONG total;
#ifdef __APPLE__ #ifdef __APPLE__
unsigned int val; unsigned int val;
#else #else
@ -1154,6 +1155,9 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
#endif #endif
int mib[2]; int mib[2];
size_t size_sys; size_t size_sys;
#ifdef HW_MEMSIZE
uint64_t val64;
#endif
#elif defined(sun) #elif defined(sun)
unsigned long pagesize,maxpages,freepages,swapspace,swapfree; unsigned long pagesize,maxpages,freepages,swapspace,swapfree;
struct anoninfo swapinf; struct anoninfo swapinf;
@ -1219,11 +1223,27 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
fclose( f ); fclose( f );
} }
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__) #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
total = 0;
mib[0] = CTL_HW; mib[0] = CTL_HW;
#ifdef HW_MEMSIZE
mib[1] = HW_MEMSIZE;
size_sys = sizeof(val64);
if (!sysctl(mib, 2, &val64, &size_sys, NULL, 0) && size_sys == sizeof(val64) && val64)
total = val64;
#endif
if (!total)
{
mib[1] = HW_PHYSMEM; mib[1] = HW_PHYSMEM;
size_sys = sizeof(val); size_sys = sizeof(val);
if (!sysctl(mib, 2, &val, &size_sys, NULL, 0) && size_sys == sizeof(val) && val) if (!sysctl(mib, 2, &val, &size_sys, NULL, 0) && size_sys == sizeof(val) && val)
lpmemex->ullTotalPhys = val; total = val;
}
if (total)
lpmemex->ullTotalPhys = total;
mib[1] = HW_USERMEM; mib[1] = HW_USERMEM;
size_sys = sizeof(val); size_sys = sizeof(val);
if (!sysctl(mib, 2, &val, &size_sys, NULL, 0) && size_sys == sizeof(val) && val) if (!sysctl(mib, 2, &val, &size_sys, NULL, 0) && size_sys == sizeof(val) && val)