/* * 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() { UniquePtr mark_stack(new MarkStack); mark_stack->Init(); return mark_stack.release(); } void MarkStack::Init() { size_t length = 64 * MB; mem_map_.reset(MemMap::MapAnonymous("dalvik-mark-stack", 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(addr); limit_ = reinterpret_cast(addr + length); Reset(); } void MarkStack::Reset() { DCHECK(mem_map_.get() != NULL); DCHECK(begin_ != NULL); DCHECK(limit_ != NULL); byte* addr = const_cast(reinterpret_cast(begin_)); const size_t length = limit_ - begin_; ptr_ = reinterpret_cast(addr); int result = madvise(addr, length, MADV_DONTNEED); if (result == -1) { PLOG(WARNING) << "madvise failed"; } } MarkStack::~MarkStack() { CHECK(IsEmpty()); } } // namespace art