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