blob: 19dc1c1aeb64f24aa42fa050865577f2882e70ea [file] [log] [blame]
Carl Shapiro69759ea2011-07-21 18:13:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
Carl Shapiro69759ea2011-07-21 18:13:35 -07002
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07003#include "mark_stack.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -07004
5#include <sys/mman.h>
6
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07007#include "globals.h"
8#include "logging.h"
9#include "scoped_ptr.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -070010
11namespace art {
12
13MarkStack* MarkStack::Create(size_t maximum_size) {
14 scoped_ptr<MarkStack> mark_stack(new MarkStack());
15 bool success = mark_stack->Init(maximum_size);
16 if (!success) {
17 return NULL;
18 } else {
19 return mark_stack.release();
20 }
21}
22
23bool MarkStack::Init(size_t maximum_size) {
24 size_t length = 64 * MB;
Brian Carlstromdb4d5402011-08-09 12:18:28 -070025 mem_map_.reset(MemMap::Map(length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS));
26 if (mem_map_ == NULL) {
Carl Shapiro69759ea2011-07-21 18:13:35 -070027 PLOG(ERROR) << "mmap failed";
28 return false;
29 }
Brian Carlstromdb4d5402011-08-09 12:18:28 -070030 byte* addr = mem_map_->GetAddress();
Carl Shapiro69759ea2011-07-21 18:13:35 -070031 base_ = reinterpret_cast<const Object**>(addr);
Brian Carlstromdb4d5402011-08-09 12:18:28 -070032 limit_ = reinterpret_cast<const Object**>(addr + length);
Carl Shapiro69759ea2011-07-21 18:13:35 -070033 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
Brian Carlstromdb4d5402011-08-09 12:18:28 -070041MarkStack::~MarkStack() {}
Carl Shapiro69759ea2011-07-21 18:13:35 -070042
43} // namespace art