// Copyright 2011 Google Inc. All Rights Reserved.
// Author: cshapiro@google.com (Carl Shapiro)

#include "mark_stack.h"

#include <sys/mman.h>

#include "globals.h"
#include "logging.h"
#include "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 | MAP_ANONYMOUS, -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
