bump_pointer_space-inl.h revision 55b2764c23776a7eba91d6514a4ad2cbc95e0fd0
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ART_RUNTIME_GC_SPACE_BUMP_POINTER_SPACE_INL_H_ 18#define ART_RUNTIME_GC_SPACE_BUMP_POINTER_SPACE_INL_H_ 19 20#include "bump_pointer_space.h" 21 22namespace art { 23namespace gc { 24namespace space { 25 26inline mirror::Object* BumpPointerSpace::AllocNonvirtualWithoutAccounting(size_t num_bytes) { 27 DCHECK(IsAligned<kAlignment>(num_bytes)); 28 byte* old_end; 29 byte* new_end; 30 do { 31 old_end = end_; 32 new_end = old_end + num_bytes; 33 // If there is no more room in the region, we are out of memory. 34 if (UNLIKELY(new_end > growth_end_)) { 35 return nullptr; 36 } 37 } while (!__sync_bool_compare_and_swap(reinterpret_cast<volatile intptr_t*>(&end_), 38 reinterpret_cast<intptr_t>(old_end), 39 reinterpret_cast<intptr_t>(new_end))); 40 return reinterpret_cast<mirror::Object*>(old_end); 41} 42 43inline mirror::Object* BumpPointerSpace::AllocNonvirtual(size_t num_bytes) { 44 mirror::Object* ret = AllocNonvirtualWithoutAccounting(num_bytes); 45 if (ret != nullptr) { 46 objects_allocated_.FetchAndAdd(1); 47 bytes_allocated_.FetchAndAdd(num_bytes); 48 } 49 return ret; 50} 51 52} // namespace space 53} // namespace gc 54} // namespace art 55 56#endif // ART_RUNTIME_GC_SPACE_BUMP_POINTER_SPACE_INL_H_ 57