diff --git a/lib/System/Unix/Process.cpp b/lib/System/Unix/Process.cpp index bd595110889..654390432d4 100644 --- a/lib/System/Unix/Process.cpp +++ b/lib/System/Unix/Process.cpp @@ -11,7 +11,16 @@ // //===----------------------------------------------------------------------===// -#include +#include "Unix.h" +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#ifdef HAVE_MALLOC_H +#include +#endif //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only generic UNIX code that @@ -22,13 +31,76 @@ namespace llvm { using namespace sys; unsigned -Process::GetPageSize() { - // NOTE: The getpagesize function doesn't exist in POSIX 1003.1 and is - // "deprecated" in SUSv2. Platforms including this implementation should - // consider sysconf(_SC_PAGE_SIZE) if its available. - static const int page_size = getpagesize(); +Process::GetPageSize() +{ +#if defined(HAVE_GETPAGESIZE) + static const int page_size = ::getpagesize(); +#elif defined(HAVE_SYSCONF) + static long page_size = ::sysconf(_SC_PAGE_SIZE); +#else +#warning Cannot get the page size on this machine +#endif return static_cast(page_size); } +#if defined(HAVE_SBRK) +static char* som = reinterpret_cast(::sbrk(0)); +#endif + +uint64_t +Process::GetMallocUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi; + mi = ::mallinfo(); + return mi.uordblks; +#elif HAVE_SBRK + // Note this is only an approximation and more closely resembles + // the value returned by mallinfo in the arena field. + char * eom = sbrk(0); + if (eom != ((char*)-1) && som != ((char*)-1)) + return eom - som; + else + return 0; +#else +#warning Cannot get malloc info on this platform + return 0; +#endif +} + +uint64_t +Process::GetTotalMemoryUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi = ::mallinfo(); + return mi.uordblks + mi.hblkhd; +#else +#warning Cannot get total memory size on this platform + return 0; +#endif +} + +void +Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time, + TimeValue& sys_time) +{ + elapsed = TimeValue::now(); +#ifdef HAVE_GETRUSAGE + struct rusage usage; + ::getrusage(RUSAGE_SELF, &usage); + user_time.seconds( usage.ru_utime.tv_sec ); + user_time.microseconds( usage.ru_utime.tv_usec ); + sys_time.seconds( usage.ru_stime.tv_sec ); + sys_time.microseconds( usage.ru_stime.tv_usec ); +#else +#warning Cannot get usage times on this platform + user_time.seconds(0); + user_time.microseconds(0); + sys_time.seconds(0); + sys_time.microseconds(0); +#endif +} + + } // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab diff --git a/lib/System/Unix/Process.inc b/lib/System/Unix/Process.inc index bd595110889..654390432d4 100644 --- a/lib/System/Unix/Process.inc +++ b/lib/System/Unix/Process.inc @@ -11,7 +11,16 @@ // //===----------------------------------------------------------------------===// -#include +#include "Unix.h" +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#ifdef HAVE_MALLOC_H +#include +#endif //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only generic UNIX code that @@ -22,13 +31,76 @@ namespace llvm { using namespace sys; unsigned -Process::GetPageSize() { - // NOTE: The getpagesize function doesn't exist in POSIX 1003.1 and is - // "deprecated" in SUSv2. Platforms including this implementation should - // consider sysconf(_SC_PAGE_SIZE) if its available. - static const int page_size = getpagesize(); +Process::GetPageSize() +{ +#if defined(HAVE_GETPAGESIZE) + static const int page_size = ::getpagesize(); +#elif defined(HAVE_SYSCONF) + static long page_size = ::sysconf(_SC_PAGE_SIZE); +#else +#warning Cannot get the page size on this machine +#endif return static_cast(page_size); } +#if defined(HAVE_SBRK) +static char* som = reinterpret_cast(::sbrk(0)); +#endif + +uint64_t +Process::GetMallocUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi; + mi = ::mallinfo(); + return mi.uordblks; +#elif HAVE_SBRK + // Note this is only an approximation and more closely resembles + // the value returned by mallinfo in the arena field. + char * eom = sbrk(0); + if (eom != ((char*)-1) && som != ((char*)-1)) + return eom - som; + else + return 0; +#else +#warning Cannot get malloc info on this platform + return 0; +#endif +} + +uint64_t +Process::GetTotalMemoryUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi = ::mallinfo(); + return mi.uordblks + mi.hblkhd; +#else +#warning Cannot get total memory size on this platform + return 0; +#endif +} + +void +Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time, + TimeValue& sys_time) +{ + elapsed = TimeValue::now(); +#ifdef HAVE_GETRUSAGE + struct rusage usage; + ::getrusage(RUSAGE_SELF, &usage); + user_time.seconds( usage.ru_utime.tv_sec ); + user_time.microseconds( usage.ru_utime.tv_usec ); + sys_time.seconds( usage.ru_stime.tv_sec ); + sys_time.microseconds( usage.ru_stime.tv_usec ); +#else +#warning Cannot get usage times on this platform + user_time.seconds(0); + user_time.microseconds(0); + sys_time.seconds(0); + sys_time.microseconds(0); +#endif +} + + } // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab diff --git a/lib/System/Win32/Process.cpp b/lib/System/Win32/Process.cpp index 5a4b4f0dbbb..b4ed4b79461 100644 --- a/lib/System/Win32/Process.cpp +++ b/lib/System/Win32/Process.cpp @@ -41,5 +41,48 @@ Process::GetPageSize() { return PageSize; } +void* +uint64_t +Process::GetMallocUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi = ::mallinfo(); + return mi.uordblks; +#warning Cannot get malloc info on this platform + return 0; +#endif +} + +uint64_t +Process::GetTotalMemoryUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi = ::mallinfo(); + return mi.uordblks + mi.hblkhd +#else +#warning Cannot get total memory size on this platform + return 0; +#endif +} + +void +Process::GetTimeUsage( + TimeValue& elapsed, TimeValue& user_time, TimeValue& sys_time) +{ + elapsed = TimeValue::now(); + + unsigned __int64 ProcCreate, ProcExit, KernelTime, UserTime; + GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate, + (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, + (FILETIME*)&UserTime + ); + + // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) + user_time.seconds( UserTime / 10000000 ); + user_time.nanoseconds( (UserTime % 10000000) * 100 ); + sys_time.seconds( KernelTime / 10000000 ); + user_time.nanoseconds( (UserTime % 10000000) * 100 ); +} + } // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab diff --git a/lib/System/Win32/Process.inc b/lib/System/Win32/Process.inc index 5a4b4f0dbbb..b4ed4b79461 100644 --- a/lib/System/Win32/Process.inc +++ b/lib/System/Win32/Process.inc @@ -41,5 +41,48 @@ Process::GetPageSize() { return PageSize; } +void* +uint64_t +Process::GetMallocUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi = ::mallinfo(); + return mi.uordblks; +#warning Cannot get malloc info on this platform + return 0; +#endif +} + +uint64_t +Process::GetTotalMemoryUsage() +{ +#ifdef HAVE_MALLINFO + struct mallinfo mi = ::mallinfo(); + return mi.uordblks + mi.hblkhd +#else +#warning Cannot get total memory size on this platform + return 0; +#endif +} + +void +Process::GetTimeUsage( + TimeValue& elapsed, TimeValue& user_time, TimeValue& sys_time) +{ + elapsed = TimeValue::now(); + + unsigned __int64 ProcCreate, ProcExit, KernelTime, UserTime; + GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate, + (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, + (FILETIME*)&UserTime + ); + + // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) + user_time.seconds( UserTime / 10000000 ); + user_time.nanoseconds( (UserTime % 10000000) * 100 ); + sys_time.seconds( KernelTime / 10000000 ); + user_time.nanoseconds( (UserTime % 10000000) * 100 ); +} + } // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab