*** empty log message ***

svn path=/trunk/boinc/; revision=10156
This commit is contained in:
Rom Walton 2006-05-17 22:29:37 +00:00
parent 6bc8011298
commit aa3b8430af
5 changed files with 268 additions and 92 deletions

View File

@ -4787,7 +4787,6 @@ Rom 16 May 2006
diagnostics_win.C diagnostics_win.C
Charlie 16 May 2006 Charlie 16 May 2006
- Mac: Update XCode roject, build instructions and build scripts - Mac: Update XCode roject, build instructions and build scripts
to use wxMac-2.6.3 instead of 2.6.2. to use wxMac-2.6.3 instead of 2.6.2.
Remove obsolete files exception.C,.h from XCode project. Remove obsolete files exception.C,.h from XCode project.
@ -4801,3 +4800,12 @@ Charlie 16 May 2006
setupForBOINC.sh setupForBOINC.sh
boinc.xcodeproj/ boinc.xcodeproj/
project.pbxproj project.pbxproj
Rom 16 May 2006
- Add a field to host info which contains CPU feature information.
client/win/
hostinfo_win.cpp
lib/
diagnostics_win.C
hostinfo.C, .h

View File

@ -31,6 +31,25 @@
HINSTANCE g_hClientLibraryDll; HINSTANCE g_hClientLibraryDll;
// Newer processor features than what is currently defined in
// Visual Studio 2003
#ifndef PF_SSE_DAZ_MODE_AVAILABLE
#define PF_SSE_DAZ_MODE_AVAILABLE 11
#endif
#ifndef PF_NX_ENABLED
#define PF_NX_ENABLED 12
#endif
#ifndef PF_SSE3_INSTRUCTIONS_AVAILABLE
#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
#endif
#ifndef PF_COMPARE_EXCHANGE128
#define PF_COMPARE_EXCHANGE128 14
#endif
#ifndef PF_COMPARE64_EXCHANGE128
#define PF_COMPARE64_EXCHANGE128 15
#endif
// Memory Status Structure for Win2K and WinXP based systems. // Memory Status Structure for Win2K and WinXP based systems.
typedef struct _MYMEMORYSTATUSEX { typedef struct _MYMEMORYSTATUSEX {
DWORD dwLength; DWORD dwLength;
@ -61,20 +80,56 @@ struct INTERNALMONITORINFO
// Returns the number of seconds difference from UTC // Returns the number of seconds difference from UTC
// //
int get_timezone(void) { int get_timezone(int& timezone) {
TIME_ZONE_INFORMATION tzi;
ZeroMemory(&tzi, sizeof(TIME_ZONE_INFORMATION)); TIME_ZONE_INFORMATION tzi;
GetTimeZoneInformation(&tzi);
return -(tzi.Bias * 60); memset(&tzi, '\0', sizeof(TIME_ZONE_INFORMATION));
GetTimeZoneInformation(&tzi);
timezone = -(tzi.Bias * 60);
return 0;
} }
// Gets windows specific host information (not complete)
// Returns the memory information
// //
int HOST_INFO::get_host_info() { int get_memory_info(double& bytes, double& swap) {
HMODULE hKernel32Lib;
MYGLOBALMEMORYSTATUSEX myGlobalMemoryStatusEx;
hKernel32Lib = GetModuleHandle("kernel32.dll");
if (hKernel32Lib) {
myGlobalMemoryStatusEx = (MYGLOBALMEMORYSTATUSEX) GetProcAddress(hKernel32Lib, "GlobalMemoryStatusEx");
}
ZeroMemory(os_name, sizeof(os_name)); if (hKernel32Lib && myGlobalMemoryStatusEx) {
ZeroMemory(os_version, sizeof(os_version)); MYMEMORYSTATUSEX mStatusEx;
ZeroMemory(&mStatusEx, sizeof(MYMEMORYSTATUSEX));
mStatusEx.dwLength = sizeof(MYMEMORYSTATUSEX);
(*myGlobalMemoryStatusEx)(&mStatusEx);
bytes = (double)mStatusEx.ullTotalPhys;
swap = (double)mStatusEx.ullTotalPageFile;
} else {
MEMORYSTATUS mStatus;
ZeroMemory(&mStatus, sizeof(MEMORYSTATUS));
mStatus.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&mStatus);
bytes = (double)mStatus.dwTotalPhys;
swap = (double)mStatus.dwTotalPageFile;
}
return 0;
}
// Returns the OS name and version
//
int get_os_information(
char* os_name, int os_name_size, char* os_version, int os_version_size
)
{
// This code snip-it was copied straight out of the MSDN Platform SDK // This code snip-it was copied straight out of the MSDN Platform SDK
// Getting the System Version example and modified to dump the output // Getting the System Version example and modified to dump the output
// into os_name. // into os_name.
@ -297,65 +352,18 @@ int HOST_INFO::get_host_info() {
break; break;
} }
snprintf( os_version, sizeof(os_version), "%s%s%s", snprintf( os_version, os_version_size, "%s%s%s", szSKU, szServicePack, szVersion );
szSKU, szServicePack, szVersion );
return 0;
}
timezone = get_timezone(); // Returns the processor make and model
//
// Open the WinSock dll so we can get host info int get_processor_info(
WORD wVersionRequested; char* p_vendor, int p_vendor_size, char* p_model, int p_model_size
WSADATA wsdata; )
wVersionRequested = MAKEWORD(1, 1); {
WSAStartup(wVersionRequested, &wsdata);
// Get host name/ip info
get_local_network_info(
domain_name, sizeof(domain_name), ip_addr, sizeof(ip_addr)
);
// Close the WinSock dll
WSACleanup();
// Detect the filesystem information
get_filesystem_info(d_total, d_free);
// Detect the amount of memory the system has with the new API, if it doesn't
// exist, then use the older API.
HMODULE hKernel32;
MYGLOBALMEMORYSTATUSEX myGlobalMemoryStatusEx;
hKernel32 = LoadLibrary("kernel32.dll");
if (hKernel32) {
myGlobalMemoryStatusEx = (MYGLOBALMEMORYSTATUSEX) GetProcAddress(hKernel32, "GlobalMemoryStatusEx");
}
if (hKernel32 && myGlobalMemoryStatusEx) {
MYMEMORYSTATUSEX mStatusEx;
ZeroMemory(&mStatusEx, sizeof(MYMEMORYSTATUSEX));
mStatusEx.dwLength = sizeof(MYMEMORYSTATUSEX);
(*myGlobalMemoryStatusEx)(&mStatusEx);
m_nbytes = (double)mStatusEx.ullTotalPhys;
m_swap = (double)mStatusEx.ullTotalPageFile;
} else {
MEMORYSTATUS mStatus;
ZeroMemory(&mStatus, sizeof(MEMORYSTATUS));
mStatus.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&mStatus);
m_nbytes = (double)mStatus.dwTotalPhys;
m_swap = (double)mStatus.dwTotalPageFile;
}
if (hKernel32) {
FreeLibrary(hKernel32);
}
// Detect the number of CPUs
SYSTEM_INFO SystemInfo;
memset( &SystemInfo, NULL, sizeof( SystemInfo ) );
::GetSystemInfo( &SystemInfo );
p_ncpus = SystemInfo.dwNumberOfProcessors;
// gets processor vendor name and model name from registry, works for intel // gets processor vendor name and model name from registry, works for intel
char vendorName[256], processorName[256], identifierName[256]; char vendorName[256], processorName[256], identifierName[256];
HKEY hKey; HKEY hKey;
@ -396,26 +404,139 @@ int HOST_INFO::get_host_info() {
if (retval == ERROR_SUCCESS) gotMHz = true; if (retval == ERROR_SUCCESS) gotMHz = true;
} }
if (gotVendIdent) strlcpy( p_vendor, vendorName, sizeof(p_vendor) ); if (gotVendIdent)
else strlcpy( p_vendor, "Unknown", sizeof(p_vendor) ); strlcpy( p_vendor, vendorName, p_vendor_size );
else
strlcpy( p_vendor, "Unknown", p_vendor_size );
if (gotProcName) { if (gotProcName) {
strlcpy( p_model, processorName, sizeof(p_model) ); strlcpy( p_model, processorName, p_model_size );
} else if (gotIdent && gotMHz) { } else if (gotIdent && gotMHz) {
sprintf( p_model, "%s %dMHz", identifierName, procSpeed ); sprintf( p_model, "%s %dMHz", identifierName, procSpeed );
} else if (gotVendIdent && gotMHz) { } else if (gotVendIdent && gotMHz) {
sprintf( p_model, "%s %dMHz", vendorName, procSpeed ); sprintf( p_model, "%s %dMHz", vendorName, procSpeed );
} else if (gotIdent) { } else if (gotIdent) {
strlcpy( p_model, identifierName, sizeof(p_model) ); strlcpy( p_model, identifierName, p_model_size );
} else if (gotVendIdent) { } else if (gotVendIdent) {
strlcpy( p_model, vendorName, sizeof(p_model) ); strlcpy( p_model, vendorName, p_model_size );
} else { } else {
strlcpy( p_model, "Unknown", sizeof(p_model) ); strlcpy( p_model, "Unknown", p_model_size );
} }
RegCloseKey(hKey); RegCloseKey(hKey);
return 0;
}
// Returns the CPU count
//
int get_processor_count(int& processor_count) {
SYSTEM_INFO SystemInfo;
memset( &SystemInfo, NULL, sizeof( SystemInfo ) );
::GetSystemInfo( &SystemInfo );
processor_count = SystemInfo.dwNumberOfProcessors;
return 0;
}
// Check to see if a processor feature is available for use
BOOL test_processor_feature(DWORD feature) {
__try {
switch (feature) {
case PF_XMMI_INSTRUCTIONS_AVAILABLE:
__asm {
xorps xmm0, xmm0 // executing SSE instruction
}
break;
case PF_XMMI64_INSTRUCTIONS_AVAILABLE:
__asm {
xorpd xmm0, xmm0 // executing SSE2 instruction
}
break;
case PF_3DNOW_INSTRUCTIONS_AVAILABLE:
__asm {
pfrcp mm0, mm0 // executing 3DNow! instruction
emms
}
break;
case PF_MMX_INSTRUCTIONS_AVAILABLE:
__asm {
pxor mm0, mm0 // executing MMX instruction
emms
}
break;
default:
return 0;
break;
}
}
__except (EXCEPTION_EXECUTE_HANDLER) {
return 0;
}
return 1;
}
// Detect to see if a processor feature is available for use
BOOL is_processor_feature_supported(DWORD feature) {
// Detect platform information
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx(&osvi);
if (VER_PLATFORM_WIN32_WINDOWS == osvi.dwPlatformId) {
// Win9x does have the IsProcessorFeaturePresent function, so just
// run a quick test.
return test_processor_feature(feature);
} else {
return IsProcessorFeaturePresent(feature);
}
return 0;
}
// Returns the list of capabilities supported by both the processor
// and operating system. The feature list should use the same
// identifiers as defined in Linux.
//
int get_processor_capabilities( char* capabilities, int capabilities_size ) {
if (is_processor_feature_supported(PF_RDTSC_INSTRUCTION_AVAILABLE)) {
strncat(capabilities, "tsc ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_PAE_ENABLED)) {
strncat(capabilities, "pae ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_NX_ENABLED)) {
strncat(capabilities, "nx ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_XMMI_INSTRUCTIONS_AVAILABLE)) {
strncat(capabilities, "sse ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_XMMI64_INSTRUCTIONS_AVAILABLE)) {
strncat(capabilities, "sse2 ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_SSE3_INSTRUCTIONS_AVAILABLE)) {
strncat(capabilities, "sse3 ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_3DNOW_INSTRUCTIONS_AVAILABLE)) {
strncat(capabilities, "3dnow ", capabilities_size - strlen(capabilities));
}
if (is_processor_feature_supported(PF_MMX_INSTRUCTIONS_AVAILABLE)) {
strncat(capabilities, "mmx ", capabilities_size - strlen(capabilities));
}
strip_whitespace(capabilities);
return 0;
}
// Returns the accelerator list.
//
int get_accelerators(
char* accelerators, int accelerators_size
)
{
// Detect video accelerators on the system. // Detect video accelerators on the system.
DWORD iDevice = 0; DWORD iDevice = 0;
INTERNALMONITORINFO dispdev; INTERNALMONITORINFO dispdev;
@ -427,21 +548,65 @@ int HOST_INFO::get_host_info() {
if (!strstr(accelerators, dispdev.DeviceString)) { if (!strstr(accelerators, dispdev.DeviceString)) {
// Is this the first entry? // Is this the first entry?
if (!strlen(accelerators)) { if (!strlen(accelerators)) {
strncat(accelerators, dispdev.DeviceString, sizeof(accelerators)); strncat(accelerators, dispdev.DeviceString, accelerators_size - strlen(accelerators));
} else { } else {
strncat(accelerators, "/", sizeof(accelerators)); strncat(accelerators, "/", accelerators_size - strlen(accelerators));
strncat(accelerators, dispdev.DeviceString, sizeof(accelerators)); strncat(accelerators, dispdev.DeviceString, accelerators_size - strlen(accelerators));
} }
} }
} }
iDevice++; iDevice++;
} }
// TODO: Detect the ClearSpeed accelerator card(s) // TODO: Detect the ClearSpeed accelerator card(s)
// TODO: Detect any other types of accelerators that might be useful // TODO: Detect any other types of accelerators that might be useful
// for yhe scheduler to know about. // for the scheduler to know about.
strip_whitespace(accelerators);
return 0;
}
// Gets windows specific host information (not complete)
//
int HOST_INFO::get_host_info() {
// Get timezone
get_timezone(timezone);
// Detect the filesystem information
get_filesystem_info(d_total, d_free);
// Detect the amount of memory the system has
get_memory_info(m_nbytes, m_swap);
// Detect OS Information
get_os_information(
os_name, sizeof(os_name), os_version, sizeof(os_version)
);
// Detect proccessor make and model.
get_processor_info(
p_vendor, sizeof(p_vendor), p_model, sizeof(p_model)
);
// Detect the number of CPUs
get_processor_count(p_ncpus);
// Detect processor capabilities
get_processor_capabilities(
p_capabilities, sizeof(p_capabilities)
);
// Detect host name/ip info
get_local_network_info(
domain_name, sizeof(domain_name), ip_addr, sizeof(ip_addr)
);
// Detect which accelerators are installed on the system
get_accelerators(
accelerators, sizeof(accelerators)
);
if (!strlen(host_cpid)) { if (!strlen(host_cpid)) {
generate_host_cpid(); generate_host_cpid();

View File

@ -156,8 +156,7 @@ int diagnostics_init_thread_list() {
size = diagnostics_threads.size(); size = diagnostics_threads.size();
for (i=0; i<size; i++) { for (i=0; i<size; i++) {
delete diagnostics_threads[0]; delete diagnostics_threads[i];
diagnostics_threads.erase(diagnostics_threads.begin());
} }
diagnostics_threads.clear(); diagnostics_threads.clear();
@ -179,8 +178,7 @@ int diagnostics_finish_thread_list() {
size = diagnostics_threads.size(); size = diagnostics_threads.size();
for (i=0; i<size; i++) { for (i=0; i<size; i++) {
delete diagnostics_threads[0]; delete diagnostics_threads[i];
diagnostics_threads.erase(diagnostics_threads.begin());
} }
diagnostics_threads.clear(); diagnostics_threads.clear();
@ -813,8 +811,7 @@ int diagnostics_init_message_monitor() {
// Clear out any previous messages. // Clear out any previous messages.
for (i=0; i<diagnostics_monitor_messages.size(); i++) { for (i=0; i<diagnostics_monitor_messages.size(); i++) {
delete diagnostics_monitor_messages[0]; delete diagnostics_monitor_messages[i];
diagnostics_monitor_messages.erase(diagnostics_monitor_messages.begin());
} }
diagnostics_monitor_messages.clear(); diagnostics_monitor_messages.clear();
@ -910,8 +907,7 @@ int diagnostics_finish_message_monitor() {
// Clear out any previous messages. // Clear out any previous messages.
for (i=0; i<diagnostics_monitor_messages.size(); i++) { for (i=0; i<diagnostics_monitor_messages.size(); i++) {
delete diagnostics_monitor_messages[0]; delete diagnostics_monitor_messages[i];
diagnostics_monitor_messages.erase(diagnostics_monitor_messages.begin());
} }
diagnostics_monitor_messages.clear(); diagnostics_monitor_messages.clear();

View File

@ -52,6 +52,7 @@ void HOST_INFO::clear_host_info() {
p_ncpus = 0; p_ncpus = 0;
strcpy(p_vendor, ""); strcpy(p_vendor, "");
strcpy(p_model, ""); strcpy(p_model, "");
strcpy(p_capabilities, "");
p_fpops = 0; p_fpops = 0;
p_iops = 0; p_iops = 0;
p_membw = 0; p_membw = 0;
@ -83,6 +84,7 @@ int HOST_INFO::parse(MIOFILE& in) {
else if (parse_int(buf, "<p_ncpus>", p_ncpus)) continue; else if (parse_int(buf, "<p_ncpus>", p_ncpus)) continue;
else if (parse_str(buf, "<p_vendor>", p_vendor, sizeof(p_vendor))) continue; else if (parse_str(buf, "<p_vendor>", p_vendor, sizeof(p_vendor))) continue;
else if (parse_str(buf, "<p_model>", p_model, sizeof(p_model))) continue; else if (parse_str(buf, "<p_model>", p_model, sizeof(p_model))) continue;
else if (parse_str(buf, "<p_capabilities>", p_capabilities, sizeof(p_capabilities))) continue;
else if (parse_double(buf, "<p_fpops>", p_fpops)) { else if (parse_double(buf, "<p_fpops>", p_fpops)) {
// fix foolishness that could result in negative value here // fix foolishness that could result in negative value here
// //
@ -123,6 +125,7 @@ int HOST_INFO::write(MIOFILE& out) {
" <p_ncpus>%d</p_ncpus>\n" " <p_ncpus>%d</p_ncpus>\n"
" <p_vendor>%s</p_vendor>\n" " <p_vendor>%s</p_vendor>\n"
" <p_model>%s</p_model>\n" " <p_model>%s</p_model>\n"
" <p_capabilities>%s</p_capabilities>\n"
" <p_fpops>%f</p_fpops>\n" " <p_fpops>%f</p_fpops>\n"
" <p_iops>%f</p_iops>\n" " <p_iops>%f</p_iops>\n"
" <p_membw>%f</p_membw>\n" " <p_membw>%f</p_membw>\n"
@ -143,6 +146,7 @@ int HOST_INFO::write(MIOFILE& out) {
p_ncpus, p_ncpus,
p_vendor, p_vendor,
p_model, p_model,
p_capabilities,
p_fpops, p_fpops,
p_iops, p_iops,
p_membw, p_membw,

View File

@ -34,7 +34,7 @@
class HOST_INFO { class HOST_INFO {
public: public:
int timezone; // local STANDARD time - UTC time (in seconds) int timezone; // local STANDARD time - UTC time (in seconds)
char domain_name[256]; char domain_name[256];
char serialnum[256]; char serialnum[256];
char ip_addr[256]; char ip_addr[256];
@ -43,17 +43,20 @@ public:
int p_ncpus; int p_ncpus;
char p_vendor[256]; char p_vendor[256];
char p_model[256]; char p_model[256];
char p_capabilities[256];
// which intruction sets are supported by the processor and operating
// system.
double p_fpops; double p_fpops;
double p_iops; double p_iops;
double p_membw; double p_membw;
double p_calculated; // when benchmarks were last run, or zero double p_calculated; // when benchmarks were last run, or zero
double m_nbytes; // Total amount of memory in bytes double m_nbytes; // Total amount of memory in bytes
double m_cache; double m_cache;
double m_swap; // Total amount of swap space in bytes double m_swap; // Total amount of swap space in bytes
double d_total; // Total amount of diskspace in bytes double d_total; // Total amount of diskspace in bytes
double d_free; // Total amount of available diskspace in bytes double d_free; // Total amount of available diskspace in bytes
char os_name[256]; char os_name[256];
char os_version[256]; char os_version[256];