* sysconf.cc (sysinfo): New function.

* cygwin.din (sysinfo): Export.
* posix.sgml (std-gnu): Add sysinfo.
* include/sys/sysinfo.h (struct sysinfo): Define.
(sysinfo): Declare.
* include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump.
This commit is contained in:
Yaakov Selkowitz
2011-05-06 18:53:21 +00:00
parent cc718e26c6
commit 2f52cad971
6 changed files with 129 additions and 3 deletions

View File

@@ -1,7 +1,7 @@
/* sysconf.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2009 Red Hat, Inc.
2006, 2007, 2009, 2010, 2011 Red Hat, Inc.
This file is part of Cygwin.
@@ -17,6 +17,7 @@ details. */
#include "path.h"
#include "fhandler.h"
#include "dtable.h"
#include "pinfo.h"
#include "ntdll.h"
static long
@@ -317,3 +318,99 @@ get_avphys_pages (void)
{
return get_avphys (_SC_AVPHYS_PAGES);
}
extern "C" int
sysinfo (struct sysinfo *info)
{
unsigned long long uptime = 0ULL, totalram = 0ULL, freeram = 0ULL,
totalswap = 0ULL, freeswap = 0ULL;
MEMORYSTATUSEX memory_status;
PSYSTEM_PAGEFILE_INFORMATION spi = NULL;
ULONG sizeof_spi = 512;
PSYSTEM_TIME_OF_DAY_INFORMATION stodi = NULL;
ULONG sizeof_stodi = sizeof (SYSTEM_TIME_OF_DAY_INFORMATION);
NTSTATUS ret = STATUS_SUCCESS;
winpids pids ((DWORD) 0);
if (!info)
{
set_errno (EFAULT);
return -1;
}
stodi = (PSYSTEM_TIME_OF_DAY_INFORMATION) malloc (sizeof_stodi);
ret = NtQuerySystemInformation (SystemTimeOfDayInformation, (PVOID) stodi,
sizeof_stodi, NULL);
if (NT_SUCCESS (ret))
uptime = (stodi->CurrentTime.QuadPart - stodi->BootTime.QuadPart) / 10000000ULL;
else
{
debug_printf ("NtQuerySystemInformation(SystemTimeOfDayInformation), "
"status %p", ret);
}
if (stodi)
free (stodi);
memory_status.dwLength = sizeof (MEMORYSTATUSEX);
GlobalMemoryStatusEx (&memory_status);
totalram = memory_status.ullTotalPhys / getsystempagesize ();
freeram = memory_status.ullAvailPhys / getsystempagesize ();
spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (sizeof_spi);
if (spi)
{
ret = NtQuerySystemInformation (SystemPagefileInformation, (PVOID) spi,
sizeof_spi, &sizeof_spi);
if (ret == STATUS_INFO_LENGTH_MISMATCH)
{
free (spi);
spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (sizeof_spi);
if (spi)
ret = NtQuerySystemInformation (SystemPagefileInformation,
(PVOID) spi, sizeof_spi, &sizeof_spi);
}
}
if (!spi || ret || (!ret && GetLastError () == ERROR_PROC_NOT_FOUND))
{
debug_printf ("NtQuerySystemInformation(SystemPagefileInformation), "
"status %p", ret);
totalswap = (memory_status.ullTotalPageFile - memory_status.ullTotalPhys)
/ getsystempagesize ();
freeswap = (memory_status.ullAvailPageFile - memory_status.ullTotalPhys)
/ getsystempagesize ();
}
else
{
PSYSTEM_PAGEFILE_INFORMATION spp = spi;
do
{
totalswap += spp->CurrentSize;
freeswap += spp->CurrentSize - spp->TotalUsed;
}
while (spp->NextEntryOffset
&& (spp = (PSYSTEM_PAGEFILE_INFORMATION)
((char *) spp + spp->NextEntryOffset)));
}
if (spi)
free (spi);
info->uptime = (long) uptime;
info->totalram = (unsigned long) totalram;
info->freeram = (unsigned long) freeram;
info->totalswap = (unsigned long) totalswap;
info->freeswap = (unsigned long) freeswap;
info->procs = (unsigned short) pids.npids;
info->mem_unit = (unsigned int) getsystempagesize ();
/* FIXME: unsupported */
info->loads[0] = 0UL;
info->loads[1] = 0UL;
info->loads[2] = 0UL;
info->sharedram = 0UL;
info->bufferram = 0UL;
info->totalhigh = 0UL;
info->freehigh = 0UL;
return 0;
}