* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Nathan Binkert
*/
-#include <ctype.h>
-#include <errno.h>
-#include <math.h>
#include <unistd.h>
-#include <stdio.h>
+#ifdef __APPLE__
+#include <mach/mach_init.h>
+#include <mach/shared_region.h>
+#include <mach/task.h>
+
+#endif
+
+#include "base/hostinfo.hh"
+
+#include <cctype>
+#include <cerrno>
+#include <cmath>
+#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
-#include "base/misc.hh"
-#include "sim/host.hh"
+#include "base/logging.hh"
+#include "base/str.hh"
+#include "base/types.hh"
using namespace std;
}
uint64_t
-procInfo(char *filename, char *target)
+procInfo(const char *filename, const char *target)
{
int done = 0;
char line[80];
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);
}
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
+}