diff options
author | Yaakov Selkowitz <yselkowi@redhat.com> | 2011-05-06 18:53:21 +0000 |
---|---|---|
committer | Yaakov Selkowitz <yselkowi@redhat.com> | 2011-05-06 18:53:21 +0000 |
commit | 2f52cad971308db5625059e07547f1a1159fa520 (patch) | |
tree | a8231f945a81fa5b79807397e2ee70a10c5ef11e | |
parent | cc718e26c6549a55a892cebe1d29fd59f4b08651 (diff) | |
download | cygnal-2f52cad971308db5625059e07547f1a1159fa520.tar.gz cygnal-2f52cad971308db5625059e07547f1a1159fa520.tar.bz2 cygnal-2f52cad971308db5625059e07547f1a1159fa520.zip |
* 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.
-rw-r--r-- | winsup/cygwin/ChangeLog | 9 | ||||
-rw-r--r-- | winsup/cygwin/cygwin.din | 1 | ||||
-rw-r--r-- | winsup/cygwin/include/cygwin/version.h | 3 | ||||
-rw-r--r-- | winsup/cygwin/include/sys/sysinfo.h | 19 | ||||
-rw-r--r-- | winsup/cygwin/posix.sgml | 1 | ||||
-rw-r--r-- | winsup/cygwin/sysconf.cc | 99 |
6 files changed, 129 insertions, 3 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 827083a33..7a9741690 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2011-05-06 Yaakov Selkowitz <yselkowitz@users.sourceforge.net> + + * 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. + 2011-05-06 Corinna Vinschen <corinna@vinschen.de> * libc/minires-os-if.c (get_dns_info): Drop printing uninitialized diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 36a1fadad..e918b08ad 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -1682,6 +1682,7 @@ symlinkat SIGFE sync SIGFE sysconf SIGFE _sysconf = sysconf SIGFE +sysinfo SIGFE syslog SIGFE _syslog = syslog SIGFE system SIGFE diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 7a2974945..ef92244ad 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -408,12 +408,13 @@ details. */ 241: Export pthread_attr_getstack, pthread_attr_getstackaddr, pthread_getattr_np. 242: Export psiginfo, psignal, sys_siglist. + 243: Export sysinfo. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 242 +#define CYGWIN_VERSION_API_MINOR 243 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/sys/sysinfo.h b/winsup/cygwin/include/sys/sysinfo.h index 1e24c860a..693e7b593 100644 --- a/winsup/cygwin/include/sys/sysinfo.h +++ b/winsup/cygwin/include/sys/sysinfo.h @@ -1,6 +1,6 @@ /* sys/sysinfo.h - Copyright 2009 Red Hat, Inc. + Copyright 2009, 2011 Red Hat, Inc. This file is part of Cygwin. @@ -17,6 +17,23 @@ details. */ __BEGIN_DECLS +struct sysinfo { + long uptime; /* Seconds since boot */ + unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ + unsigned long totalram; /* Total usable main memory size */ + unsigned long freeram; /* Available memory size */ + unsigned long sharedram; /* Amount of shared memory */ + unsigned long bufferram; /* Memory used by buffers */ + unsigned long totalswap; /* Total swap space size */ + unsigned long freeswap; /* swap space still available */ + unsigned short procs; /* Number of current processes */ + unsigned long totalhigh; /* Total high memory size */ + unsigned long freehigh; /* Available high memory size */ + unsigned int mem_unit; /* Memory unit size in bytes */ + char __unused[10]; /* Pads structure to 64 bytes */ +}; + +extern int sysinfo (struct sysinfo *); extern int get_nprocs_conf (void); extern int get_nprocs (void); extern long get_phys_pages (void); diff --git a/winsup/cygwin/posix.sgml b/winsup/cygwin/posix.sgml index 640cd63c6..cdc6a9382 100644 --- a/winsup/cygwin/posix.sgml +++ b/winsup/cygwin/posix.sgml @@ -1124,6 +1124,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para> removexattr setxattr strchrnul + sysinfo tdestroy timegm timelocal diff --git a/winsup/cygwin/sysconf.cc b/winsup/cygwin/sysconf.cc index 8d4febaa3..de84dbc3e 100644 --- a/winsup/cygwin/sysconf.cc +++ b/winsup/cygwin/sysconf.cc @@ -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; +} |