blob: 1d6634645cd9ae43eac3b1aa7d5651eb60e0435d [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
4#include "src/mark_stack.h"
5
6#include <sys/mman.h>
7
8#include "src/globals.h"
9#include "src/logging.h"
10#include "src/scoped_ptr.h"
11
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