Add allocation and garbage collection infrastructure.
Change-Id: I4b04cdfdf18afb75a7b0df87b509e8156b4a932b
diff --git a/src/heap.h b/src/heap.h
index f7ae5a5..f35e3f8 100644
--- a/src/heap.h
+++ b/src/heap.h
@@ -6,52 +6,103 @@
#include "src/globals.h"
#include "src/object.h"
+#include "src/object_bitmap.h"
+#include "src/thread.h"
namespace art {
+class Space;
+class HeapBitmap;
+
class Heap {
public:
- static Heap* Create() {
- Heap* new_heap = new Heap();
- // TODO: should return NULL if the heap could not be created.
- return new_heap;
+ static const size_t kStartupSize = 1 * MB;
+
+ static const size_t kMaximumSize = 16 * MB;
+
+ static bool Init() {
+ return Init(kStartupSize, kMaximumSize);
}
- ~Heap() {}
+ static bool Init(size_t staring_size, size_t maximum_size);
- static Object* AllocRaw(size_t size, Class* klass) {
- byte* raw = new byte[size]();
- Object* object = reinterpret_cast<Object*>(raw);
- object->klass_ = klass;
- return object;
- }
+ static void Destroy();
static Object* AllocObject(Class* klass) {
- return AllocRaw(klass->object_size_, klass);
+ return AllocObject(klass, klass->object_size_);
+ }
+
+ static Object* AllocObject(Class* klass, size_t num_bytes) {
+ Object* obj = Allocate(num_bytes);
+ if (obj != NULL) {
+ obj->klass_ = klass;
+ }
+ return obj;
}
static CharArray* AllocCharArray(Class* char_array, size_t length) {
size_t size = sizeof(Array) + length * sizeof(uint16_t);
- return reinterpret_cast<CharArray*>(AllocRaw(size, char_array));
+ Object* new_array = AllocObject(char_array, size);
+ if (new_array != NULL) {
+ char_array->klass_ = char_array;
+ }
+ return down_cast<CharArray*>(new_array);
}
static String* AllocString(Class* java_lang_String) {
- return reinterpret_cast<String*>(AllocObject(java_lang_String));
+ return down_cast<String*>(AllocObject(java_lang_String));
}
- static String* AllocStringFromModifiedUtf8(Class* java_lang_String, Class* char_array, const char* data) {
- String* string = AllocString(java_lang_String);
- uint32_t count = strlen(data); // TODO
- CharArray* array = AllocCharArray(char_array, count);
- string->array_ = array;
- string->count_ = count;
- return string;
+ static String* AllocStringFromModifiedUtf8(Class* java_lang_String,
+ Class* char_array,
+ const char* data);
+
+ // Initiates an explicit garbage collection.
+ static void CollectGarbage();
+
+ // Blocks the caller until the garbage collector becomes idle.
+ static void WaitForConcurrentGcToComplete();
+
+ static Mutex* GetLock() {
+ return lock_;
}
private:
- Heap() {}
- DISALLOW_COPY_AND_ASSIGN(Heap);
+ static Object* Allocate(size_t num_bytes);
+
+ static void CollectGarbageInternal();
+
+ static void GrowForUtilization();
+
+ static Mutex* lock_;
+
+ static Space* space_;
+
+ static HeapBitmap* mark_bitmap_;
+
+ static HeapBitmap* live_bitmap_;
+
+ static size_t startup_size_;
+
+ static size_t maximum_size_;
+
+ static bool is_gc_running_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(Heap);
+};
+
+class HeapLock {
+ public:
+ HeapLock(Heap* heap) : lock_(heap->GetLock()) {
+ lock_->Lock();
+ }
+ ~HeapLock() {
+ lock_->Unlock();
+ }
+ private:
+ Mutex* lock_;
+ DISALLOW_COPY_AND_ASSIGN(HeapLock);
};
} // namespace art