Removed even more std::cerr and #include <iostream> things.
[oota-llvm.git] / lib / System / Unix / Process.inc
index cccd3ffcb67bbd6f218da5aae5ec62d2ee38fbb1..6b9b2b3ba79385008fe22543f24c4236c0c7c402 100644 (file)
 #ifdef HAVE_MALLOC_H
 #include <malloc.h>
 #endif
+#ifdef HAVE_MALLOC_MALLOC_H
+#include <malloc/malloc.h>
+#endif
 
 //===----------------------------------------------------------------------===//
 //=== WARNING: Implementation here must contain only generic UNIX code that
 //===          is guaranteed to work on *all* UNIX variants.
 //===----------------------------------------------------------------------===//
 
-namespace llvm {
+using namespace llvm;
 using namespace sys;
 
 unsigned 
@@ -43,23 +46,22 @@ Process::GetPageSize()
   return static_cast<unsigned>(page_size);
 }
 
-#if defined(HAVE_SBRK)
-static char* som = reinterpret_cast<char*>(::sbrk(0));
-#endif
-
-uint64_t 
-Process::GetMallocUsage()
-{
+size_t Process::GetMallocUsage() {
 #if defined(HAVE_MALLINFO)
   struct mallinfo mi;
   mi = ::mallinfo();
   return mi.uordblks;
+#elif defined(HAVE_MALLOC_ZONE_STATISTICS) && defined(HAVE_MALLOC_MALLOC_H)
+  malloc_statistics_t Stats;
+  malloc_zone_statistics(malloc_default_zone(), &Stats);
+  return Stats.size_in_use;   // darwin
 #elif defined(HAVE_SBRK)
   // Note this is only an approximation and more closely resembles
   // the value returned by mallinfo in the arena field.
-  char * eom = (char*) sbrk(0);
-  if (eom != ((char*)-1) && som != ((char*)-1))
-    return eom - som;
+  static char *StartOfMemory = reinterpret_cast<char*>(::sbrk(0));
+  char *EndOfMemory = (char*)sbrk(0);
+  if (EndOfMemory != ((char*)-1) && StartOfMemory != ((char*)-1))
+    return EndOfMemory - StartOfMemory;
   else
     return 0;
 #else
@@ -68,12 +70,16 @@ Process::GetMallocUsage()
 #endif
 }
 
-uint64_t
+size_t
 Process::GetTotalMemoryUsage()
 {
 #if defined(HAVE_MALLINFO)
   struct mallinfo mi = ::mallinfo();
   return mi.uordblks + mi.hblkhd;
+#elif defined(HAVE_MALLOC_ZONE_STATISTICS) && defined(HAVE_MALLOC_MALLOC_H)
+  malloc_statistics_t Stats;
+  malloc_zone_statistics(malloc_default_zone(), &Stats);
+  return Stats.size_allocated;   // darwin
 #elif defined(HAVE_GETRUSAGE)
   struct rusage usage;
   ::getrusage(RUSAGE_SELF, &usage);
@@ -109,6 +115,18 @@ Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time,
 #endif
 }
 
+int Process::GetCurrentUserId() {
+  return getuid();
+}
+
+int Process::GetCurrentGroupId() {
+  return getgid();
+}
+
+#ifdef HAVE_MACH_MACH_H
+#include <mach/mach.h>
+#endif
+
 // Some LLVM programs such as bugpoint produce core files as a normal part of
 // their operation. To prevent the disk from filling up, this function
 // does what's necessary to prevent their generation.
@@ -116,9 +134,29 @@ void Process::PreventCoreFiles() {
 #if HAVE_SETRLIMIT
   struct rlimit rlim;
   rlim.rlim_cur = rlim.rlim_max = 0;
-  int res = setrlimit(RLIMIT_CORE, &rlim);
-  if (res != 0)
-    ThrowErrno("Can't prevent core file generation");
+  setrlimit(RLIMIT_CORE, &rlim);
+#endif
+
+#ifdef HAVE_MACH_MACH_H
+  // Disable crash reporting on Mac OS/X.
+
+  // get information about the original set of exception ports for the task
+  mach_msg_type_number_t Count = 0;
+  exception_mask_t OriginalMasks[EXC_TYPES_COUNT];
+  exception_port_t OriginalPorts[EXC_TYPES_COUNT];
+  exception_behavior_t OriginalBehaviors[EXC_TYPES_COUNT];
+  thread_state_flavor_t OriginalFlavors[EXC_TYPES_COUNT];
+  kern_return_t err = 
+    task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, OriginalMasks,
+                             &Count, OriginalPorts, OriginalBehaviors,
+                             OriginalFlavors);
+  if (err == KERN_SUCCESS) {
+    // replace each with MACH_PORT_NULL.
+    for (unsigned i = 0; i != Count; ++i)
+      task_set_exception_ports(mach_task_self(), OriginalMasks[i], 
+                               MACH_PORT_NULL, OriginalBehaviors[i],
+                               OriginalFlavors[i]);
+  }
 #endif
 }
 
@@ -145,6 +183,3 @@ bool Process::StandardErrIsDisplayed() {
   // If we don't have isatty, just return false.
   return false;
 }
-
-}
-// vim: sw=2 smartindent smarttab tw=80 autoindent expandtab