//===-------- Scanning.cpp - Implementation of the Scanning class  --------===//
//
//                              The VMKit project
//
// This file is distributed under the University of Illinois Open Source 
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "debug.h"
#include "vmkit/VirtualMachine.h"
#include "MMTkObject.h"
#include "VmkitGC.h"

namespace mmtk {

extern "C" void Java_org_j3_mmtk_Scanning_computeThreadRoots__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) {
  // When entering this function, all threads are waiting on the rendezvous to
  // finish.
  vmkit::Thread* th = vmkit::Thread::get();
  vmkit::Thread* tcur = th;
  
  do {
    tcur->scanStack(reinterpret_cast<word_t>(TL));
    tcur = (vmkit::Thread*)tcur->next();
  } while (tcur != th);
}

extern "C" void Java_org_j3_mmtk_Scanning_computeGlobalRoots__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) { 
  vmkit::Thread::get()->MyVM->tracer(reinterpret_cast<word_t>(TL));
  
	vmkit::Thread* th = vmkit::Thread::get();
  vmkit::Thread* tcur = th;
  
  do {
    tcur->tracer(reinterpret_cast<word_t>(TL));
    tcur = (vmkit::Thread*)tcur->next();
  } while (tcur != th);
}

extern "C" void Java_org_j3_mmtk_Scanning_computeStaticRoots__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) {
  // Nothing to do.
}

extern "C" void Java_org_j3_mmtk_Scanning_resetThreadCounter__ (MMTkObject* Scanning) {
  // Nothing to do.
}

extern "C" void Java_org_j3_mmtk_Scanning_specializedScanObject__ILorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* Scanning, uint32_t id, MMTkObject* TC, gc* obj) ALWAYS_INLINE;

extern "C" void Java_org_j3_mmtk_Scanning_specializedScanObject__ILorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* Scanning, uint32_t id, MMTkObject* TC, gc* obj) {
  vmkit::Thread::get()->MyVM->traceObject(obj, reinterpret_cast<word_t>(TC));
}

extern "C" void Java_org_j3_mmtk_Scanning_preCopyGCInstances__Lorg_mmtk_plan_TraceLocal_2 (MMTkObject* Scanning, MMTkObject* TL) {
  // Nothing to do, there are no GC objects on which the GC depends.
}

extern "C" void Java_org_j3_mmtk_Scanning_scanObject__Lorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2 (
    MMTkObject* Scanning, word_t TC, gc* obj) {
	vmkit::Thread::get()->MyVM->traceObject(obj, TC);
}

extern "C" void Java_org_j3_mmtk_Scanning_precopyChildren__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_ObjectReference_2 (
    MMTkObject* Scanning, MMTkObject TL, word_t ref) { UNIMPLEMENTED(); }

}
