View Issue Details [ Jump to Notes ] | [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0009050 | CMake | CMake | public | 2009-05-19 07:26 | 2013-03-04 08:38 | ||||
Reporter | David Cole | ||||||||
Assigned To | David Cole | ||||||||
Priority | normal | Severity | minor | Reproducibility | always | ||||
Status | closed | Resolution | fixed | ||||||
Platform | OS | OS Version | |||||||
Product Version | |||||||||
Target Version | Fixed in Version | CMake-2-8 | |||||||
Summary | 0009050: SystemInformation reported incorrectly with dashboards run from crontab entry on Mac OSX | ||||||||
Description | In SystemInformation.cxx, we should use the full path names (a la find_program) for the binaries executed to gather the information. The PATH is different when running from a crontab entry... | ||||||||
Tags | No tags attached. | ||||||||
Attached Files | SystemInformation.cxx.diff [^] (56,291 bytes) 2009-05-19 11:32 [Show Content] [Hide Content]Index: Source/kwsys/testSystemInformation.cxx =================================================================== RCS file: /cvsroot/CMake/CMake/Source/kwsys/testSystemInformation.cxx,v retrieving revision 1.2 diff -u -r1.2 testSystemInformation.cxx --- Source/kwsys/testSystemInformation.cxx 19 Feb 2008 23:50:52 -0000 1.2 +++ Source/kwsys/testSystemInformation.cxx 19 May 2009 15:32:15 -0000 @@ -26,13 +26,22 @@ #define printMethod(inof, m) kwsys_ios::cout << #m << ": " \ << info.m() << "\n" + +#define printMethod2(inof, m, unit) kwsys_ios::cout << #m << ": " \ +<< info.m() << " " << unit << "\n" + int testSystemInformation(int, char*[]) { kwsys::SystemInformation info; - printMethod(info, GetVendorString); info.RunCPUCheck(); info.RunOSCheck(); info.RunMemoryCheck(); + printMethod(info, GetOSName); + printMethod(info, GetHostname); + printMethod(info, GetOSRelease); + printMethod(info, GetOSVersion); + printMethod(info, GetOSPlatform); + printMethod(info, GetVendorString); printMethod(info, GetVendorID); printMethod(info, GetTypeID); @@ -40,24 +49,21 @@ printMethod(info, GetModelID); printMethod(info, GetExtendedProcessorName); printMethod(info, GetProcessorSerialNumber); - printMethod(info, GetProcessorCacheSize); + printMethod2(info, GetProcessorCacheSize, "KB"); printMethod(info, GetLogicalProcessorsPerPhysical); - printMethod(info, GetProcessorClockFrequency); - printMethod(info, GetProcessorAPICID); - printMethod(info, GetOSName); - printMethod(info, GetHostname); - printMethod(info, GetOSRelease); - printMethod(info, GetOSVersion); - printMethod(info, GetOSPlatform); + printMethod2(info, GetProcessorClockFrequency, "MHz"); printMethod(info, Is64Bits); printMethod(info, GetNumberOfLogicalCPU); printMethod(info, GetNumberOfPhysicalCPU); printMethod(info, DoesCPUSupportCPUID); - printMethod(info, GetTotalVirtualMemory); - printMethod(info, GetAvailableVirtualMemory); - printMethod(info, GetTotalPhysicalMemory); - printMethod(info, GetAvailablePhysicalMemory); - + printMethod(info, GetProcessorAPICID); + + + printMethod2(info, GetTotalVirtualMemory, "MB"); + printMethod2(info, GetAvailableVirtualMemory, "MB"); + printMethod2(info, GetTotalPhysicalMemory, "MB"); + printMethod2(info, GetAvailablePhysicalMemory, "MB"); + //int GetProcessorCacheXSize(long int); // bool DoesCPUSupportFeature(long int); return 0; Index: Source/kwsys/SystemInformation.cxx =================================================================== RCS file: /cvsroot/CMake/CMake/Source/kwsys/SystemInformation.cxx,v retrieving revision 1.40 diff -u -r1.40 SystemInformation.cxx --- Source/kwsys/SystemInformation.cxx 6 Apr 2009 18:55:54 -0000 1.40 +++ Source/kwsys/SystemInformation.cxx 19 May 2009 15:32:15 -0000 @@ -9,8 +9,8 @@ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifdef _WIN32 @@ -49,6 +49,14 @@ # include <windows.h> #endif +#ifdef __APPLE__ +#include <sys/sysctl.h> +#include <mach/vm_statistics.h> +#include <mach/host_info.h> +#include <mach/mach.h> +#include <mach/mach_types.h> +#endif + #ifdef __linux # include <sys/procfs.h> # include <sys/types.h> @@ -87,8 +95,8 @@ // Define SystemInformationImplementation class typedef void (*DELAY_FUNC)(unsigned int uiMS); - -class SystemInformationImplementation + +class SystemInformationImplementation { public: @@ -109,7 +117,7 @@ int GetProcessorAPICID(); int GetProcessorCacheXSize(long int); bool DoesCPUSupportFeature(long int); - + const char * GetOSName(); const char * GetHostname(); const char * GetOSRelease(); @@ -127,7 +135,7 @@ unsigned long GetTotalVirtualMemory(); unsigned long GetAvailableVirtualMemory(); unsigned long GetTotalPhysicalMemory(); - unsigned long GetAvailablePhysicalMemory(); + unsigned long GetAvailablePhysicalMemory(); /** Run the different checks */ void RunCPUCheck(); @@ -138,7 +146,7 @@ #define CHIPNAME_STRING_LENGTH (48 + 1) #define SERIALNUMBER_STRING_LENGTH (29 + 1) - typedef struct tagID + typedef struct tagID { int Type; int Family; @@ -151,14 +159,14 @@ char SerialNumber[SERIALNUMBER_STRING_LENGTH]; } ID; - typedef struct tagCPUPowerManagement + typedef struct tagCPUPowerManagement { bool HasVoltageID; bool HasFrequencyID; bool HasTempSenseDiode; } CPUPowerManagement; - typedef struct tagCPUExtendedFeatures + typedef struct tagCPUExtendedFeatures { bool Has3DNow; bool Has3DNowPlus; @@ -169,9 +177,9 @@ unsigned int LogicalProcessorsPerPhysical; int APIC_ID; CPUPowerManagement PowerManagement; - } CPUExtendedFeatures; - - typedef struct CPUtagFeatures + } CPUExtendedFeatures; + + typedef struct CPUtagFeatures { bool HasFPU; bool HasTSC; @@ -192,10 +200,10 @@ int L3CacheSize; CPUExtendedFeatures ExtendedFeatures; } CPUFeatures; - - enum Manufacturer + + enum Manufacturer { - AMD, Intel, NSC, UMC, Cyrix, NexGen, IDT, Rise, Transmeta, Sun, UnknownManufacturer + AMD, Intel, NSC, UMC, Cyrix, NexGen, IDT, Rise, Transmeta, Sun, IBM, Motorola, UnknownManufacturer }; protected: @@ -212,7 +220,7 @@ bool RetrieveCPUPowerManagement(); bool RetrieveClassicalCPUIdentity(); bool RetrieveExtendedCPUIdentity(); - + Manufacturer ChipManufacturer; CPUFeatures Features; ID ChipID; @@ -264,12 +272,12 @@ kwsys_stl::string Hostname; kwsys_stl::string OSRelease; kwsys_stl::string OSVersion; - kwsys_stl::string OSPlatform; + kwsys_stl::string OSPlatform; }; - - - - + + + + SystemInformation::SystemInformation() { @@ -466,24 +474,24 @@ #define HT_CANNOT_DETECT 4 // EDX[28] Bit 28 is set if HT is supported -#define HT_BIT 0x10000000 +#define HT_BIT 0x10000000 // EAX[11:8] Bit 8-11 contains family processor ID. #define FAMILY_ID 0x0F00 -#define PENTIUM4_ID 0x0F00 +#define PENTIUM4_ID 0x0F00 // EAX[23:20] Bit 20-23 contains extended family processor ID -#define EXT_FAMILY_ID 0x0F00000 +#define EXT_FAMILY_ID 0x0F00000 // EBX[23:16] Bit 16-23 in ebx contains the number of logical -#define NUM_LOGICAL_BITS 0x00FF0000 -// processors per physical processor when execute cpuid with +#define NUM_LOGICAL_BITS 0x00FF0000 +// processors per physical processor when execute cpuid with // eax set to 1 -// EBX[31:24] Bits 24-31 (8 bits) return the 8-bit unique -#define INITIAL_APIC_ID_BITS 0xFF000000 +// EBX[31:24] Bits 24-31 (8 bits) return the 8-bit unique +#define INITIAL_APIC_ID_BITS 0xFF000000 // initial APIC ID for the processor this code is running on. // Default value = 0xff if HT is not supported - + SystemInformationImplementation::SystemInformationImplementation() { this->TotalVirtualMemory = 0; @@ -512,7 +520,7 @@ { #ifdef WIN32 // Check to see if this processor supports CPUID. - if (DoesCPUSupportCPUID()) + if (DoesCPUSupportCPUID()) { // Retrieve the CPU details. RetrieveCPUIdentity(); @@ -523,12 +531,12 @@ } // Attempt to retrieve cache information. - if (!RetrieveCPUCacheDetails()) + if (!RetrieveCPUCacheDetails()) { RetrieveClassicalCPUCacheDetails(); } // Retrieve the extended CPU details. - if (!RetrieveExtendedCPUIdentity()) + if (!RetrieveExtendedCPUIdentity()) { RetrieveClassicalCPUIdentity(); } @@ -553,7 +561,7 @@ { this->QueryOSInformation(); } - + void SystemInformationImplementation::RunMemoryCheck() { #if defined(__APPLE__) @@ -607,7 +615,7 @@ const char * SystemInformationImplementation::GetVendorID() { // Return the vendor ID. - switch (this->ChipManufacturer) + switch (this->ChipManufacturer) { case Intel: return "Intel Corporation"; @@ -629,6 +637,10 @@ return "Transmeta"; case Sun: return "Sun Microelectronics"; + case IBM: + return "IBM"; + case Motorola: + return "Motorola"; default: return "Unknown Manufacturer"; } @@ -660,7 +672,7 @@ /** Return the stepping code of the CPU present. */ kwsys_stl::string SystemInformationImplementation::GetSteppingCode() -{ +{ kwsys_ios::ostringstream str; str << this->ChipID.Revision; return str.str(); @@ -671,8 +683,8 @@ { return this->ChipID.ProcessorName; } - -/** Return the serial number of the processor + +/** Return the serial number of the processor * in hexadecimal: xxxx-xxxx-xxxx-xxxx-xxxx-xxxx. */ const char * SystemInformationImplementation::GetProcessorSerialNumber() { @@ -706,7 +718,7 @@ /** Return the chosen cache size. */ int SystemInformationImplementation::GetProcessorCacheXSize(long int dwCacheID) { - switch (dwCacheID) + switch (dwCacheID) { case L1CACHE_FEATURE: return this->Features.L1CacheSize; @@ -805,7 +817,7 @@ QueryPerformanceCounter (&StartCounter); do { - // Get the ending position of the counter. + // Get the ending position of the counter. QueryPerformanceCounter (&EndCounter); } while (EndCounter.QuadPart - StartCounter.QuadPart < x); #endif @@ -827,7 +839,7 @@ push ecx push edx #endif - ; <<CPUID>> + ; <<CPUID>> mov eax, 0 CPUID_INSTRUCTION @@ -839,7 +851,7 @@ #endif } } - __except(1) + __except(1) { // Stop the class from trying to use CPUID again! return false; @@ -872,7 +884,7 @@ push ecx push edx #endif - ; <<CPUID>> + ; <<CPUID>> ; eax = 1 --> eax: CPU ID - bits 31..16 - unused, bits 15..12 - type, bits 11..8 - family, bits 7..4 - model, bits 3..0 - mask revision ; ebx: 31..24 - default APIC ID, 23..16 - logical processsor ID, 15..8 - CFLUSH chunk size , 7..0 - brand ID ; edx: CPU feature flags @@ -889,7 +901,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -910,39 +922,39 @@ // Retrieve extended SSE capabilities if SSE is available. if (this->Features.HasSSE) { - + // Attempt to __try some SSE FP instructions. - __try + __try { // Perform: orps xmm0, xmm0 - _asm + _asm { _emit 0x0f _emit 0x56 - _emit 0xc0 + _emit 0xc0 } // SSE FP capable processor. this->Features.HasSSEFP = true; - } - __except(1) + } + __except(1) { // bad instruction - processor or OS cannot handle SSE FP. this->Features.HasSSEFP = false; } - } - else + } + else { // Set the advanced SSE capabilities to not available. this->Features.HasSSEFP = false; } // Retrieve Intel specific extended features. - if (this->ChipManufacturer == Intel) + if (this->ChipManufacturer == Intel) { this->Features.ExtendedFeatures.SupportsHyperthreading = ((localCPUFeatures & 0x10000000) != 0); // Intel specific: Hyperthreading --> Bit 28 this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical = (this->Features.ExtendedFeatures.SupportsHyperthreading) ? ((localCPUAdvanced & 0x00FF0000) >> 16) : 1; - + if ((this->Features.ExtendedFeatures.SupportsHyperthreading) && (this->Features.HasAPIC)) { // Retrieve APIC information if there is one present. @@ -968,7 +980,9 @@ else if (strcmp (this->ChipID.Vendor, "GenuineTMx86") == 0) this->ChipManufacturer = Transmeta; // Transmeta else if (strcmp (this->ChipID.Vendor, "TransmetaCPU") == 0) this->ChipManufacturer = Transmeta; // Transmeta else if (strcmp (this->ChipID.Vendor, "Geode By NSC") == 0) this->ChipManufacturer = NSC; // National Semiconductor - else if (strcmp (this->ChipID.Vendor, "Sun") == 0) this->ChipManufacturer = Sun; // Sun Microelectronics + else if (strcmp (this->ChipID.Vendor, "Sun") == 0) this->ChipManufacturer = Sun; // Sun Microelectronics + else if (strcmp (this->ChipID.Vendor, "IBM") == 0) this->ChipManufacturer = IBM; // IBM Microelectronics + else if (strcmp (this->ChipID.Vendor, "Motorola") == 0) this->ChipManufacturer = Motorola; // Motorola Microelectronics else this->ChipManufacturer = UnknownManufacturer; // Unknown manufacturer } @@ -980,9 +994,9 @@ int localCPUSignature; // Use assembly to detect CPUID information... - __try + __try { - _asm + _asm { #ifdef CPUID_AWARE_COMPILER ; we must push/pop the registers <<CPUID>> writes to, as the @@ -1004,7 +1018,7 @@ mov localCPUVendor[1 * TYPE int], edx mov localCPUVendor[2 * TYPE int], ecx - ; <<CPUID>> + ; <<CPUID>> ; eax = 1 --> eax: CPU ID - bits 31..16 - unused, bits 15..12 - type, bits 11..8 - family, bits 7..4 - model, bits 3..0 - mask revision ; ebx: 31..24 - default APIC ID, 23..16 - logical processsor ID, 15..8 - CFLUSH chunk size , 7..0 - brand ID ; edx: CPU feature flags @@ -1020,7 +1034,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -1053,12 +1067,12 @@ int L2Cache[4] = { 0, 0, 0, 0 }; // Check to see if what we are about to do is supported... - if (RetrieveCPUExtendedLevelSupport (0x80000005)) + if (RetrieveCPUExtendedLevelSupport (0x80000005)) { // Use assembly to retrieve the L1 cache information ... - __try + __try { - _asm + _asm { #ifdef CPUID_AWARE_COMPILER ; we must push/pop the registers <<CPUID>> writes to, as the @@ -1089,27 +1103,27 @@ #endif } } - __except(1) + __except(1) { return false; } // Save the L1 data cache size (in KB) from ecx: bits 31..24 as well as data cache size from edx: bits 31..24. this->Features.L1CacheSize = ((L1Cache[2] & 0xFF000000) >> 24); this->Features.L1CacheSize += ((L1Cache[3] & 0xFF000000) >> 24); - } - else + } + else { // Store -1 to indicate the cache could not be queried. this->Features.L1CacheSize = -1; } // Check to see if what we are about to do is supported... - if (RetrieveCPUExtendedLevelSupport (0x80000006)) + if (RetrieveCPUExtendedLevelSupport (0x80000006)) { // Use assembly to retrieve the L2 cache information ... - __try + __try { - _asm + _asm { #ifdef CPUID_AWARE_COMPILER ; we must push/pop the registers <<CPUID>> writes to, as the @@ -1140,19 +1154,19 @@ #endif } } - __except(1) + __except(1) { return false; } // Save the L2 unified cache size (in KB) from ecx: bits 31..16. this->Features.L2CacheSize = ((L2Cache[2] & 0xFFFF0000) >> 16); - } + } else { // Store -1 to indicate the cache could not be queried. this->Features.L2CacheSize = -1; } - + // Define L3 as being not present as we cannot test for it. this->Features.L3CacheSize = -1; @@ -1213,10 +1227,10 @@ int bob = ((TLBCacheData[0] & 0x00FF0000) >> 16); (void)bob; // Process the returned TLB and cache information. - for (int nCounter = 0; nCounter < TLBCACHE_INFO_UNITS; nCounter ++) + for (int nCounter = 0; nCounter < TLBCACHE_INFO_UNITS; nCounter ++) { // First of all - decide which unit we are dealing with. - switch (nCounter) + switch (nCounter) { // eax: bits 8..15 : bits 16..23 : bits 24..31 case 0: TLBCacheUnit = ((TLBCacheData[0] & 0x0000FF00) >> 8); break; @@ -1246,7 +1260,7 @@ } // Now process the resulting unit to see what it means.... - switch (TLBCacheUnit) + switch (TLBCacheUnit) { case 0x00: break; case 0x01: STORE_TLBCACHE_INFO (TLBCode, 4); break; @@ -1302,7 +1316,7 @@ case 0x90: STORE_TLBCACHE_INFO (TLBCode, 262144); break; // <-- FIXME: IA-64 Only case 0x96: STORE_TLBCACHE_INFO (TLBCode, 262144); break; // <-- FIXME: IA-64 Only case 0x9b: STORE_TLBCACHE_INFO (TLBCode, 262144); break; // <-- FIXME: IA-64 Only - + // Default case - an error has occured. default: return false; } @@ -1313,47 +1327,47 @@ } while ((TLBCacheData[0] & 0x000000FF) > TLBPassCounter); // Ok - we now have the maximum TLB, L1, L2, and L3 sizes... - if ((L1Code == -1) && (L1Data == -1) && (L1Trace == -1)) + if ((L1Code == -1) && (L1Data == -1) && (L1Trace == -1)) { this->Features.L1CacheSize = -1; } - else if ((L1Code == -1) && (L1Data == -1) && (L1Trace != -1)) + else if ((L1Code == -1) && (L1Data == -1) && (L1Trace != -1)) { this->Features.L1CacheSize = L1Trace; } - else if ((L1Code != -1) && (L1Data == -1)) + else if ((L1Code != -1) && (L1Data == -1)) { this->Features.L1CacheSize = L1Code; } - else if ((L1Code == -1) && (L1Data != -1)) + else if ((L1Code == -1) && (L1Data != -1)) { this->Features.L1CacheSize = L1Data; } - else if ((L1Code != -1) && (L1Data != -1)) + else if ((L1Code != -1) && (L1Data != -1)) { this->Features.L1CacheSize = L1Code + L1Data; } - else + else { this->Features.L1CacheSize = -1; } // Ok - we now have the maximum TLB, L1, L2, and L3 sizes... - if (L2Unified == -1) + if (L2Unified == -1) { this->Features.L2CacheSize = -1; } - else + else { this->Features.L2CacheSize = L2Unified; } // Ok - we now have the maximum TLB, L1, L2, and L3 sizes... - if (L3Unified == -1) + if (L3Unified == -1) { this->Features.L3CacheSize = -1; } - else + else { this->Features.L3CacheSize = L3Unified; } @@ -1367,7 +1381,7 @@ { #if _WIN32 // First of all we check to see if the RDTSC (0x0F, 0x31) instruction is supported. - if (!this->Features.HasTSC) + if (!this->Features.HasTSC) { return false; } @@ -1377,7 +1391,7 @@ __int64 i64Total = 0; __int64 i64Overhead = 0; - for (unsigned int nCounter = 0; nCounter < uiRepetitions; nCounter ++) + for (unsigned int nCounter = 0; nCounter < uiRepetitions; nCounter ++) { i64Total += GetCyclesDifference (SystemInformationImplementation::Delay, uiMSecPerRepetition); @@ -1411,19 +1425,19 @@ // Attempt to get a starting tick count. QueryPerformanceCounter (&liStart); - __try + __try { - _asm + _asm { mov eax, 0x80000000 mov ebx, CLASSICAL_CPU_FREQ_LOOP - Timer_Loop: + Timer_Loop: bsf ecx,eax dec ebx jnz Timer_Loop - } + } } - __except(1) + __except(1) { return false; } @@ -1436,22 +1450,22 @@ dDifference = (((double) liEnd.QuadPart - (double) liStart.QuadPart) / (double) liCountsPerSecond.QuadPart); // Calculate the clock speed. - if (this->ChipID.Family == 3) + if (this->ChipID.Family == 3) { // 80386 processors.... Loop time is 115 cycles! dFrequency = (((CLASSICAL_CPU_FREQ_LOOP * 115) / dDifference) / 1048576); - } - else if (this->ChipID.Family == 4) + } + else if (this->ChipID.Family == 4) { // 80486 processors.... Loop time is 47 cycles! dFrequency = (((CLASSICAL_CPU_FREQ_LOOP * 47) / dDifference) / 1048576); - } - else if (this->ChipID.Family == 5) + } + else if (this->ChipID.Family == 5) { // Pentium processors.... Loop time is 43 cycles! dFrequency = (((CLASSICAL_CPU_FREQ_LOOP * 43) / dDifference) / 1048576); } - + // Save the clock speed. this->Features.CPUSpeed = (int) dFrequency; #else @@ -1464,7 +1478,7 @@ { int MaxCPUExtendedLevel = 0; - // The extended CPUID is supported by various vendors starting with the following CPU models: + // The extended CPUID is supported by various vendors starting with the following CPU models: // // Manufacturer & Chip Name | Family Model Revision // @@ -1477,34 +1491,34 @@ // // We check to see if a supported processor is present... - if (this->ChipManufacturer == AMD) + if (this->ChipManufacturer == AMD) { if (this->ChipID.Family < 5) return false; if ((this->ChipID.Family == 5) && (this->ChipID.Model < 6)) return false; - } - else if (this->ChipManufacturer == Cyrix) + } + else if (this->ChipManufacturer == Cyrix) { if (this->ChipID.Family < 5) return false; if ((this->ChipID.Family == 5) && (this->ChipID.Model < 4)) return false; if ((this->ChipID.Family == 6) && (this->ChipID.Model < 5)) return false; - } - else if (this->ChipManufacturer == IDT) + } + else if (this->ChipManufacturer == IDT) { if (this->ChipID.Family < 5) return false; if ((this->ChipID.Family == 5) && (this->ChipID.Model < 8)) return false; - } - else if (this->ChipManufacturer == Transmeta) + } + else if (this->ChipManufacturer == Transmeta) { if (this->ChipID.Family < 5) return false; - } - else if (this->ChipManufacturer == Intel) + } + else if (this->ChipManufacturer == Intel) { if (this->ChipID.Family < 0xf) { return false; } } - + #if USE_ASM_INSTRUCTIONS // Use assembly to detect CPUID information... @@ -1519,7 +1533,7 @@ push ecx push edx #endif - ; <<CPUID>> + ; <<CPUID>> ; eax = 0x80000000 --> eax: maximum supported extended level mov eax,0x80000000 CPUID_INSTRUCTION @@ -1533,7 +1547,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -1557,7 +1571,7 @@ { // Check that we are not using an Intel processor as it does not support this. - if (this->ChipManufacturer == Intel) + if (this->ChipManufacturer == Intel) { return false; } @@ -1571,9 +1585,9 @@ int localCPUExtendedFeatures = 0; // Use assembly to detect CPUID information... - __try + __try { - _asm + _asm { #ifdef CPUID_AWARE_COMPILER ; we must push/pop the registers <<CPUID>> writes to, as the @@ -1584,7 +1598,7 @@ push ecx push edx #endif - ; <<CPUID>> + ; <<CPUID>> ; eax = 0x80000001 --> eax: CPU ID - bits 31..16 - unused, bits 15..12 - type, bits 11..8 - family, bits 7..4 - model, bits 3..0 - mask revision ; ebx: 31..24 - default APIC ID, 23..16 - logical processsor ID, 15..8 - CFLUSH chunk size , 7..0 - brand ID ; edx: CPU feature flags @@ -1600,7 +1614,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -1610,15 +1624,15 @@ this->Features.ExtendedFeatures.Has3DNowPlus = ((localCPUExtendedFeatures & 0x40000000) != 0); // 3DNow+ Present -- > Bit 30. this->Features.ExtendedFeatures.HasSSEMMX = ((localCPUExtendedFeatures & 0x00400000) != 0); // SSE MMX Present --> Bit 22. this->Features.ExtendedFeatures.SupportsMP = ((localCPUExtendedFeatures & 0x00080000) != 0); // MP Capable -- > Bit 19. - + // Retrieve AMD specific extended features. - if (this->ChipManufacturer == AMD) + if (this->ChipManufacturer == AMD) { this->Features.ExtendedFeatures.HasMMXPlus = ((localCPUExtendedFeatures & 0x00400000) != 0); // AMD specific: MMX-SSE --> Bit 22 } // Retrieve Cyrix specific extended features. - if (this->ChipManufacturer == Cyrix) + if (this->ChipManufacturer == Cyrix) { this->Features.ExtendedFeatures.HasMMXPlus = ((localCPUExtendedFeatures & 0x01000000) != 0); // Cyrix specific: Extended MMX --> Bit 24 } @@ -1670,7 +1684,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -1696,7 +1710,7 @@ /** */ bool SystemInformationImplementation::RetrieveCPUPowerManagement() -{ +{ // Check to see if what we are about to do is supported... if (!RetrieveCPUExtendedLevelSupport(static_cast<int>(0x80000007))) { @@ -1722,12 +1736,12 @@ push ecx push edx #endif - ; <<CPUID>> + ; <<CPUID>> ; eax = 0x80000007 --> edx: get processor power management mov eax,0x80000007 CPUID_INSTRUCTION mov localCPUPowerManagement, edx - + #ifdef CPUID_AWARE_COMPILER pop edx pop ecx @@ -1736,7 +1750,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -1761,7 +1775,7 @@ return false; if (!RetrieveCPUExtendedLevelSupport(static_cast<int>(0x80000004))) return false; - + #if USE_ASM_INSTRUCTIONS int ProcessorNameStartPos = 0; int CPUExtendedIdentity[12]; @@ -1778,7 +1792,7 @@ push ecx push edx #endif - ; <<CPUID>> + ; <<CPUID>> ; eax = 0x80000002 --> eax, ebx, ecx, edx: get processor name string (part 1) mov eax,0x80000002 CPUID_INSTRUCTION @@ -1787,7 +1801,7 @@ mov CPUExtendedIdentity[2 * TYPE int], ecx mov CPUExtendedIdentity[3 * TYPE int], edx - ; <<CPUID>> + ; <<CPUID>> ; eax = 0x80000003 --> eax, ebx, ecx, edx: get processor name string (part 2) mov eax,0x80000003 CPUID_INSTRUCTION @@ -1796,7 +1810,7 @@ mov CPUExtendedIdentity[6 * TYPE int], ecx mov CPUExtendedIdentity[7 * TYPE int], edx - ; <<CPUID>> + ; <<CPUID>> ; eax = 0x80000004 --> eax, ebx, ecx, edx: get processor name string (part 3) mov eax,0x80000004 CPUID_INSTRUCTION @@ -1813,7 +1827,7 @@ #endif } } - __except(1) + __except(1) { return false; } @@ -1834,12 +1848,12 @@ this->ChipID.ProcessorName[48] = '\0'; // Because some manufacturers have leading white space - we have to post-process the name. - if (this->ChipManufacturer == Intel) + if (this->ChipManufacturer == Intel) { - for (int nCounter = 0; nCounter < CHIPNAME_STRING_LENGTH; nCounter ++) + for (int nCounter = 0; nCounter < CHIPNAME_STRING_LENGTH; nCounter ++) { // There will either be NULL (\0) or spaces ( ) as the leading characters. - if ((this->ChipID.ProcessorName[nCounter] != '\0') && (this->ChipID.ProcessorName[nCounter] != ' ')) + if ((this->ChipID.ProcessorName[nCounter] != '\0') && (this->ChipID.ProcessorName[nCounter] != ' ')) { // We have found the starting position of the name. ProcessorNameStartPos = nCounter; @@ -1849,7 +1863,7 @@ } // Check to see if there is any white space at the start. - if (ProcessorNameStartPos == 0) + if (ProcessorNameStartPos == 0) { return true; } @@ -1866,13 +1880,13 @@ bool SystemInformationImplementation::RetrieveClassicalCPUIdentity() { // Start by decided which manufacturer we are using.... - switch (this->ChipManufacturer) + switch (this->ChipManufacturer) { case Intel: // Check the family / model / revision to determine the CPU ID. switch (this->ChipID.Family) { case 3: - sprintf (this->ChipID.ProcessorName, "Newer i80386 family"); + sprintf (this->ChipID.ProcessorName, "Newer i80386 family"); break; case 4: switch (this->ChipID.Model) { @@ -1889,7 +1903,7 @@ } break; case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"P5 A-Step"); break; case 1: sprintf (this->ChipID.ProcessorName,"P5"); break; @@ -1902,7 +1916,7 @@ } break; case 6: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"P6 A-Step"); break; case 1: sprintf (this->ChipID.ProcessorName,"P6"); break; @@ -1913,6 +1927,7 @@ case 8: sprintf (this->ChipID.ProcessorName,"Pentium III (0.18 micron) With 256 KB On-Die L2 Cache "); break; case 0xa: sprintf (this->ChipID.ProcessorName,"Pentium III (0.18 micron) With 1 Or 2 MB On-Die L2 Cache "); break; case 0xb: sprintf (this->ChipID.ProcessorName,"Pentium III (0.13 micron) With 256 Or 512 KB On-Die L2 Cache "); break; + case 23: sprintf (this->ChipID.ProcessorName, "Intel(R) Core(TM)2 Duo CPU T9500 @ 2.60GHz"); break; default: sprintf (this->ChipID.ProcessorName,"Unknown P6 family"); return false; } break; @@ -1921,10 +1936,10 @@ break; case 0xf: // Check the extended family bits... - switch (this->ChipID.ExtendedFamily) + switch (this->ChipID.ExtendedFamily) { case 0: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"Pentium IV (0.18 micron)"); break; case 1: sprintf (this->ChipID.ProcessorName,"Pentium IV (0.18 micron)"); break; @@ -1947,10 +1962,10 @@ case AMD: // Check the family / model / revision to determine the CPU ID. - switch (this->ChipID.Family) + switch (this->ChipID.Family) { case 4: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 3: sprintf (this->ChipID.ProcessorName,"80486DX2"); break; case 7: sprintf (this->ChipID.ProcessorName,"80486DX2 WriteBack"); break; @@ -1962,7 +1977,7 @@ } break; case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"SSA5 (PR75, PR90, PR100)"); break; case 1: sprintf (this->ChipID.ProcessorName,"5k86 (PR120, PR133)"); break; @@ -1977,7 +1992,7 @@ } break; case 6: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 1: sprintf (this->ChipID.ProcessorName,"Athlon- (0.25 micron)"); break; case 2: sprintf (this->ChipID.ProcessorName,"Athlon- (0.18 micron)"); break; @@ -1985,9 +2000,9 @@ case 4: sprintf (this->ChipID.ProcessorName,"Athlon- (Thunderbird core)"); break; case 6: sprintf (this->ChipID.ProcessorName,"Athlon- (Palomino core)"); break; case 7: sprintf (this->ChipID.ProcessorName,"Duron- (Morgan core)"); break; - case 8: + case 8: if (this->Features.ExtendedFeatures.SupportsMP) - sprintf (this->ChipID.ProcessorName,"Athlon - MP (Thoroughbred core)"); + sprintf (this->ChipID.ProcessorName,"Athlon - MP (Thoroughbred core)"); else sprintf (this->ChipID.ProcessorName,"Athlon - XP (Thoroughbred core)"); break; default: sprintf (this->ChipID.ProcessorName,"Unknown K7 family"); return false; @@ -2000,10 +2015,10 @@ break; case Transmeta: - switch (this->ChipID.Family) - { + switch (this->ChipID.Family) + { case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 4: sprintf (this->ChipID.ProcessorName,"Crusoe TM3x00 and TM5x00"); break; default: sprintf (this->ChipID.ProcessorName,"Unknown Crusoe family"); return false; @@ -2016,10 +2031,10 @@ break; case Rise: - switch (this->ChipID.Family) - { + switch (this->ChipID.Family) + { case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"mP6 (0.25 micron)"); break; case 2: sprintf (this->ChipID.ProcessorName,"mP6 (0.18 micron)"); break; @@ -2033,10 +2048,10 @@ break; case UMC: - switch (this->ChipID.Family) - { + switch (this->ChipID.Family) + { case 4: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 1: sprintf (this->ChipID.ProcessorName,"U5D"); break; case 2: sprintf (this->ChipID.ProcessorName,"U5S"); break; @@ -2050,10 +2065,10 @@ break; case IDT: - switch (this->ChipID.Family) - { + switch (this->ChipID.Family) + { case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 4: sprintf (this->ChipID.ProcessorName,"C6"); break; case 8: sprintf (this->ChipID.ProcessorName,"C2"); break; @@ -2062,7 +2077,7 @@ } break; case 6: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 6: sprintf (this->ChipID.ProcessorName,"VIA Cyrix III - Samuel"); break; default: sprintf (this->ChipID.ProcessorName,"Unknown IDT\\Centaur family"); return false; @@ -2075,10 +2090,10 @@ break; case Cyrix: - switch (this->ChipID.Family) - { + switch (this->ChipID.Family) + { case 4: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 4: sprintf (this->ChipID.ProcessorName,"MediaGX GX, GXm"); break; case 9: sprintf (this->ChipID.ProcessorName,"5x86"); break; @@ -2086,7 +2101,7 @@ } break; case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 2: sprintf (this->ChipID.ProcessorName,"Cx6x86"); break; case 4: sprintf (this->ChipID.ProcessorName,"MediaGX GXm"); break; @@ -2094,7 +2109,7 @@ } break; case 6: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"6x86MX"); break; case 5: sprintf (this->ChipID.ProcessorName,"Cyrix M2 Core"); break; @@ -2111,10 +2126,10 @@ break; case NexGen: - switch (this->ChipID.Family) - { + switch (this->ChipID.Family) + { case 5: - switch (this->ChipID.Model) + switch (this->ChipID.Model) { case 0: sprintf (this->ChipID.ProcessorName,"Nx586 or Nx586FPU"); break; default: sprintf (this->ChipID.ProcessorName,"Unknown NexGen family"); return false; @@ -2163,12 +2178,12 @@ kwsys_stl::string buffer; FILE *fd = fopen("/proc/cpuinfo", "r" ); - if ( !fd ) + if ( !fd ) { kwsys_ios::cout << "Problem opening /proc/cpuinfo" << kwsys_ios::endl; return 0; } - + size_t fileSize = 0; while(!feof(fd)) { @@ -2212,13 +2227,13 @@ #else // __CYGWIN__ // does not have "physical id" entries, neither "cpu cores" - // this has to be fixed for hyper-threading. + // this has to be fixed for hyper-threading. kwsys_stl::string cpucount = this->ExtractValueFromCpuInfoFile(buffer,"cpu count"); this->NumberOfPhysicalCPU= this->NumberOfLogicalCPU = atoi(cpucount.c_str()); #endif - // gotta have one, and if this is 0 then we get a / by 0n + // gotta have one, and if this is 0 then we get a / by 0n // beter to have a bad answer than a crash if(this->NumberOfPhysicalCPU <= 0) { @@ -2226,7 +2241,7 @@ } // LogicalProcessorsPerPhysical>1 => hyperthreading. this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical= - this->NumberOfLogicalCPU/this->NumberOfPhysicalCPU; + this->NumberOfLogicalCPU/this->NumberOfPhysicalCPU; // CPU speed (checking only the first proc kwsys_stl::string CPUSpeed = this->ExtractValueFromCpuInfoFile(buffer,"cpu MHz"); @@ -2234,11 +2249,11 @@ // Chip family this->ChipID.Family = atoi(this->ExtractValueFromCpuInfoFile(buffer,"cpu family").c_str()); - + // Chip Vendor strcpy(this->ChipID.Vendor,this->ExtractValueFromCpuInfoFile(buffer,"vendor_id").c_str()); this->FindManufacturer(); - + // Chip Model this->ChipID.Model = atoi(this->ExtractValueFromCpuInfoFile(buffer,"model").c_str()); this->RetrieveClassicalCPUIdentity(); @@ -2287,12 +2302,12 @@ unsigned long tp=0; unsigned long av=0; unsigned long ap=0; - + char buffer[1024]; // for reading lines - + int linuxMajor = 0; int linuxMinor = 0; - + // Find the Linux kernel version first struct utsname unameInfo; int errorFlag = uname(&unameInfo); @@ -2301,32 +2316,32 @@ kwsys_ios::cout << "Problem calling uname(): " << strerror(errno) << kwsys_ios::endl; return 0; } - + if( unameInfo.release!=0 && strlen(unameInfo.release)>=3 ) { // release looks like "2.6.3-15mdk-i686-up-4GB" char majorChar=unameInfo.release[0]; char minorChar=unameInfo.release[2]; - + if( isdigit(majorChar) ) { linuxMajor=majorChar-'0'; } - + if( isdigit(minorChar) ) { linuxMinor=minorChar-'0'; } } - + FILE *fd = fopen("/proc/meminfo", "r" ); - if ( !fd ) + if ( !fd ) { kwsys_ios::cout << "Problem opening /proc/meminfo" << kwsys_ios::endl; return 0; } - - if( linuxMajor>=3 || ( (linuxMajor>=2) && (linuxMinor>=6) ) ) + + if( linuxMajor>=3 || ( (linuxMajor>=2) && (linuxMinor>=6) ) ) { // new /proc/meminfo format since kernel 2.6.x // Rigorously, this test should check from the developping version 2.5.x @@ -2406,7 +2421,7 @@ unsigned long ap=0; struct pst_static pst; struct pst_dynamic pdy; - + unsigned long ps = 0; if (pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0) != -1) { @@ -2433,26 +2448,26 @@ } /** */ -unsigned long SystemInformationImplementation::GetTotalVirtualMemory() -{ - return this->TotalVirtualMemory; +unsigned long SystemInformationImplementation::GetTotalVirtualMemory() +{ + return this->TotalVirtualMemory; } /** */ -unsigned long SystemInformationImplementation::GetAvailableVirtualMemory() -{ - return this->AvailableVirtualMemory; +unsigned long SystemInformationImplementation::GetAvailableVirtualMemory() +{ + return this->AvailableVirtualMemory; } -unsigned long SystemInformationImplementation::GetTotalPhysicalMemory() -{ - return this->TotalPhysicalMemory; +unsigned long SystemInformationImplementation::GetTotalPhysicalMemory() +{ + return this->TotalPhysicalMemory; } /** */ -unsigned long SystemInformationImplementation::GetAvailablePhysicalMemory() -{ - return this->AvailablePhysicalMemory; +unsigned long SystemInformationImplementation::GetAvailablePhysicalMemory() +{ + return this->AvailablePhysicalMemory; } /** Get Cycle differences */ @@ -2488,7 +2503,7 @@ mov eax1, esi ; eax2 = esi } } - __except(1) + __except(1) { return -1; } @@ -2510,7 +2525,7 @@ __int64 x; // Get the frequency of the high performance counter. - if(!QueryPerformanceFrequency (&Frequency)) + if(!QueryPerformanceFrequency (&Frequency)) { return; } @@ -2518,9 +2533,9 @@ // Get the starting position of the counter. QueryPerformanceCounter (&StartCounter); - + do { - // Get the ending position of the counter. + // Get the ending position of the counter. QueryPerformanceCounter (&EndCounter); } while (EndCounter.QuadPart - StartCounter.QuadPart == x); #endif @@ -2532,7 +2547,7 @@ { unsigned int Regebx = 0; #if USE_ASM_INSTRUCTIONS - if (!this->IsHyperThreadingSupported()) + if (!this->IsHyperThreadingSupported()) { return static_cast<unsigned char>(1); // HT not supported } @@ -2543,6 +2558,20 @@ mov Regebx, ebx } #endif + +#ifdef __APPLE__ + size_t len = 4; + int cores_per_package = 0; + int err = sysctlbyname("machdep.cpu.cores_per_package", &cores_per_package, &len, NULL, 0); + if (err != 0) + { + return 1; // That name was not found, default to 1 + } + else + { + return static_cast<unsigned char>(cores_per_package); + } +#endif return static_cast<unsigned char> ((Regebx & NUM_LOGICAL_BITS) >> 16); } @@ -2562,7 +2591,7 @@ mov VendorId, ebx mov VendorId + 4, edx mov VendorId + 8, ecx - + mov eax, 1 // call cpuid with eax = 1 cpuid mov Regeax, eax // eax contains family processor type @@ -2597,7 +2626,7 @@ { unsigned int Regebx = 0; #if USE_ASM_INSTRUCTIONS - if (!this->IsHyperThreadingSupported()) + if (!this->IsHyperThreadingSupported()) { return static_cast<unsigned char>(-1); // HT not supported } // Logical processor = 1 @@ -2625,7 +2654,7 @@ // Number of physical processors in a non-Intel system // or in a 32-bit Intel system with Hyper-Threading technology disabled - this->NumberOfPhysicalCPU = (unsigned char) info.dwNumberOfProcessors; + this->NumberOfPhysicalCPU = (unsigned char) info.dwNumberOfProcessors; if (this->IsHyperThreadingSupported()) { @@ -2641,7 +2670,7 @@ DWORD_PTR dwSystemAffinity; DWORD dwAffinityMask; - // Calculate the appropriate shifts and mask based on the + // Calculate the appropriate shifts and mask based on the // number of logical processors. unsigned int i = 1; unsigned char PHY_ID_MASK = 0xFF; @@ -2653,7 +2682,7 @@ PHY_ID_MASK <<= 1; // PHY_ID_SHIFT++; } - + hCurrentProcessHandle = GetCurrentProcess(); GetProcessAffinityMask(hCurrentProcessHandle, &dwProcessAffinity, &dwSystemAffinity); @@ -2681,8 +2710,8 @@ APIC_ID = GetAPICId(); LOG_ID = APIC_ID & ~PHY_ID_MASK; - - if (LOG_ID != 0) + + if (LOG_ID != 0) { HT_Enabled = 1; } @@ -2692,7 +2721,7 @@ } // Reset the processor affinity SetProcessAffinityMask(hCurrentProcessHandle, dwProcessAffinity); - + if (this->NumberOfLogicalCPU == 1) // Normal P4 : HT is disabled in hardware { StatusFlag = HT_DISABLED; @@ -2705,7 +2734,7 @@ this->NumberOfPhysicalCPU /= (this->NumberOfLogicalCPU); StatusFlag = HT_ENABLED; } - else + else { StatusFlag = HT_SUPPORTED_NOT_ENABLED; } @@ -2739,46 +2768,99 @@ /** For Mac we Parse the sysctl -a output */ bool SystemInformationImplementation::ParseSysCtl() { - // Extract the arguments from the command line - kwsys_stl::vector<const char*> args; - args.push_back("sysctl"); - args.push_back("-a"); - args.push_back(0); + int err = 0; + uint64_t value = 0; + size_t len = sizeof(value); + sysctlbyname("hw.memsize", &value, &len, NULL, 0); + this->TotalPhysicalMemory = value/1000000; +// std::cout << "hw.memsize: " << this->TotalPhysicalMemory << std::endl; + - this->SysCtlBuffer = this->RunProcess(args); - // Parse values for Mac - this->TotalPhysicalMemory = static_cast<unsigned long>( - atoi(this->ExtractValueFromSysCtl("hw.memsize:").c_str())/(1024*1024)); - this->TotalVirtualMemory = 0; this->AvailablePhysicalMemory = 0; - this->AvailableVirtualMemory = 0; + vm_statistics_data_t vmstat; + mach_msg_type_number_t count = HOST_VM_INFO_COUNT; + if ( host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstat, &count) == KERN_SUCCESS ) + { + + err = sysctlbyname("hw.pagesize", &value, &len, NULL, 0); + int64_t available_memory = vmstat.free_count * value; + this->AvailablePhysicalMemory = available_memory / 1000000; + } - this->NumberOfPhysicalCPU = static_cast<unsigned int>(atoi(this->ExtractValueFromSysCtl("hw.physicalcpu:").c_str())); - this->NumberOfLogicalCPU = static_cast<unsigned int>(atoi(this->ExtractValueFromSysCtl("hw.logicalcpu:").c_str())); - - if(this->NumberOfPhysicalCPU!=0) - { - this->NumberOfLogicalCPU /= this->NumberOfPhysicalCPU; - } + // Virtual memory. + int mib[2] = { CTL_VM, VM_SWAPUSAGE }; + size_t miblen = sizeof(mib) / sizeof(mib[0]); + struct xsw_usage swap; + len = sizeof(struct xsw_usage); + err = sysctl(mib, miblen, &swap, &len, NULL, 0); + if (err == 0) + { + this->AvailableVirtualMemory = swap.xsu_avail/1000000; + this->TotalVirtualMemory = swap.xsu_total/1000000; + } - this->CPUSpeedInMHz = static_cast<float>(atoi(this->ExtractValueFromSysCtl("hw.cpufrequency:").c_str())); - this->CPUSpeedInMHz /= 1000000; +// CPU Info + len = sizeof(this->NumberOfPhysicalCPU); + sysctlbyname("hw.physicalcpu", &this->NumberOfPhysicalCPU, &len, NULL, 0); + sysctlbyname("hw.logicalcpu", &this->NumberOfLogicalCPU, &len, NULL, 0); + this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical = this->LogicalCPUPerPhysicalCPU(); + + len = sizeof(value); + sysctlbyname("hw.cpufrequency", &value, &len, NULL, 0); + this->CPUSpeedInMHz = value / 1000000; - // Chip family - this->ChipID.Family = atoi(this->ExtractValueFromSysCtl("machdep.cpu.family:").c_str()); - - // Chip Vendor - strcpy(this->ChipID.Vendor,this->ExtractValueFromSysCtl("machdep.cpu.vendor:").c_str()); - this->FindManufacturer(); - - // Chip Model - this->ChipID.Model = atoi(this->ExtractValueFromSysCtl("machdep.cpu.model:").c_str()); - this->RetrieveClassicalCPUIdentity(); + // Chip family + len = sizeof(this->ChipID.Family); + //Seems only the intel chips will have this name so if this fails it is probably + // a PPC machine + err = sysctlbyname("machdep.cpu.family", &this->ChipID.Family, &len, NULL, 0); + if (err != 0) // Go back to names we know but are less descriptive + { + this->ChipID.Family = 0; + char retBuf[32]; + ::memset(retBuf, 0, 32); + len = 32; + err = sysctlbyname("hw.machine", &retBuf, &len, NULL, 0); + std::string machineBuf(retBuf); + if (machineBuf.find_first_of("Power") != std::string::npos) + { + strcpy(this->ChipID.Vendor, "IBM"); + len = 4; + err = sysctlbyname("hw.cputype", &this->ChipID.Family, &len, NULL, 0); + err = sysctlbyname("hw.cpusubtype", &this->ChipID.Model, &len, NULL, 0); + this->FindManufacturer(); + } + } + else // Should be an Intel Chip. + { + len = sizeof(this->ChipID.Family); + int err = sysctlbyname("machdep.cpu.family", &this->ChipID.Family, &len, NULL, 0); + + char retBuf[128]; + ::memset(retBuf, 0, 128); + len = 128; + err = sysctlbyname("machdep.cpu.vendor", retBuf, &len, NULL, 0); + // Chip Vendor + strcpy(this->ChipID.Vendor,retBuf); + this->FindManufacturer(); + + len=CHIPNAME_STRING_LENGTH; + err = sysctlbyname("machdep.cpu.brand_string", this->ChipID.ProcessorName, &len, NULL, 0); + + // Chip Model + len = sizeof(value); + err = sysctlbyname("machdep.cpu.model", &value, &len, NULL, 0); + this->ChipID.Model = value; + } // Cache size - this->Features.L1CacheSize = atoi(this->ExtractValueFromSysCtl("hw.l1icachesize:").c_str()); - this->Features.L2CacheSize = atoi(this->ExtractValueFromSysCtl("hw.l2cachesize:").c_str()); + int iValue = 0; + len = sizeof(value); + err = sysctlbyname("hw.l1icachesize", &value, &len, NULL, 0); + this->Features.L1CacheSize = value; + err = sysctlbyname("hw.l2cachesize", &value, &len, NULL, 0); + this->Features.L2CacheSize = value; return true; } @@ -2801,7 +2883,7 @@ /** Run a given process */ kwsys_stl::string SystemInformationImplementation::RunProcess(kwsys_stl::vector<const char*> args) -{ +{ kwsys_stl::string buffer = ""; // Run the application @@ -2859,7 +2941,7 @@ } return buffer; } - + kwsys_stl::string SystemInformationImplementation::ParseValueFromKStat(const char* arguments) { @@ -2867,7 +2949,7 @@ args.clear(); args.push_back("kstat"); args.push_back("-p"); - + kwsys_stl::string command = arguments; size_t start = command.npos; size_t pos = command.find(' ',0); @@ -2887,7 +2969,7 @@ b0 = command.find('"',b1+1); b1 = command.find('"',b0+1); } - + if(!inQuotes) { kwsys_stl::string arg = command.substr(start+1,pos-start-1); @@ -2899,7 +2981,7 @@ arg.erase(quotes,1); quotes = arg.find('"'); } - args.push_back(arg.c_str()); + args.push_back(arg.c_str()); start = pos; } pos = command.find(' ',pos+1); @@ -2917,13 +2999,13 @@ if(buffer[i] == ' ' || buffer[i] == '\t') { break; - } + } if(buffer[i] != '\n' && buffer[i] != '\r') { kwsys_stl::string val = value; value = buffer[i]; value += val; - } + } } return value; } @@ -3018,7 +3100,7 @@ // Chip family this->ChipID.Family = cpu_info.eax_1.family; - + // Chip Model this->ChipID.Model = cpu_info.eax_1.model; @@ -3058,38 +3140,38 @@ ZeroMemory (&osvi, sizeof (OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi); - if (!bOsVersionInfoEx) + if (!bOsVersionInfoEx) { osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - if (!GetVersionEx ((OSVERSIONINFO *) &osvi)) + if (!GetVersionEx ((OSVERSIONINFO *) &osvi)) { return false; } } - switch (osvi.dwPlatformId) + switch (osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: // Test for the product. - if (osvi.dwMajorVersion <= 4) + if (osvi.dwMajorVersion <= 4) { this->OSRelease = "NT"; } - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { this->OSRelease = "2000"; } - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { this->OSRelease = "XP"; } #ifdef VER_NT_WORKSTATION // Test for product type. - if (bOsVersionInfoEx) + if (bOsVersionInfoEx) { - if (osvi.wProductType == VER_NT_WORKSTATION) + if (osvi.wProductType == VER_NT_WORKSTATION) { - if (osvi.dwMajorVersion == 6) + if (osvi.dwMajorVersion == 6) { this->OSRelease = "Vista"; } @@ -3101,40 +3183,40 @@ { this->OSRelease += " Personal"; } - else + else { this->OSRelease += " Professional"; } } #endif - } + } else if (osvi.wProductType == VER_NT_SERVER) { // Check for .NET Server instead of Windows XP. - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { this->OSRelease = ".NET"; } // Continue with the type detection. - if (osvi.wSuiteMask & VER_SUITE_DATACENTER) + if (osvi.wSuiteMask & VER_SUITE_DATACENTER) { this->OSRelease += " DataCenter Server"; } - else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) + else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) { this->OSRelease += " Advanced Server"; } - else + else { this->OSRelease += " Server"; } } sprintf (operatingSystem, "%s (Build %ld)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF); - this->OSVersion = operatingSystem; + this->OSVersion = operatingSystem; } - else + else #endif // VER_NT_WORKSTATION { HKEY hKey; @@ -3157,7 +3239,7 @@ { this->OSRelease += " Standard Server"; } - else + else { this->OSRelease += " Server"; } @@ -3169,7 +3251,7 @@ { this->OSRelease += " Enterprise Server"; } - else + else { this->OSRelease += " Advanced Server"; } @@ -3177,7 +3259,7 @@ } // Display version, service pack (if any), and build number. - if (osvi.dwMajorVersion <= 4) + if (osvi.dwMajorVersion <= 4) { // NB: NT 4.0 and earlier. sprintf (operatingSystem, "version %ld.%ld %s (Build %ld)", @@ -3186,30 +3268,30 @@ osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF); this->OSVersion = operatingSystem; - } - else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) + } + else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { // Windows XP and .NET server. typedef BOOL (CALLBACK* LPFNPROC) (HANDLE, BOOL *); - HINSTANCE hKernelDLL; + HINSTANCE hKernelDLL; LPFNPROC DLLProc; - + // Load the Kernel32 DLL. hKernelDLL = LoadLibrary ("kernel32"); - if (hKernelDLL != NULL) { + if (hKernelDLL != NULL) { // Only XP and .NET Server support IsWOW64Process so... Load dynamically! - DLLProc = (LPFNPROC) GetProcAddress (hKernelDLL, "IsWow64Process"); - + DLLProc = (LPFNPROC) GetProcAddress (hKernelDLL, "IsWow64Process"); + // If the function address is valid, call the function. if (DLLProc != NULL) (DLLProc) (GetCurrentProcess (), &bIsWindows64Bit); else bIsWindows64Bit = false; - + // Free the DLL module. - FreeLibrary (hKernelDLL); - } - } - else - { + FreeLibrary (hKernelDLL); + } + } + else + { // Windows 2000 and everything else. sprintf (operatingSystem,"%s (Build %ld)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF); this->OSVersion = operatingSystem; @@ -3218,32 +3300,32 @@ case VER_PLATFORM_WIN32_WINDOWS: // Test for the product. - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { this->OSRelease = "95"; - if(osvi.szCSDVersion[1] == 'C') + if(osvi.szCSDVersion[1] == 'C') { this->OSRelease += "OSR 2.5"; } - else if(osvi.szCSDVersion[1] == 'B') + else if(osvi.szCSDVersion[1] == 'B') { this->OSRelease += "OSR 2"; } - } + } - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { this->OSRelease = "98"; - if (osvi.szCSDVersion[1] == 'A' ) + if (osvi.szCSDVersion[1] == 'A' ) { this->OSRelease += "SE"; } - } + } - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { this->OSRelease = "Me"; - } + } break; case VER_PLATFORM_WIN32s: SystemInformation-1.cxx.diff [^] (10,747 bytes) 2009-05-19 12:13 [Show Content] [Hide Content] Index: Source/kwsys/testSystemInformation.cxx =================================================================== RCS file: /cvsroot/CMake/CMake/Source/kwsys/testSystemInformation.cxx,v retrieving revision 1.2 diff -u -r1.2 testSystemInformation.cxx --- Source/kwsys/testSystemInformation.cxx 19 Feb 2008 23:50:52 -0000 1.2 +++ Source/kwsys/testSystemInformation.cxx 19 May 2009 16:12:24 -0000 @@ -26,13 +26,21 @@ #define printMethod(inof, m) kwsys_ios::cout << #m << ": " \ << info.m() << "\n" + +#define printMethod2(inof, m, unit) kwsys_ios::cout << #m << ": " \ +<< info.m() << " " << unit << "\n" + int testSystemInformation(int, char*[]) { kwsys::SystemInformation info; - printMethod(info, GetVendorString); info.RunCPUCheck(); info.RunOSCheck(); info.RunMemoryCheck(); + printMethod(info, GetOSName); + printMethod(info, GetHostname); + printMethod(info, GetOSRelease); + printMethod(info, GetOSVersion); + printMethod(info, GetOSPlatform); printMethod(info, GetVendorString); printMethod(info, GetVendorID); printMethod(info, GetTypeID); @@ -40,24 +48,19 @@ printMethod(info, GetModelID); printMethod(info, GetExtendedProcessorName); printMethod(info, GetProcessorSerialNumber); - printMethod(info, GetProcessorCacheSize); + printMethod2(info, GetProcessorCacheSize, "KB"); printMethod(info, GetLogicalProcessorsPerPhysical); - printMethod(info, GetProcessorClockFrequency); - printMethod(info, GetProcessorAPICID); - printMethod(info, GetOSName); - printMethod(info, GetHostname); - printMethod(info, GetOSRelease); - printMethod(info, GetOSVersion); - printMethod(info, GetOSPlatform); + printMethod2(info, GetProcessorClockFrequency, "MHz"); printMethod(info, Is64Bits); printMethod(info, GetNumberOfLogicalCPU); printMethod(info, GetNumberOfPhysicalCPU); printMethod(info, DoesCPUSupportCPUID); - printMethod(info, GetTotalVirtualMemory); - printMethod(info, GetAvailableVirtualMemory); - printMethod(info, GetTotalPhysicalMemory); - printMethod(info, GetAvailablePhysicalMemory); - + printMethod(info, GetProcessorAPICID); + printMethod2(info, GetTotalVirtualMemory, "MB"); + printMethod2(info, GetAvailableVirtualMemory, "MB"); + printMethod2(info, GetTotalPhysicalMemory, "MB"); + printMethod2(info, GetAvailablePhysicalMemory, "MB"); + //int GetProcessorCacheXSize(long int); // bool DoesCPUSupportFeature(long int); return 0; Index: Source/kwsys/SystemInformation.cxx =================================================================== RCS file: /cvsroot/CMake/CMake/Source/kwsys/SystemInformation.cxx,v retrieving revision 1.40 diff -u -r1.40 SystemInformation.cxx --- Source/kwsys/SystemInformation.cxx 6 Apr 2009 18:55:54 -0000 1.40 +++ Source/kwsys/SystemInformation.cxx 19 May 2009 16:12:24 -0000 @@ -49,6 +49,14 @@ # include <windows.h> #endif +#ifdef __APPLE__ +#include <sys/sysctl.h> +#include <mach/vm_statistics.h> +#include <mach/host_info.h> +#include <mach/mach.h> +#include <mach/mach_types.h> +#endif + #ifdef __linux # include <sys/procfs.h> # include <sys/types.h> @@ -195,7 +203,7 @@ enum Manufacturer { - AMD, Intel, NSC, UMC, Cyrix, NexGen, IDT, Rise, Transmeta, Sun, UnknownManufacturer + AMD, Intel, NSC, UMC, Cyrix, NexGen, IDT, Rise, Transmeta, Sun, IBM, Motorola, UnknownManufacturer }; protected: @@ -629,6 +637,10 @@ return "Transmeta"; case Sun: return "Sun Microelectronics"; + case IBM: + return "IBM"; + case Motorola: + return "Motorola"; default: return "Unknown Manufacturer"; } @@ -968,7 +980,9 @@ else if (strcmp (this->ChipID.Vendor, "GenuineTMx86") == 0) this->ChipManufacturer = Transmeta; // Transmeta else if (strcmp (this->ChipID.Vendor, "TransmetaCPU") == 0) this->ChipManufacturer = Transmeta; // Transmeta else if (strcmp (this->ChipID.Vendor, "Geode By NSC") == 0) this->ChipManufacturer = NSC; // National Semiconductor - else if (strcmp (this->ChipID.Vendor, "Sun") == 0) this->ChipManufacturer = Sun; // Sun Microelectronics + else if (strcmp (this->ChipID.Vendor, "Sun") == 0) this->ChipManufacturer = Sun; // Sun Microelectronics + else if (strcmp (this->ChipID.Vendor, "IBM") == 0) this->ChipManufacturer = IBM; // IBM Microelectronics + else if (strcmp (this->ChipID.Vendor, "Motorola") == 0) this->ChipManufacturer = Motorola; // Motorola Microelectronics else this->ChipManufacturer = UnknownManufacturer; // Unknown manufacturer } @@ -1913,6 +1927,7 @@ case 8: sprintf (this->ChipID.ProcessorName,"Pentium III (0.18 micron) With 256 KB On-Die L2 Cache "); break; case 0xa: sprintf (this->ChipID.ProcessorName,"Pentium III (0.18 micron) With 1 Or 2 MB On-Die L2 Cache "); break; case 0xb: sprintf (this->ChipID.ProcessorName,"Pentium III (0.13 micron) With 256 Or 512 KB On-Die L2 Cache "); break; + case 23: sprintf (this->ChipID.ProcessorName, "Intel(R) Core(TM)2 Duo CPU T9500 @ 2.60GHz"); break; default: sprintf (this->ChipID.ProcessorName,"Unknown P6 family"); return false; } break; @@ -2543,6 +2558,20 @@ mov Regebx, ebx } #endif + +#ifdef __APPLE__ + size_t len = 4; + int cores_per_package = 0; + int err = sysctlbyname("machdep.cpu.cores_per_package", &cores_per_package, &len, NULL, 0); + if (err != 0) + { + return 1; // That name was not found, default to 1 + } + else + { + return static_cast<unsigned char>(cores_per_package); + } +#endif return static_cast<unsigned char> ((Regebx & NUM_LOGICAL_BITS) >> 16); } @@ -2739,46 +2768,99 @@ /** For Mac we Parse the sysctl -a output */ bool SystemInformationImplementation::ParseSysCtl() { - // Extract the arguments from the command line - kwsys_stl::vector<const char*> args; - args.push_back("sysctl"); - args.push_back("-a"); - args.push_back(0); + int err = 0; + uint64_t value = 0; + size_t len = sizeof(value); + sysctlbyname("hw.memsize", &value, &len, NULL, 0); + this->TotalPhysicalMemory = value/1000000; +// std::cout << "hw.memsize: " << this->TotalPhysicalMemory << std::endl; + - this->SysCtlBuffer = this->RunProcess(args); - // Parse values for Mac - this->TotalPhysicalMemory = static_cast<unsigned long>( - atoi(this->ExtractValueFromSysCtl("hw.memsize:").c_str())/(1024*1024)); - this->TotalVirtualMemory = 0; this->AvailablePhysicalMemory = 0; - this->AvailableVirtualMemory = 0; + vm_statistics_data_t vmstat; + mach_msg_type_number_t count = HOST_VM_INFO_COUNT; + if ( host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstat, &count) == KERN_SUCCESS ) + { + + err = sysctlbyname("hw.pagesize", &value, &len, NULL, 0); + int64_t available_memory = vmstat.free_count * value; + this->AvailablePhysicalMemory = available_memory / 1000000; + } - this->NumberOfPhysicalCPU = static_cast<unsigned int>(atoi(this->ExtractValueFromSysCtl("hw.physicalcpu:").c_str())); - this->NumberOfLogicalCPU = static_cast<unsigned int>(atoi(this->ExtractValueFromSysCtl("hw.logicalcpu:").c_str())); - - if(this->NumberOfPhysicalCPU!=0) - { - this->NumberOfLogicalCPU /= this->NumberOfPhysicalCPU; - } + // Virtual memory. + int mib[2] = { CTL_VM, VM_SWAPUSAGE }; + size_t miblen = sizeof(mib) / sizeof(mib[0]); + struct xsw_usage swap; + len = sizeof(struct xsw_usage); + err = sysctl(mib, miblen, &swap, &len, NULL, 0); + if (err == 0) + { + this->AvailableVirtualMemory = swap.xsu_avail/1000000; + this->TotalVirtualMemory = swap.xsu_total/1000000; + } - this->CPUSpeedInMHz = static_cast<float>(atoi(this->ExtractValueFromSysCtl("hw.cpufrequency:").c_str())); - this->CPUSpeedInMHz /= 1000000; +// CPU Info + len = sizeof(this->NumberOfPhysicalCPU); + sysctlbyname("hw.physicalcpu", &this->NumberOfPhysicalCPU, &len, NULL, 0); + sysctlbyname("hw.logicalcpu", &this->NumberOfLogicalCPU, &len, NULL, 0); + this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical = this->LogicalCPUPerPhysicalCPU(); + + len = sizeof(value); + sysctlbyname("hw.cpufrequency", &value, &len, NULL, 0); + this->CPUSpeedInMHz = value / 1000000; - // Chip family - this->ChipID.Family = atoi(this->ExtractValueFromSysCtl("machdep.cpu.family:").c_str()); - - // Chip Vendor - strcpy(this->ChipID.Vendor,this->ExtractValueFromSysCtl("machdep.cpu.vendor:").c_str()); - this->FindManufacturer(); - - // Chip Model - this->ChipID.Model = atoi(this->ExtractValueFromSysCtl("machdep.cpu.model:").c_str()); - this->RetrieveClassicalCPUIdentity(); + // Chip family + len = sizeof(this->ChipID.Family); + //Seems only the intel chips will have this name so if this fails it is probably + // a PPC machine + err = sysctlbyname("machdep.cpu.family", &this->ChipID.Family, &len, NULL, 0); + if (err != 0) // Go back to names we know but are less descriptive + { + this->ChipID.Family = 0; + char retBuf[32]; + ::memset(retBuf, 0, 32); + len = 32; + err = sysctlbyname("hw.machine", &retBuf, &len, NULL, 0); + std::string machineBuf(retBuf); + if (machineBuf.find_first_of("Power") != std::string::npos) + { + strcpy(this->ChipID.Vendor, "IBM"); + len = 4; + err = sysctlbyname("hw.cputype", &this->ChipID.Family, &len, NULL, 0); + err = sysctlbyname("hw.cpusubtype", &this->ChipID.Model, &len, NULL, 0); + this->FindManufacturer(); + } + } + else // Should be an Intel Chip. + { + len = sizeof(this->ChipID.Family); + int err = sysctlbyname("machdep.cpu.family", &this->ChipID.Family, &len, NULL, 0); + + char retBuf[128]; + ::memset(retBuf, 0, 128); + len = 128; + err = sysctlbyname("machdep.cpu.vendor", retBuf, &len, NULL, 0); + // Chip Vendor + strcpy(this->ChipID.Vendor,retBuf); + this->FindManufacturer(); + + len=CHIPNAME_STRING_LENGTH; + err = sysctlbyname("machdep.cpu.brand_string", this->ChipID.ProcessorName, &len, NULL, 0); + + // Chip Model + len = sizeof(value); + err = sysctlbyname("machdep.cpu.model", &value, &len, NULL, 0); + this->ChipID.Model = value; + } // Cache size - this->Features.L1CacheSize = atoi(this->ExtractValueFromSysCtl("hw.l1icachesize:").c_str()); - this->Features.L2CacheSize = atoi(this->ExtractValueFromSysCtl("hw.l2cachesize:").c_str()); + int iValue = 0; + len = sizeof(value); + err = sysctlbyname("hw.l1icachesize", &value, &len, NULL, 0); + this->Features.L1CacheSize = value; + err = sysctlbyname("hw.l2cachesize", &value, &len, NULL, 0); + this->Features.L2CacheSize = value; return true; } | ||||||||
Relationships | |
Relationships |
Notes | |
(0016530) Mike Jackson (reporter) 2009-05-19 11:34 |
I rewrote most of the method that gets the information on OS X using the supplied system calls that are included with OS X. Seems to work fine on 10.4 and 10.5 machines. There may be an issue with a 10.3 machine but I don't have any way of testing it to find out. Please test the supplied patch and let me know if there are any issues. |
(0016531) Bill Hoffman (manager) 2009-05-19 11:44 |
The patch seems to change lots of lines that are not part of the patch. Seems like a bunch of white space changes, do you think you could fix that and have a patch that only touches the code that was actually changed? |
(0016532) Mike Jackson (reporter) 2009-05-19 11:54 |
Huh, I thought I fixed all that. I'll try again. |
(0016533) Mike Jackson (reporter) 2009-05-19 12:14 |
New Patch Attached. |
(0030593) David Cole (manager) 2012-08-13 15:06 |
Sending old, not-recently-updated issues to the backlog. (The age of the bug alone means that nobody is actively working on it...) If an issue you care about is sent to the backlog when you feel it should have been addressed in a different manner, please bring it up on the CMake mailing list for discussion. Sign up for the mailing list here, if you're not already on it: http://www.cmake.org/mailman/listinfo/cmake [^] It's easy to re-activate a bug here if you can find a CMake developer who has the bandwidth to take it on, and ferry a fix through to our 'next' branch for dashboard testing. |
(0030964) Rolf Eike Beer (developer) 2012-09-09 08:11 |
It looks like this has been merged in 5634ca02f4457a8c95ba43a78cf968894e0d8ae5 which is part of 2.8.0 and all following versions. |
(0030972) David Cole (manager) 2012-09-09 16:48 |
The patch does appear to have been applied: it's in 'master' and 'next', and I trust Eike's evaluation that it's been in there since 2.8.0 Marking resolved as 'fixed' (There are still some calls in the SystemInformation.cxx file to RunProcess that take program names without full paths. I guess if nobody's complaining about the remaining problems, then there aren't really any problems remaining...) Thanks, Eike, for pointing this out. |
(0032442) Robert Maynard (manager) 2013-03-04 08:38 |
Closing resolved issues that have not been updated in more than 4 months. |
Notes |
Issue History | |||
Date Modified | Username | Field | Change |
2009-05-19 07:26 | David Cole | New Issue | |
2009-05-19 07:26 | David Cole | Status | new => assigned |
2009-05-19 07:26 | David Cole | Assigned To | => David Cole |
2009-05-19 11:32 | Mike Jackson | File Added: SystemInformation.cxx.diff | |
2009-05-19 11:34 | Mike Jackson | Note Added: 0016530 | |
2009-05-19 11:44 | Bill Hoffman | Note Added: 0016531 | |
2009-05-19 11:54 | Mike Jackson | Note Added: 0016532 | |
2009-05-19 12:13 | Mike Jackson | File Added: SystemInformation-1.cxx.diff | |
2009-05-19 12:14 | Mike Jackson | Note Added: 0016533 | |
2012-08-13 15:06 | David Cole | Status | assigned => new |
2012-08-13 15:06 | David Cole | Note Added: 0030593 | |
2012-08-13 15:07 | David Cole | Status | new => backlog |
2012-08-13 15:22 | David Cole | Assigned To | David Cole => |
2012-09-09 08:11 | Rolf Eike Beer | Note Added: 0030964 | |
2012-09-09 16:48 | David Cole | Note Added: 0030972 | |
2012-09-09 16:48 | David Cole | Status | backlog => resolved |
2012-09-09 16:48 | David Cole | Fixed in Version | => CMake-2-8 |
2012-09-09 16:48 | David Cole | Resolution | open => fixed |
2012-09-09 16:48 | David Cole | Assigned To | => David Cole |
2013-03-04 08:38 | Robert Maynard | Note Added: 0032442 | |
2013-03-04 08:38 | Robert Maynard | Status | resolved => closed |
Issue History |
Copyright © 2000 - 2018 MantisBT Team |