29#include <sys/sysctl.h>
30#elif (OOLITE_LINUX || OOLITE_WINDOWS)
33#define __block __glibc_block
47#if OOLITE_LITTLE_ENDIAN
48#warning Little-endian.
50#if OOLITE_NATIVE_64_BIT
69 uint8_t endianTag[4] = {0x12, 0x34, 0x56, 0x78};
72 if (*(uint32_t*)endianTag != 0x12345678)
74 OOLog(
@"cpuInfo.endianTest.failed",
@"%@",
@"OOLITE_BIG_ENDIAN is set, but the system is not big-endian -- aborting.");
79#if OOLITE_LITTLE_ENDIAN
80 if (*(uint32_t*)endianTag != 0x78563412)
82 OOLog(
@"cpuInfo.endianTest.failed",
@"%@",
@"OOLITE_LITTLE_ENDIAN is set, but the system is not little-endian -- aborting.");
93 GetSystemInfo(&sysInfo);
95#elif defined _SC_NPROCESSORS_ONLN
98 #warning Do not know how to find number of CPUs on this architecture.
112#if (OOLITE_WINDOWS || OOLITE_LINUX)
114 #define OO_GNU_INLINE __attribute__((gnu_inline))
116 #define OO_GNU_INLINE
121inline OO_GNU_INLINE
void OOCPUID(
int CPUInfo[4],
int InfoType)
123 __asm__ __volatile__ (
130 :
"=a" (CPUInfo [0]),
"=r" (CPUInfo [1]),
"=c" (CPUInfo [2]),
"=d" (CPUInfo [3])
133 :
"=a" (CPUInfo [0]),
"=b" (CPUInfo [1]),
"=c" (CPUInfo [2]),
"=d" (CPUInfo [3])
139NSString* OOCPUDescription(
void)
142 int CPUInfo[4] = {-1};
143 unsigned nExIds, i = 0;
144 char CPUBrandString[0x40];
146 OOCPUID(CPUInfo, 0x80000000);
148 for (i=0x80000000; i<=nExIds; ++i)
153 memcpy(CPUBrandString, CPUInfo,
sizeof(CPUInfo));
154 else if (i == 0x80000003)
155 memcpy(CPUBrandString + 16, CPUInfo,
sizeof(CPUInfo));
156 else if (i == 0x80000004)
157 memcpy(CPUBrandString + 32, CPUInfo,
sizeof(CPUInfo));
159 return [NSString stringWithCString:CPUBrandString];
163OOMemoryStatus OOSystemMemoryStatus(
void)
165 const unsigned int toMegabyte = 1024 * 1024;
167 OOMemoryStatus systemMemoryStatus;
168 memset(&systemMemoryStatus, 0,
sizeof(systemMemoryStatus));
171 MEMORYSTATUSEX memStatus;
172 memStatus.dwLength =
sizeof(memStatus);
173 if(GlobalMemoryStatusEx(&memStatus))
176 systemMemoryStatus.ooPhysicalMemory = memStatus.ullTotalPhys / toMegabyte;
177 systemMemoryStatus.ooAvailableMemory = memStatus.ullAvailPhys / toMegabyte;
182 systemMemoryStatus.ooPhysicalMemory = (
unsigned long long)(si.totalram / toMegabyte);
183 systemMemoryStatus.ooAvailableMemory = (
unsigned long long)(si.freeram / toMegabyte);
186 return systemMemoryStatus;
192NSString* operatingSystemFullVersion(
void)
194 OSVERSIONINFOW osver;
195 char outUBRString[65] =
"";
197 osver.dwOSVersionInfoSize =
sizeof(osver);
198 GetVersionExW (&osver);
202 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
204 DWORD dwUBRSize =
sizeof(DWORD);
206 if (RegQueryValueEx(hKey,
"UBR", NULL, NULL, (BYTE*)&dwUBR, &dwUBRSize) == ERROR_SUCCESS)
208 char strUBR[64] =
"";
209 ltoa(dwUBR, strUBR, 10);
210 strcpy(outUBRString,
".");
211 strcat(outUBRString, strUBR);
215 return [NSString stringWithFormat:@"%lu.%lu.%lu%s %S",
216 osver.dwMajorVersion, osver.dwMinorVersion, osver.dwBuildNumber, outUBRString, (const WCHAR *)osver.szCSDVersion];
223BOOL is64BitSystem(
void)
231 IW64PFP IW64P = (IW64PFP)GetProcAddress(GetModuleHandle(
"kernel32"),
"IsWow64Process");
234 IW64P(GetCurrentProcess(), &is64Bit);
static NSUInteger sNumberOfCPUs
NSUInteger OOCPUCount(void)
#define OOLog(class, format,...)
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque