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