Add allocation and garbage collection infrastructure.
Change-Id: I4b04cdfdf18afb75a7b0df87b509e8156b4a932b
diff --git a/src/mark_stack.cc b/src/mark_stack.cc
new file mode 100644
index 0000000..1d66346
--- /dev/null
+++ b/src/mark_stack.cc
@@ -0,0 +1,48 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+// Author: cshapiro@google.com (Carl Shapiro)
+
+#include "src/mark_stack.h"
+
+#include <sys/mman.h>
+
+#include "src/globals.h"
+#include "src/logging.h"
+#include "src/scoped_ptr.h"
+
+namespace art {
+
+MarkStack* MarkStack::Create(size_t maximum_size) {
+ scoped_ptr<MarkStack> mark_stack(new MarkStack());
+ bool success = mark_stack->Init(maximum_size);
+ if (!success) {
+ return NULL;
+ } else {
+ return mark_stack.release();
+ }
+}
+
+bool MarkStack::Init(size_t maximum_size) {
+ size_t length = 64 * MB;
+ void* addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_PRIVATE, -1, 0);
+ if (addr == MAP_FAILED) {
+ PLOG(ERROR) << "mmap failed";
+ return false;
+ }
+ base_ = reinterpret_cast<const Object**>(addr);
+ limit_ = reinterpret_cast<const Object**>((byte*)addr + length);
+ ptr_ = reinterpret_cast<Object const**>(addr);
+ int result = madvise(addr, length, MADV_DONTNEED);
+ if (result == -1) {
+ PLOG(WARNING) << "madvise failed";
+ }
+ return true;
+}
+
+MarkStack::~MarkStack() {
+ int result = munmap((void*)base_, limit_ - base_);
+ if (result == -1) {
+ PLOG(WARNING) << "munmap failed";
+ }
+}
+
+} // namespace art