OLD | NEW |
1 // Copyright (c) 2014, the Fletch project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Fletch project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 #ifndef SRC_VM_OBJECT_MEMORY_H_ | 5 #ifndef SRC_VM_OBJECT_MEMORY_H_ |
6 #define SRC_VM_OBJECT_MEMORY_H_ | 6 #define SRC_VM_OBJECT_MEMORY_H_ |
7 | 7 |
8 #include "src/shared/globals.h" | 8 #include "src/shared/globals.h" |
9 #include "src/shared/platform.h" | 9 #include "src/shared/platform.h" |
10 #include "src/shared/utils.h" | 10 #include "src/shared/utils.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 void set_owner(Space* value) { owner_ = value; } | 65 void set_owner(Space* value) { owner_ = value; } |
66 | 66 |
67 friend class ObjectMemory; | 67 friend class ObjectMemory; |
68 friend class PageTable; | 68 friend class PageTable; |
69 friend class Space; | 69 friend class Space; |
70 }; | 70 }; |
71 | 71 |
72 // Space is a chain of chunks. It supports allocation and traversal. | 72 // Space is a chain of chunks. It supports allocation and traversal. |
73 class Space { | 73 class Space { |
74 public: | 74 public: |
| 75 static const int kDefaultChunkSize = 128 * KB; |
| 76 |
75 explicit Space(int maximum_initial_size = 0); | 77 explicit Space(int maximum_initial_size = 0); |
76 | 78 |
77 ~Space(); | 79 ~Space(); |
78 | 80 |
79 // Allocate raw object. | 81 // Allocate raw object. |
80 uword Allocate(int size); | 82 uword Allocate(int size); |
81 | 83 |
82 // Rewind allocation top by size bytes if location is equal to current | 84 // Rewind allocation top by size bytes if location is equal to current |
83 // allocation top. | 85 // allocation top. |
84 void TryDealloc(uword location, int size); | 86 void TryDealloc(uword location, int size); |
(...skipping 19 matching lines...) Expand all Loading... |
104 | 106 |
105 // Schema change support. | 107 // Schema change support. |
106 void CompleteTransformations(PointerVisitor* visitor, Process* process); | 108 void CompleteTransformations(PointerVisitor* visitor, Process* process); |
107 | 109 |
108 // Returns true if the address is inside this space. | 110 // Returns true if the address is inside this space. |
109 inline bool Includes(uword address) const; | 111 inline bool Includes(uword address) const; |
110 | 112 |
111 // Adjust the allocation budget based on the current heap size. | 113 // Adjust the allocation budget based on the current heap size. |
112 void AdjustAllocationBudget(); | 114 void AdjustAllocationBudget(); |
113 | 115 |
| 116 void SetAllocationBudget(int new_budget); |
| 117 |
114 // Tells whether garbage collection is needed. | 118 // Tells whether garbage collection is needed. |
115 bool needs_garbage_collection() { return allocation_budget_ <= 0; } | 119 bool needs_garbage_collection() { return allocation_budget_ <= 0; } |
116 | 120 |
117 bool in_no_allocation_failure_scope() { return no_allocation_nesting_ != 0; } | 121 bool in_no_allocation_failure_scope() { return no_allocation_nesting_ != 0; } |
118 | 122 |
119 // TODO(kasperl): This seems like a bad interface. | 123 // TODO(kasperl): This seems like a bad interface. |
120 void AppendProgramChunk(Chunk* chunk, uword top) { | 124 void AppendProgramChunk(Chunk* chunk, uword top) { |
121 Append(chunk); | 125 Append(chunk); |
122 top_ = top; | 126 top_ = top; |
123 limit_ = chunk->limit_; | 127 limit_ = chunk->limit_; |
124 } | 128 } |
125 | 129 |
126 // Takes all chunks inside [space] and prepends it to this space. | 130 // Takes all chunks inside [space] and prepends it to this space. |
127 // The given [space] will be deleted. | 131 // The given [space] will be deleted. |
128 void PrependSpace(Space* space); | 132 void PrependSpace(Space* space); |
129 | 133 |
130 bool is_empty() const { return first_ == NULL; } | 134 bool is_empty() const { return first_ == NULL; } |
131 | 135 |
132 private: | 136 private: |
133 friend class NoAllocationFailureScope; | 137 friend class NoAllocationFailureScope; |
134 | 138 |
135 static const int kDefaultChunkSize = 128 * KB; | |
136 | |
137 uword TryAllocate(int size); | 139 uword TryAllocate(int size); |
138 uword AllocateInNewChunk(int size); | 140 uword AllocateInNewChunk(int size); |
139 | 141 |
140 void Append(Chunk* chunk); | 142 void Append(Chunk* chunk); |
141 | 143 |
142 Chunk* first() { return first_; } | 144 Chunk* first() { return first_; } |
143 Chunk* last() { return last_; } | 145 Chunk* last() { return last_; } |
144 uword top() { return top_; } | 146 uword top() { return top_; } |
145 | 147 |
146 void IncrementNoAllocationNesting() { ++no_allocation_nesting_; } | 148 void IncrementNoAllocationNesting() { ++no_allocation_nesting_; } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 friend class Space; | 240 friend class Space; |
239 }; | 241 }; |
240 | 242 |
241 inline bool Space::Includes(uword address) const { | 243 inline bool Space::Includes(uword address) const { |
242 return ObjectMemory::IsAddressInSpace(address, this); | 244 return ObjectMemory::IsAddressInSpace(address, this); |
243 } | 245 } |
244 | 246 |
245 } // namespace fletch | 247 } // namespace fletch |
246 | 248 |
247 #endif // SRC_VM_OBJECT_MEMORY_H_ | 249 #endif // SRC_VM_OBJECT_MEMORY_H_ |
OLD | NEW |