blob: 2f188984dd5776cc6d4890532814299192875119 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mark_stack.h"
#include "globals.h"
#include "logging.h"
#include "UniquePtr.h"
#include "utils.h"
namespace art {
MarkStack* MarkStack::Create(const std::string& name, size_t length) {
UniquePtr<MarkStack> mark_stack(new MarkStack(name));
mark_stack->Init(length);
return mark_stack.release();
}
void MarkStack::Init(size_t length) {
mem_map_.reset(MemMap::MapAnonymous(name_.c_str(), NULL, length, PROT_READ | PROT_WRITE));
if (mem_map_.get() == NULL) {
std::string maps;
ReadFileToString("/proc/self/maps", &maps);
LOG(FATAL) << "couldn't allocate mark stack\n" << maps;
}
byte* addr = mem_map_->Begin();
CHECK(addr != NULL);
begin_ = reinterpret_cast<const Object**>(addr);
limit_ = reinterpret_cast<const Object**>(addr + length);
Reset();
}
void MarkStack::Reset() {
DCHECK(mem_map_.get() != NULL);
DCHECK(begin_ != NULL);
DCHECK(limit_ != NULL);
byte* addr = const_cast<byte*>(reinterpret_cast<const byte*>(begin_));
const size_t length = limit_ - begin_;
ptr_ = reinterpret_cast<const Object**>(addr);
int result = madvise(addr, length, MADV_DONTNEED);
if (result == -1) {
PLOG(WARNING) << "madvise failed";
}
}
MarkStack::~MarkStack() {
CHECK(IsEmpty());
}
} // namespace art