1cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi/* 2cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * Copyright (C) 2013 The Android Open Source Project 3cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * 4cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * Licensed under the Apache License, Version 2.0 (the "License"); 5cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * you may not use this file except in compliance with the License. 6cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * You may obtain a copy of the License at 7cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * 8cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * http://www.apache.org/licenses/LICENSE-2.0 9cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * 10cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * Unless required by applicable law or agreed to in writing, software 11cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * distributed under the License is distributed on an "AS IS" BASIS, 12cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * See the License for the specific language governing permissions and 14cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi * limitations under the License. 15cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi */ 16cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 17cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi#ifndef ART_RUNTIME_GC_SPACE_ROSALLOC_SPACE_H_ 18cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi#define ART_RUNTIME_GC_SPACE_ROSALLOC_SPACE_H_ 19cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 20cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi#include "gc/allocator/rosalloc.h" 21cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi#include "malloc_space.h" 22cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi#include "space.h" 23cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 24cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchinamespace art { 25cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchinamespace gc { 26cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 27cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchinamespace collector { 282ffb703bf431d74326c88266b4ddaf225eb3c6adIgor Murashkinclass MarkSweep; 29cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi} // namespace collector 30cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 31cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchinamespace space { 32cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 336fac447555dc94a935b78198479cce645c837b89Ian Rogers// An alloc space implemented using a runs-of-slots memory allocator. Not final as may be 341e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov// overridden by a MemoryToolMallocSpace. 35cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass RosAllocSpace : public MallocSpace { 36cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi public: 37cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi // Create a RosAllocSpace with the requested sizes. The requested 38cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi // base address is not guaranteed to be granted, if it is required, 39cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi // the caller should call Begin on the returned space to confirm the 40cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi // request was granted. 41cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi static RosAllocSpace* Create(const std::string& name, size_t initial_size, size_t growth_limit, 4213735955f39b3b304c37d2b2840663c131262c18Ian Rogers size_t capacity, uint8_t* requested_begin, bool low_memory_mode, 4331f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier bool can_move_objects); 44e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier static RosAllocSpace* CreateFromMemMap(MemMap* mem_map, const std::string& name, 45e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier size_t starting_size, size_t initial_size, 46e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier size_t growth_limit, size_t capacity, 4731f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier bool low_memory_mode, bool can_move_objects); 48cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 496fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Object* AllocWithGrowth(Thread* self, size_t num_bytes, size_t* bytes_allocated, 504460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated) 5190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier OVERRIDE REQUIRES(!lock_); 526fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Object* Alloc(Thread* self, size_t num_bytes, size_t* bytes_allocated, 534460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated) OVERRIDE { 544460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return AllocNonvirtual(self, num_bytes, bytes_allocated, usable_size, 554460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi bytes_tl_bulk_allocated); 566fac447555dc94a935b78198479cce645c837b89Ian Rogers } 570651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier mirror::Object* AllocThreadUnsafe(Thread* self, size_t num_bytes, size_t* bytes_allocated, 584460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated) 5990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier OVERRIDE REQUIRES(Locks::mutator_lock_) { 604460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return AllocNonvirtualThreadUnsafe(self, num_bytes, bytes_allocated, usable_size, 614460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi bytes_tl_bulk_allocated); 620651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier } 636fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t AllocationSize(mirror::Object* obj, size_t* usable_size) OVERRIDE { 644460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return AllocationSizeNonvirtual<true>(obj, usable_size); 656fac447555dc94a935b78198479cce645c837b89Ian Rogers } 666fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t Free(Thread* self, mirror::Object* ptr) OVERRIDE 67bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_); 686fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) OVERRIDE 69bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_); 70cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 716fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Object* AllocNonvirtual(Thread* self, size_t num_bytes, size_t* bytes_allocated, 724460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated) { 736fac447555dc94a935b78198479cce645c837b89Ian Rogers // RosAlloc zeroes memory internally. 744460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return AllocCommon(self, num_bytes, bytes_allocated, usable_size, 754460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi bytes_tl_bulk_allocated); 76cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 770651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier mirror::Object* AllocNonvirtualThreadUnsafe(Thread* self, size_t num_bytes, 784460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* bytes_allocated, size_t* usable_size, 794460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* bytes_tl_bulk_allocated) { 800651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier // RosAlloc zeroes memory internally. Pass in false for thread unsafe. 814460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return AllocCommon<false>(self, num_bytes, bytes_allocated, usable_size, 824460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi bytes_tl_bulk_allocated); 830651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier } 84cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 854460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // Returns true if the given allocation request can be allocated in 864460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // an existing thread local run without allocating a new run. 874460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi ALWAYS_INLINE bool CanAllocThreadLocal(Thread* self, size_t num_bytes); 884460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // Allocate the given allocation request in an existing thread local 894460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // run without allocating a new run. 904460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi ALWAYS_INLINE mirror::Object* AllocThreadLocal(Thread* self, size_t num_bytes, 914460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* bytes_allocated); 924460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t MaxBytesBulkAllocatedFor(size_t num_bytes) OVERRIDE { 934460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return MaxBytesBulkAllocatedForNonvirtual(num_bytes); 944460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi } 954460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi ALWAYS_INLINE size_t MaxBytesBulkAllocatedForNonvirtual(size_t num_bytes); 964460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi 976fac447555dc94a935b78198479cce645c837b89Ian Rogers // TODO: NO_THREAD_SAFETY_ANALYSIS because SizeOf() requires that mutator_lock is held. 981e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov template<bool kMaybeIsRunningOnMemoryTool> 996fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t AllocationSizeNonvirtual(mirror::Object* obj, size_t* usable_size) 1006fac447555dc94a935b78198479cce645c837b89Ian Rogers NO_THREAD_SAFETY_ANALYSIS; 1016fac447555dc94a935b78198479cce645c837b89Ian Rogers 1026fac447555dc94a935b78198479cce645c837b89Ian Rogers allocator::RosAlloc* GetRosAlloc() const { 103cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return rosalloc_; 104cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 105cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 1066fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t Trim() OVERRIDE; 10790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void Walk(WalkCallback callback, void* arg) OVERRIDE REQUIRES(!lock_); 1086fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t GetFootprint() OVERRIDE; 1096fac447555dc94a935b78198479cce645c837b89Ian Rogers size_t GetFootprintLimit() OVERRIDE; 1106fac447555dc94a935b78198479cce645c837b89Ian Rogers void SetFootprintLimit(size_t limit) OVERRIDE; 111cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 1126fac447555dc94a935b78198479cce645c837b89Ian Rogers void Clear() OVERRIDE; 11331f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier 114d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe MallocSpace* CreateInstance(MemMap* mem_map, const std::string& name, void* allocator, 11513735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* begin, uint8_t* end, uint8_t* limit, size_t growth_limit, 11631f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier bool can_move_objects) OVERRIDE; 117cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 1186fac447555dc94a935b78198479cce645c837b89Ian Rogers uint64_t GetBytesAllocated() OVERRIDE; 1196fac447555dc94a935b78198479cce645c837b89Ian Rogers uint64_t GetObjectsAllocated() OVERRIDE; 120cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 1214460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t RevokeThreadLocalBuffers(Thread* thread); 1224460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t RevokeAllThreadLocalBuffers(); 12368d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers void AssertThreadLocalBuffersAreRevoked(Thread* thread); 124c93c530efc175954160c3834c93961a1a946a35aHiroshi Yamauchi void AssertAllThreadLocalBuffersAreRevoked(); 125cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 126cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi // Returns the class of a recently freed object. 127cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi mirror::Class* FindRecentFreedObject(const mirror::Object* obj); 128cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 1296fac447555dc94a935b78198479cce645c837b89Ian Rogers bool IsRosAllocSpace() const OVERRIDE { 130cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return true; 131cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 1326fac447555dc94a935b78198479cce645c837b89Ian Rogers 1336fac447555dc94a935b78198479cce645c837b89Ian Rogers RosAllocSpace* AsRosAllocSpace() OVERRIDE { 134cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return this; 135cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 136cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 13790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void Verify() REQUIRES(Locks::mutator_lock_) { 138a4adbfd44032d70e166e6f18096bbbed05a990baHiroshi Yamauchi rosalloc_->Verify(); 139a4adbfd44032d70e166e6f18096bbbed05a990baHiroshi Yamauchi } 140a4adbfd44032d70e166e6f18096bbbed05a990baHiroshi Yamauchi 141661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier virtual ~RosAllocSpace(); 142661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier 143654dd48e2230e16bfaa225decce72b52642e2f78Hiroshi Yamauchi void LogFragmentationAllocFailure(std::ostream& os, size_t failed_alloc_bytes) OVERRIDE { 144654dd48e2230e16bfaa225decce72b52642e2f78Hiroshi Yamauchi rosalloc_->LogFragmentationAllocFailure(os, failed_alloc_bytes); 145654dd48e2230e16bfaa225decce72b52642e2f78Hiroshi Yamauchi } 146654dd48e2230e16bfaa225decce72b52642e2f78Hiroshi Yamauchi 147565c2d9bce43c430d4267c82f5702160d971e712Hiroshi Yamauchi void DumpStats(std::ostream& os); 148565c2d9bce43c430d4267c82f5702160d971e712Hiroshi Yamauchi 149cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi protected: 150d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe RosAllocSpace(MemMap* mem_map, size_t initial_size, const std::string& name, 151d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe allocator::RosAlloc* rosalloc, uint8_t* begin, uint8_t* end, uint8_t* limit, 152d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe size_t growth_limit, bool can_move_objects, size_t starting_size, 153d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe bool low_memory_mode); 154cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 155cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi private: 1560651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier template<bool kThreadSafe = true> 1576fac447555dc94a935b78198479cce645c837b89Ian Rogers mirror::Object* AllocCommon(Thread* self, size_t num_bytes, size_t* bytes_allocated, 1584460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated); 159cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 1606fac447555dc94a935b78198479cce645c837b89Ian Rogers void* CreateAllocator(void* base, size_t morecore_start, size_t initial_size, 16126d69ffc0ebc98fbc5f316d8cd3ee6ba5b2001acHiroshi Yamauchi size_t maximum_size, bool low_memory_mode) OVERRIDE { 162d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe return CreateRosAlloc(base, morecore_start, initial_size, maximum_size, low_memory_mode, 1631e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov RUNNING_ON_MEMORY_TOOL != 0); 164cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 165573f7d2d68e1838a0485e6b40d90c967526e00c2Hiroshi Yamauchi static allocator::RosAlloc* CreateRosAlloc(void* base, size_t morecore_start, size_t initial_size, 166d7576328811e5103e99d31f834a857522cc1463fAndreas Gampe size_t maximum_size, bool low_memory_mode, 1671e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov bool running_on_memory_tool); 168cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 169cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi void InspectAllRosAlloc(void (*callback)(void *start, void *end, size_t num_bytes, void* callback_arg), 1701cd53dbb2163f18b689d2a65cf9c6bdcdb01b407Hiroshi Yamauchi void* arg, bool do_null_callback_at_end) 17190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier REQUIRES(!Locks::runtime_shutdown_lock_, !Locks::thread_list_lock_); 1721cd53dbb2163f18b689d2a65cf9c6bdcdb01b407Hiroshi Yamauchi void InspectAllRosAllocWithSuspendAll( 1731cd53dbb2163f18b689d2a65cf9c6bdcdb01b407Hiroshi Yamauchi void (*callback)(void *start, void *end, size_t num_bytes, void* callback_arg), 1741cd53dbb2163f18b689d2a65cf9c6bdcdb01b407Hiroshi Yamauchi void* arg, bool do_null_callback_at_end) 17590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier REQUIRES(!Locks::runtime_shutdown_lock_, !Locks::thread_list_lock_); 176cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 177cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi // Underlying rosalloc. 17831f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier allocator::RosAlloc* rosalloc_; 17931f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier 18031f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier const bool low_memory_mode_; 1814ce1f00cc74867188347e463f4a5ecb9fe55cde5Hiroshi Yamauchi 182cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi friend class collector::MarkSweep; 183cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 184cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi DISALLOW_COPY_AND_ASSIGN(RosAllocSpace); 185cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi}; 186cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 187cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi} // namespace space 188cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi} // namespace gc 189cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi} // namespace art 190cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 191cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi#endif // ART_RUNTIME_GC_SPACE_ROSALLOC_SPACE_H_ 192