blob: d877ad74200e3c681caba1b4f892287c143262f9 [file] [log] [blame]
//===---------------- gc.cc - Mvm Garbage Collector -----------------------===//
//
// Mvm
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mvm/GC/GC.h"
#include "gccollector.h"
#include "gcerror.h"
using namespace mvm;
typedef void (*memoryError_t)(unsigned int);
memoryError_t GCCollector::internMemoryError;
void gc::markAndTrace() const {
GCCollector::markAndTrace((void*)this);
}
size_t gc::objectSize() const {
return GCCollector::objectSize((gc*)this);
}
void *gc::operator new(size_t sz, VirtualTable *vt) {
return GCCollector::gcmalloc(vt, sz);
}
void gc::operator delete(void *) {
gcfatal(0, "never call directly a destructor.....");
}
void *gc::realloc(size_t n) {
return GCCollector::gcrealloc(this, n);
}
unsigned int gc::enable(unsigned int n) {
return GCCollector::enable(n);
}
int gc::isStable(gc_lock_recovery_fct_t fct, int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7) {
return GCCollector::isStable(fct, a0, a1, a2, a3, a4, a5, a6, a7);
}
void gc::die_if_sigsegv_occured_during_collection(void *addr) {
GCCollector::die_if_sigsegv_occured_during_collection(addr);
}
void gc::gcStats(size_t &no, size_t &nbb) {
GCCollector::gcStats(&no, &nbb);
}
void gc::initialise(markerFn marker, void *base_sp) {
#ifdef HAVE_PTHREAD
Thread::initialise();
#endif
GCCollector::initialise(marker);
#ifdef HAVE_PTHREAD
GCCollector::inject_my_thread(base_sp);
#endif
}
void gc::destroy() {
GCCollector::destroy();
}
void gc::inject_my_thread(void *base_sp) {
#ifdef HAVE_PTHREAD
GCCollector::inject_my_thread(base_sp);
#endif
}
void gc::maybeCollect() {
GCCollector::maybeCollect();
}
void gc::collect(void) {
GCCollector::collect();
}
gc *gc::begOf(const void *obj) {
return GCCollector::begOf((void*)obj);
}
int gc::byteOffset(void *obj) {
int beg = (int)GCCollector::begOf(obj);
int off = (int)obj;
return (off-beg);
}
void gc::applyFunc(void (*func)(gc *o, void *data), void *data){
return GCCollector::applyFunc(func, data);
}
int gc::getMaxMemory(void){
return 0;
}
int gc::getFreeMemory(void){
return 0;
}
int gc::getTotalMemory(void){
return 0;
}
void gc::setMaxMemory(size_t sz){
}
void gc::setMinMemory(size_t sz){
}
void gc::registerMemoryError(void (*func)(unsigned int)){
GCCollector::internMemoryError = func;
onMemoryError = &GCCollector::defaultMemoryError;
}
void gc::remove_my_thread() {
#ifdef HAVE_PTHREAD
GCCollector::remove_thread(GCCollector::threads->myloc());
#endif
}