blob: c9507cb4e7be8eee1cb3005e2eaa11b74905c865 [file] [log] [blame]
Reid Spencer27dafe12004-09-11 04:56:56 +00001//===- Unix/Process.cpp - Unix Process Implementation --------- -*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Reid Spencer and is distributed under the
6// University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file provides the generic Unix implementation of the Process class.
11//
12//===----------------------------------------------------------------------===//
13
Reid Spencer721d9aa2004-12-20 00:59:28 +000014#include "Unix.h"
15#ifdef HAVE_SYS_TIME_H
16#include <sys/time.h>
17#endif
18#ifdef HAVE_SYS_RESOURCE_H
19#include <sys/resource.h>
20#endif
21#ifdef HAVE_MALLOC_H
22#include <malloc.h>
23#endif
Reid Spencer27dafe12004-09-11 04:56:56 +000024
25//===----------------------------------------------------------------------===//
26//=== WARNING: Implementation here must contain only generic UNIX code that
27//=== is guaranteed to work on *all* UNIX variants.
28//===----------------------------------------------------------------------===//
29
30namespace llvm {
31using namespace sys;
32
33unsigned
Reid Spencer721d9aa2004-12-20 00:59:28 +000034Process::GetPageSize()
35{
36#if defined(HAVE_GETPAGESIZE)
37 static const int page_size = ::getpagesize();
38#elif defined(HAVE_SYSCONF)
39 static long page_size = ::sysconf(_SC_PAGE_SIZE);
40#else
41#warning Cannot get the page size on this machine
42#endif
Reid Spencer27dafe12004-09-11 04:56:56 +000043 return static_cast<unsigned>(page_size);
44}
45
Reid Spencer721d9aa2004-12-20 00:59:28 +000046#if defined(HAVE_SBRK)
47static char* som = reinterpret_cast<char*>(::sbrk(0));
48#endif
49
50uint64_t
51Process::GetMallocUsage()
52{
Reid Spencerbc1ee842004-12-20 16:06:44 +000053#if defined(HAVE_MALLINFO)
Reid Spencer721d9aa2004-12-20 00:59:28 +000054 struct mallinfo mi;
55 mi = ::mallinfo();
56 return mi.uordblks;
Reid Spencerbc1ee842004-12-20 16:06:44 +000057#elif defined(HAVE_SBRK)
Reid Spencer721d9aa2004-12-20 00:59:28 +000058 // Note this is only an approximation and more closely resembles
59 // the value returned by mallinfo in the arena field.
60 char * eom = sbrk(0);
61 if (eom != ((char*)-1) && som != ((char*)-1))
62 return eom - som;
63 else
64 return 0;
65#else
66#warning Cannot get malloc info on this platform
67 return 0;
68#endif
69}
70
71uint64_t
72Process::GetTotalMemoryUsage()
73{
Reid Spencerbc1ee842004-12-20 16:06:44 +000074#if defined(HAVE_MALLINFO)
Reid Spencer721d9aa2004-12-20 00:59:28 +000075 struct mallinfo mi = ::mallinfo();
76 return mi.uordblks + mi.hblkhd;
77#else
78#warning Cannot get total memory size on this platform
79 return 0;
80#endif
81}
82
83void
84Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time,
85 TimeValue& sys_time)
86{
87 elapsed = TimeValue::now();
Reid Spencerbc1ee842004-12-20 16:06:44 +000088#if defined(HAVE_GETRUSAGE)
Reid Spencer721d9aa2004-12-20 00:59:28 +000089 struct rusage usage;
90 ::getrusage(RUSAGE_SELF, &usage);
91 user_time.seconds( usage.ru_utime.tv_sec );
92 user_time.microseconds( usage.ru_utime.tv_usec );
93 sys_time.seconds( usage.ru_stime.tv_sec );
94 sys_time.microseconds( usage.ru_stime.tv_usec );
95#else
96#warning Cannot get usage times on this platform
97 user_time.seconds(0);
98 user_time.microseconds(0);
99 sys_time.seconds(0);
100 sys_time.microseconds(0);
101#endif
102}
103
104
Reid Spencer27dafe12004-09-11 04:56:56 +0000105}
106// vim: sw=2 smartindent smarttab tw=80 autoindent expandtab