blob: c6d77123afc37d906101f2fea3d4551bc1fbb297 [file] [log] [blame]
Carl Shapiro69759ea2011-07-21 18:13:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2// Author: cshapiro@google.com (Carl Shapiro)
3
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07004#include "mark_stack.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -07005
6#include <sys/mman.h>
7
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07008#include "globals.h"
9#include "logging.h"
10#include "scoped_ptr.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -070011
12namespace art {
13
14MarkStack* MarkStack::Create(size_t maximum_size) {
15 scoped_ptr<MarkStack> mark_stack(new MarkStack());
16 bool success = mark_stack->Init(maximum_size);
17 if (!success) {
18 return NULL;
19 } else {
20 return mark_stack.release();
21 }
22}
23
24bool MarkStack::Init(size_t maximum_size) {
25 size_t length = 64 * MB;
26 void* addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_PRIVATE, -1, 0);
27 if (addr == MAP_FAILED) {
28 PLOG(ERROR) << "mmap failed";
29 return false;
30 }
31 base_ = reinterpret_cast<const Object**>(addr);
32 limit_ = reinterpret_cast<const Object**>((byte*)addr + length);
33 ptr_ = reinterpret_cast<Object const**>(addr);
34 int result = madvise(addr, length, MADV_DONTNEED);
35 if (result == -1) {
36 PLOG(WARNING) << "madvise failed";
37 }
38 return true;
39}
40
41MarkStack::~MarkStack() {
42 int result = munmap((void*)base_, limit_ - base_);
43 if (result == -1) {
44 PLOG(WARNING) << "munmap failed";
45 }
46}
47
48} // namespace art