blob: 707b98bb0b2906c415ab4f65aa56b62426bbeef9 [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
Elliott Hughes90a33692011-08-30 13:27:07 -07007#include "UniquePtr.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07008#include "globals.h"
9#include "logging.h"
Elliott Hughesf0605a02012-01-13 20:12:02 -080010#include "utils.h"
Carl Shapiro69759ea2011-07-21 18:13:35 -070011
12namespace art {
13
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070014MarkStack* MarkStack::Create() {
Elliott Hughes90a33692011-08-30 13:27:07 -070015 UniquePtr<MarkStack> mark_stack(new MarkStack);
Jesse Wilson078f9b02011-11-18 17:51:47 -050016 mark_stack->Init();
17 return mark_stack.release();
Carl Shapiro69759ea2011-07-21 18:13:35 -070018}
19
Jesse Wilson078f9b02011-11-18 17:51:47 -050020void MarkStack::Init() {
Carl Shapiro69759ea2011-07-21 18:13:35 -070021 size_t length = 64 * MB;
Brian Carlstrom89521892011-12-07 22:05:07 -080022 mem_map_.reset(MemMap::MapAnonymous("dalvik-mark-stack", NULL, length, PROT_READ | PROT_WRITE));
Elliott Hughesf0605a02012-01-13 20:12:02 -080023 if (mem_map_.get() == NULL) {
24 std::string maps;
25 ReadFileToString("/proc/self/maps", &maps);
26 LOG(FATAL) << "couldn't allocate mark stack\n" << maps;
27 }
Brian Carlstromdb4d5402011-08-09 12:18:28 -070028 byte* addr = mem_map_->GetAddress();
Elliott Hughesf0605a02012-01-13 20:12:02 -080029 CHECK(addr != NULL);
Carl Shapiro69759ea2011-07-21 18:13:35 -070030 base_ = reinterpret_cast<const Object**>(addr);
Brian Carlstromdb4d5402011-08-09 12:18:28 -070031 limit_ = reinterpret_cast<const Object**>(addr + length);
Carl Shapiro69759ea2011-07-21 18:13:35 -070032 ptr_ = reinterpret_cast<Object const**>(addr);
33 int result = madvise(addr, length, MADV_DONTNEED);
34 if (result == -1) {
35 PLOG(WARNING) << "madvise failed";
36 }
Carl Shapiro69759ea2011-07-21 18:13:35 -070037}
38
Elliott Hughes28a452a2012-01-17 20:39:44 -080039MarkStack::~MarkStack() {
40 CHECK(IsEmpty());
41}
Carl Shapiro69759ea2011-07-21 18:13:35 -070042
43} // namespace art