space.h revision 1d54e73444e017d3a65234e0f193846f3e27472b
11d54e73444e017d3a65234e0f193846f3e27472bIan Rogers/* 21d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Copyright (C) 2011 The Android Open Source Project 31d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * 41d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 51d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * you may not use this file except in compliance with the License. 61d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * You may obtain a copy of the License at 71d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * 81d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 91d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * 101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Unless required by applicable law or agreed to in writing, software 111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * See the License for the specific language governing permissions and 141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * limitations under the License. 151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers */ 161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#ifndef ART_SRC_GC_SPACE_SPACE_H_ 181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#define ART_SRC_GC_SPACE_SPACE_H_ 191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include <string> 211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "UniquePtr.h" 231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/macros.h" 241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/mutex.h" 251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/space_bitmap.h" 261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "globals.h" 271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "image.h" 281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "mem_map.h" 291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 301d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace art { 311d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace mirror { 321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers class Object; 331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace mirror 341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 351d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 371d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace accounting { 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers class SpaceBitmap; 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace accounting 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Heap; 421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 431d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space { 441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 451d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass DlMallocSpace; 461d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ImageSpace; 471d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass LargeObjectSpace; 481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 491d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstatic const bool kDebugSpaces = kIsDebugBuild; 501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// See Space::GetGcRetentionPolicy. 521d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum GcRetentionPolicy { 531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Objects are retained forever with this policy for a space. 541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyNeverCollect, 551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Every GC cycle will attempt to collect objects in this space. 561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyAlwaysCollect, 571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Objects will be considered for collection only in "full" GC cycles, ie faster partial 581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // collections won't scan these areas such as the Zygote. 591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyFullCollect, 601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 611d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const GcRetentionPolicy& policy); 621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 631d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum SpaceType { 641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeImageSpace, 651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeAllocSpace, 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeZygoteSpace, 671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeLargeObjectSpace, 681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 691d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const SpaceType& space_type); 701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space contains memory allocated for managed objects. 721d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Space { 731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Dump space. Also key method for C++ vtables. 751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual void Dump(std::ostream& os) const; 761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Name of the space. May vary, for example before/after the Zygote fork. 781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const char* GetName() const { 791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return name_.c_str(); 801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The policy of when objects are collected associated with this space. 831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy GetGcRetentionPolicy() const { 841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return gc_retention_policy_; 851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Does the space support allocation? 881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual bool CanAllocateInto() const { 891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return true; 901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is the given object contained within this space? 931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual bool Contains(const mirror::Object* obj) const = 0; 941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The kind of space this: image, alloc, zygote, large object. 961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual SpaceType GetType() const = 0; 971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this an image space, ie one backed by a memory mapped image file. 991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsImageSpace() const { 1001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeImageSpace; 1011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers ImageSpace* AsImageSpace(); 1031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this a dlmalloc backed allocation space? 1051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsDlMallocSpace() const { 1061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers SpaceType type = GetType(); 1071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return type == kSpaceTypeAllocSpace || type == kSpaceTypeZygoteSpace; 1081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DlMallocSpace* AsDlMallocSpace(); 1101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this the space allocated into by the Zygote and no-longer in use? 1121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsZygoteSpace() const { 1131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeZygoteSpace; 1141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DlMallocSpace* AsZygoteSpace(); 1161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Does this space hold large objects and implement the large object space abstraction? 1181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsLargeObjectSpace() const { 1191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeLargeObjectSpace; 1201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers LargeObjectSpace* AsLargeObjectSpace(); 1221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~Space() {} 1241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 1261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Space(const std::string& name, GcRetentionPolicy gc_retention_policy); 1271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void SetGcRetentionPolicy(GcRetentionPolicy gc_retention_policy) { 1291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers gc_retention_policy_ = gc_retention_policy; 1301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Name of the space that may vary due to the Zygote fork. 1331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers std::string name_; 1341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 1361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // When should objects within this space be reclaimed? Not constant as we vary it in the case 1371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // of Zygote forking. 1381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy gc_retention_policy_; 1391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers friend class art::gc::Heap; 1411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(Space); 1431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 1441d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const Space& space); 1451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// AllocSpace interface. 1471d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass AllocSpace { 1481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 1491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of bytes currently allocated. 1501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual uint64_t GetBytesAllocated() const = 0; 1511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of objects currently allocated. 1521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual uint64_t GetObjectsAllocated() const = 0; 1531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of bytes allocated since the space was created. 1541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual uint64_t GetTotalBytesAllocated() const = 0; 1551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of objects allocated since the space was created. 1561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual uint64_t GetTotalObjectsAllocated() const = 0; 1571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Allocate num_bytes without allowing growth. 1591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual mirror::Object* Alloc(Thread* self, size_t num_bytes) = 0; 1601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Return the storage space required by obj. 1621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t AllocationSize(const mirror::Object* obj) = 0; 1631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Returns how many bytes were freed. 1651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t Free(Thread* self, mirror::Object* ptr) = 0; 1661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Returns how many bytes were freed. 1681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) = 0; 1691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 1711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers AllocSpace() {} 1721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~AllocSpace() {} 1731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 1751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(AllocSpace); 1761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 1771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// Continuous spaces have bitmaps, and an address range. Although not required, objects within 1791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// continuous spaces can be marked in the card table. 1801d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ContinuousSpace : public Space { 1811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 1821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Address at which the space begins 1831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers byte* Begin() const { 1841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return begin_; 1851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Address at which the space ends, which may vary as the space is filled. 1881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers byte* End() const { 1891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return end_; 1901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Current size of space 1931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers size_t Size() const { 1941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return End() - Begin(); 1951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual accounting::SpaceBitmap* GetLiveBitmap() const = 0; 1981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual accounting::SpaceBitmap* GetMarkBitmap() const = 0; 1991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is object within this space? We check to see if the pointer is beyond the end first as 2011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // continuous spaces are iterated over from low to high. 2021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool HasAddress(const mirror::Object* obj) const { 2031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const byte* byte_ptr = reinterpret_cast<const byte*>(obj); 2041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return byte_ptr < End() && byte_ptr >= Begin(); 2051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool Contains(const mirror::Object* obj) const { 2081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return HasAddress(obj); 2091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~ContinuousSpace() {} 2121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 2141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers ContinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy, 2151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers byte* begin, byte* end) : 2161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Space(name, gc_retention_policy), begin_(begin), end_(end) { 2171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The beginning of the storage for fast access. 2211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers byte* const begin_; 2221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Current end of the space. 2241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers byte* end_; 2251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 2271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(ContinuousSpace); 2281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 2291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space where objects may be allocated higgledy-piggledy throughout virtual memory. Currently 2311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// the card table can't cover these objects and so the write barrier shouldn't be triggered. This 2321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// is suitable for use for large primitive arrays. 2331d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass DiscontinuousSpace : public Space { 2341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 2351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers accounting::SpaceSetMap* GetLiveObjects() const { 2361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return live_objects_.get(); 2371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers accounting::SpaceSetMap* GetMarkObjects() const { 2401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mark_objects_.get(); 2411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~DiscontinuousSpace() {} 2441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 2461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DiscontinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy); 2471d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers UniquePtr<accounting::SpaceSetMap> live_objects_; 2491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers UniquePtr<accounting::SpaceSetMap> mark_objects_; 2501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 2521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(DiscontinuousSpace); 2531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 2541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2551d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass MemMapSpace : public ContinuousSpace { 2561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 2571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Maximum which the mapped space can grow to. 2581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t Capacity() const { 2591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_->Size(); 2601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Size of the space without a limit on its growth. By default this is just the Capacity, but 2631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // for the allocation space we support starting with a small heap and then extending it. 2641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t NonGrowthLimitCapacity() const { 2651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return Capacity(); 2661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 2691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers MemMapSpace(const std::string& name, MemMap* mem_map, size_t initial_size, 2701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy gc_retention_policy) 2711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers : ContinuousSpace(name, gc_retention_policy, 2721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers mem_map->Begin(), mem_map->Begin() + initial_size), 2731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers mem_map_(mem_map) { 2741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers MemMap* GetMemMap() { 2771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_.get(); 2781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const MemMap* GetMemMap() const { 2811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_.get(); 2821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 2851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Underlying storage of the space 2861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers UniquePtr<MemMap> mem_map_; 2871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(MemMapSpace); 2891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 2901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace space 2921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 2931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace art 2941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#endif // ART_SRC_GC_SPACE_SPACE_H_ 296