* fhandler_proc.cc (format_proc_uptime): Don't call GetSystemInfo.

Fetch CPU count from wincap.
	(format_proc_stat): Ditto.
	* globals.cc (system_info): Move to wincap.
	* heap.cc (heap_init): Fetch page size from wincap.
	* syscalls.cc (getpagesize): Fetch allocation granularity from wincap.
	(getsystempagesize): Fetch page size from wincap.
	* wincap.cc (wincap_2003): Default is_server to false.
	(wincapc::init): Call GetSystemInfo here.  Always set is_server value.
	* wincap.h (class wincapc): Add system_info as private member.
	(wincapc::cpu_count): New public method.
	(wincapc::page_size): Ditto.
	(wincapc::allocation_granularity): Ditto.
This commit is contained in:
Corinna Vinschen 2011-05-10 15:39:02 +00:00
parent 6cfbf1a573
commit c29e693388
7 changed files with 34 additions and 24 deletions

View File

@ -1,3 +1,19 @@
2011-05-10 Corinna Vinschen <corinna@vinschen.de>
* fhandler_proc.cc (format_proc_uptime): Don't call GetSystemInfo.
Fetch CPU count from wincap.
(format_proc_stat): Ditto.
* globals.cc (system_info): Move to wincap.
* heap.cc (heap_init): Fetch page size from wincap.
* syscalls.cc (getpagesize): Fetch allocation granularity from wincap.
(getsystempagesize): Fetch page size from wincap.
* wincap.cc (wincap_2003): Default is_server to false.
(wincapc::init): Call GetSystemInfo here. Always set is_server value.
* wincap.h (class wincapc): Add system_info as private member.
(wincapc::cpu_count): New public method.
(wincapc::page_size): Ditto.
(wincapc::allocation_granularity): Ditto.
2011-05-10 Corinna Vinschen <corinna@vinschen.de>
* environ.cc (set_chunksize): Remove.

View File

@ -480,9 +480,6 @@ format_proc_uptime (void *, char *&destbuf)
PSYSTEM_PERFORMANCE_INFORMATION spi = (PSYSTEM_PERFORMANCE_INFORMATION)
alloca (sizeof_spi);
if (!system_info.dwNumberOfProcessors)
GetSystemInfo (&system_info);
ret = NtQuerySystemInformation (SystemTimeOfDayInformation, &stodi,
sizeof stodi, NULL);
if (NT_SUCCESS (ret))
@ -493,7 +490,7 @@ format_proc_uptime (void *, char *&destbuf)
if (NT_SUCCESS (NtQuerySystemInformation (SystemPerformanceInformation,
spi, sizeof_spi, NULL)))
idle_time = (spi->IdleTime.QuadPart / system_info.dwNumberOfProcessors)
idle_time = (spi->IdleTime.QuadPart / wincap.cpu_count ())
/ 100000ULL;
destbuf = (char *) crealloc_abort (destbuf, 80);
@ -522,19 +519,16 @@ format_proc_stat (void *, char *&destbuf)
char *buf = tp.c_get ();
char *eobuf = buf;
if (!system_info.dwNumberOfProcessors)
GetSystemInfo (&system_info);
SYSTEM_PROCESSOR_TIMES spt[system_info.dwNumberOfProcessors];
SYSTEM_PROCESSOR_TIMES spt[wincap.cpu_count ()];
ret = NtQuerySystemInformation (SystemProcessorTimes, (PVOID) spt,
sizeof spt[0] * system_info.dwNumberOfProcessors, NULL);
sizeof spt[0] * wincap.cpu_count (), NULL);
if (!NT_SUCCESS (ret))
debug_printf ("NtQuerySystemInformation(SystemProcessorTimes), "
"status %p", ret);
else
{
unsigned long long user_time = 0ULL, kernel_time = 0ULL, idle_time = 0ULL;
for (unsigned long i = 0; i < system_info.dwNumberOfProcessors; i++)
for (unsigned long i = 0; i < wincap.cpu_count (); i++)
{
kernel_time += (spt[i].KernelTime.QuadPart - spt[i].IdleTime.QuadPart)
* HZ / 10000000ULL;
@ -545,7 +539,7 @@ format_proc_stat (void *, char *&destbuf)
eobuf += __small_sprintf (eobuf, "cpu %U %U %U %U\n",
user_time, 0ULL, kernel_time, idle_time);
user_time = 0ULL, kernel_time = 0ULL, idle_time = 0ULL;
for (unsigned long i = 0; i < system_info.dwNumberOfProcessors; i++)
for (unsigned long i = 0; i < wincap.cpu_count (); i++)
{
interrupt_count += spt[i].InterruptCount;
kernel_time = (spt[i].KernelTime.QuadPart - spt[i].IdleTime.QuadPart) * HZ / 10000000ULL;

View File

@ -48,8 +48,6 @@ enum exit_states
exit_states NO_COPY exit_state;
SYSTEM_INFO system_info;
/* Set in init.cc. Used to check if Cygwin DLL is dynamically loaded. */
int NO_COPY dynamically_loaded;

View File

@ -1,6 +1,7 @@
/* heap.cc: Cygwin heap manager.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
This file is part of Cygwin.
@ -31,7 +32,7 @@ heap_init ()
/* If we're the forkee, we must allocate the heap at exactly the same place
as our parent. If not, we don't care where it ends up. */
page_const = system_info.dwPageSize;
page_const = wincap.page_size ();
if (!cygheap->user_heap.base)
{
cygheap->user_heap.chunk = cygwin_shared->heap_chunk_size ();

View File

@ -2287,17 +2287,13 @@ getdtablesize ()
extern "C" int
getpagesize ()
{
if (!system_info.dwAllocationGranularity)
GetSystemInfo (&system_info);
return (size_t) system_info.dwAllocationGranularity;
return (size_t) wincap.allocation_granularity ();
}
size_t
getsystempagesize ()
{
if (!system_info.dwPageSize)
GetSystemInfo (&system_info);
return (size_t) system_info.dwPageSize;
return (size_t) wincap.page_size ();
}
/* FIXME: not all values are correct... */

View File

@ -181,7 +181,7 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
heapslop:0x4,
max_sys_priv:SE_CREATE_GLOBAL_PRIVILEGE,
is_server:true,
is_server:false,
has_physical_mem_access:false,
has_create_global_privilege:true,
has_ioctl_storage_get_media_types_ex:true,
@ -279,6 +279,7 @@ wincapc::init ()
if (caps)
return; // already initialized
GetSystemInfo (&system_info);
memset (&version, 0, sizeof version);
version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
if (!GetVersionEx (reinterpret_cast<LPOSVERSIONINFO>(&version)))
@ -347,8 +348,7 @@ wincapc::init ()
break;
}
if (version.wProductType != VER_NT_WORKSTATION)
((wincaps *)caps)->is_server = true;
((wincaps *)caps)->is_server = (version.wProductType != VER_NT_WORKSTATION);
if (NT_SUCCESS (NtQueryInformationProcess (NtCurrentProcess (),
ProcessWow64Information,
&wow64, sizeof wow64, NULL))

View File

@ -46,6 +46,7 @@ struct wincaps
class wincapc
{
SYSTEM_INFO system_info;
OSVERSIONINFOEX version;
char osnam[40];
ULONG wow64;
@ -54,6 +55,10 @@ class wincapc
public:
void init ();
const DWORD cpu_count () const { return system_info.dwNumberOfProcessors; }
const DWORD page_size () const { return system_info.dwPageSize; }
const DWORD allocation_granularity () const
{ return system_info.dwAllocationGranularity; }
const char *osname () const { return osnam; }
const bool is_wow64 () const { return wow64; }