| /* |
| * 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<MarkStack> 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<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 |