summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYaakov Selkowitz <yselkowi@redhat.com>2011-05-06 18:53:21 +0000
committerYaakov Selkowitz <yselkowi@redhat.com>2011-05-06 18:53:21 +0000
commit2f52cad971308db5625059e07547f1a1159fa520 (patch)
treea8231f945a81fa5b79807397e2ee70a10c5ef11e
parentcc718e26c6549a55a892cebe1d29fd59f4b08651 (diff)
downloadcygnal-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/ChangeLog9
-rw-r--r--winsup/cygwin/cygwin.din1
-rw-r--r--winsup/cygwin/include/cygwin/version.h3
-rw-r--r--winsup/cygwin/include/sys/sysinfo.h19
-rw-r--r--winsup/cygwin/posix.sgml1
-rw-r--r--winsup/cygwin/sysconf.cc99
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;
+}