/* sys/sysinfo.h
- Copyright 2009 Red Hat, Inc.
+ Copyright 2009, 2011 Red Hat, Inc.
This file is part of Cygwin.
__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);
/* 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.
#include "path.h"
#include "fhandler.h"
#include "dtable.h"
+#include "pinfo.h"
#include "ntdll.h"
static long
{
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;
+}