Clock: Move the clock and related functions to ClockedObject
[gem5.git] / src / base / hostinfo.cc
index a7c93e7125f2378b5537b7d0e76e90f1e81f871f..15413de2a8069fcc00b422b0724c984f91a47a5f 100644 (file)
  * Authors: Nathan Binkert
  */
 
-#include <ctype.h>
-#include <errno.h>
-#include <math.h>
 #include <unistd.h>
 
+#ifdef __APPLE__
+#include <mach/mach_init.h>
+#include <mach/shared_region.h>
+#include <mach/task.h>
+#endif
+
+#include <cctype>
+#include <cerrno>
+#include <cmath>
+#include <cstdio>
 #include <cstdlib>
 #include <cstring>
 #include <string>
 
 #include "base/misc.hh"
-#include "sim/host.hh"
+#include "base/str.hh"
+#include "base/types.hh"
 
 using namespace std;
 
@@ -59,7 +67,7 @@ hostname()
 }
 
 uint64_t
-procInfo(char *filename, char *target)
+procInfo(const char *filename, const char *target)
 {
     int  done = 0;
     char line[80];
@@ -70,7 +78,7 @@ procInfo(char *filename, char *target)
 
     while (fp && !feof(fp) && !done) {
         if (fgets(line, 80, fp)) {
-            if (strncmp(line, target, strlen(target)) == 0) {
+            if (startswith(line, target)) {
                 snprintf(format, sizeof(format), "%s %%ld", target);
                 sscanf(line, format, &usage);
 
@@ -81,7 +89,31 @@ procInfo(char *filename, char *target)
     }
 
     if (fp)
-      fclose(fp);
+        fclose(fp);
 
     return 0;
 }
+
+uint64_t
+memUsage()
+{
+// For the Mach-based Darwin kernel, use the task_info of the self task
+#ifdef __APPLE__
+    struct task_basic_info t_info;
+    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
+
+    if (KERN_SUCCESS != task_info(mach_task_self(),
+                                  TASK_BASIC_INFO, (task_info_t)&t_info,
+                                  &t_info_count)) {
+        return 0;
+    }
+
+    // Mimic Darwin's implementation of top and subtract
+    // SHARED_REGION_SIZE from the tasks virtual size to account for the
+    // shared memory submap that is incorporated into every process.
+    return (t_info.virtual_size - SHARED_REGION_SIZE) / 1024;
+#else
+    // Linux implementation
+    return procInfo("/proc/self/status", "VmSize:");
+#endif
+}