blob: f35e3f85714d33c6f5290810fcfdca11051cd0ed [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
// Author: cshapiro@google.com (Carl Shapiro)
#ifndef ART_SRC_HEAP_H_
#define ART_SRC_HEAP_H_
#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 const size_t kStartupSize = 1 * MB;
static const size_t kMaximumSize = 16 * MB;
static bool Init() {
return Init(kStartupSize, kMaximumSize);
}
static bool Init(size_t staring_size, size_t maximum_size);
static void Destroy();
static Object* AllocObject(Class* 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);
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 down_cast<String*>(AllocObject(java_lang_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:
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
#endif // ART_SRC_HEAP_H_