zygote_space.h revision a1602f28c0e3127ad511712d4b08db89737ae901
1a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier/* 2a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * Copyright (C) 2014 The Android Open Source Project 3a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * 4a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 5a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * you may not use this file except in compliance with the License. 6a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * You may obtain a copy of the License at 7a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * 8a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 9a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * 10a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 11a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 12a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * See the License for the specific language governing permissions and 14a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier * limitations under the License. 15a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier */ 16a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 17a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier#ifndef ART_RUNTIME_GC_SPACE_ZYGOTE_SPACE_H_ 18a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier#define ART_RUNTIME_GC_SPACE_ZYGOTE_SPACE_H_ 19a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 20a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier#include "malloc_space.h" 21a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier#include "mem_map.h" 22a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 23a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartiernamespace art { 24a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartiernamespace gc { 25a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 26a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartiernamespace accounting { 27a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartierclass SpaceBitmap; 28a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier} 29a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 30a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartiernamespace space { 31a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 32a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier// An zygote space is a space which you cannot allocate into or free from. 33a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartierclass ZygoteSpace : public ContinuousMemMapAllocSpace { 34a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier public: 35a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier // Returns the remaining storage in the out_map field. 36a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier static ZygoteSpace* Create(const std::string& name, MemMap* mem_map, 37a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier accounting::SpaceBitmap* live_bitmap, 38a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier accounting::SpaceBitmap* mark_bitmap) 39a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 40a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 41a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier void Dump(std::ostream& os) const; 42a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual SpaceType GetType() const { 43a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return kSpaceTypeZygoteSpace; 44a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 45a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual ZygoteSpace* AsZygoteSpace() { 46a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return this; 47a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 48a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual mirror::Object* AllocWithGrowth(Thread* /*self*/, size_t /*num_bytes*/, 49a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier size_t* /*bytes_allocated*/) { 50a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier LOG(FATAL) << "Unimplemented"; 51a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return nullptr; 52a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 53a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual mirror::Object* Alloc(Thread* self, size_t num_bytes, size_t* bytes_allocated) { 54a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier LOG(FATAL) << "Unimplemented"; 55a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return nullptr; 56a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 57a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual size_t AllocationSize(const mirror::Object* obj) { 58a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier LOG(FATAL) << "Unimplemented"; 59a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return 0; 60a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 61a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual size_t Free(Thread* self, mirror::Object* ptr) { 62a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier LOG(FATAL) << "Unimplemented"; 63a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return 0; 64a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 65a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) { 66a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier LOG(FATAL) << "Unimplemented"; 67a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return 0; 68a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 69a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual uint64_t GetBytesAllocated() { 70a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return Size(); 71a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 72a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual uint64_t GetObjectsAllocated() { 73a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return objects_allocated_; 74a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 75a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 76a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier protected: 77a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual accounting::SpaceBitmap::SweepCallback* GetSweepCallback() { 78a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return &SweepCallback; 79a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 80a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 81a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier private: 82a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier ZygoteSpace(const std::string& name, MemMap* mem_map, size_t objects_allocated); 83a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier static void SweepCallback(size_t num_ptrs, mirror::Object** ptrs, void* arg); 84a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 85a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier AtomicInteger objects_allocated_; 86a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 87a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier friend class Space; 88a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier DISALLOW_COPY_AND_ASSIGN(ZygoteSpace); 89a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier}; 90a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 91a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier} // namespace space 92a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier} // namespace gc 93a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier} // namespace art 94a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 95a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier#endif // ART_RUNTIME_GC_SPACE_ZYGOTE_SPACE_H_ 96