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

#include "mvm/VirtualMachine.h"

#include "JavaObject.h"
#include "JavaThread.h"

using namespace j3;

extern "C" void JnJVM_org_mmtk_plan_Plan_setCollectionTriggered__();

extern "C" void JnJVM_org_j3_config_Selected_00024Collector_staticCollect__();

extern "C" void JnJVM_org_mmtk_plan_Plan_collectionComplete__();

extern "C" uint8_t JnJVM_org_mmtk_utility_heap_HeapGrowthManager_considerHeapSize__();
  
extern "C" void JnJVM_org_mmtk_utility_heap_HeapGrowthManager_reset__();

extern "C" int64_t Java_org_j3_mmtk_Statistics_nanoTime__ ();

extern "C" void JnJVM_org_mmtk_utility_heap_HeapGrowthManager_recordGCTime__D(double);

extern "C" bool Java_org_j3_mmtk_Collection_isEmergencyAllocation__ (JavaObject* C) {
  // TODO: emergency when OOM.
  return false;
}

extern "C" void Java_org_j3_mmtk_Collection_reportAllocationSuccess__ (JavaObject* C) {
  // TODO: clear internal data.
}

extern "C" void Java_org_j3_mmtk_Collection_triggerCollection__I (JavaObject* C, int why) {
  mvm::Thread* th = mvm::Thread::get();

  // Verify that another collection is not happening.
  th->MyVM->rendezvous.startRV();
  if (th->doYield) {
    th->MyVM->rendezvous.cancelRV();
    th->MyVM->rendezvous.join();
    return;
  } else {
    th->MyVM->startCollection();
    th->MyVM->rendezvous.synchronize();
  
    JnJVM_org_mmtk_plan_Plan_setCollectionTriggered__();

    // Record the starting time
    int64_t startTime = Java_org_j3_mmtk_Statistics_nanoTime__();

    // Collect!
    JnJVM_org_j3_config_Selected_00024Collector_staticCollect__();

    // Record the time to GC.
    int64_t elapsedTime = Java_org_j3_mmtk_Statistics_nanoTime__() - startTime;

    JnJVM_org_mmtk_utility_heap_HeapGrowthManager_recordGCTime__D(((double)elapsedTime) / 1000000);

    // 2 means called by System.gc();
    if (why != 2)
      JnJVM_org_mmtk_utility_heap_HeapGrowthManager_considerHeapSize__();

    JnJVM_org_mmtk_utility_heap_HeapGrowthManager_reset__();

    JnJVM_org_mmtk_plan_Plan_collectionComplete__();
    
    if (mvm::Collector::verbose > 0) {
      static int collectionNum = 1;
      if (why == 2) fprintf(stderr, "[Forced] ");
      fprintf(stderr, "Collection %d finished in %lld ms.\n", collectionNum++,
              elapsedTime / 1000000);
    }

    th->MyVM->rendezvous.finishRV();
  
    th->MyVM->wakeUpFinalizers();
    th->MyVM->wakeUpEnqueue();
    
    th->MyVM->endCollection();
  }

}

extern "C" void Java_org_j3_mmtk_Collection_joinCollection__ (JavaObject* C) {
  mvm::Thread* th = mvm::Thread::get();
  assert(th->inRV && "Joining collection without a rendezvous");
  th->MyVM->rendezvous.join();
}

extern "C" int Java_org_j3_mmtk_Collection_rendezvous__I (JavaObject* C, int where) {
  return 1;
}

extern "C" int Java_org_j3_mmtk_Collection_maximumCollectionAttempt__ (JavaObject* C) {
  return 0;
}

extern "C" void Java_org_j3_mmtk_Collection_prepareCollector__Lorg_mmtk_plan_CollectorContext_2 (JavaObject* C, JavaObject* CC) {
  // Nothing to do.
}

extern "C" void Java_org_j3_mmtk_Collection_prepareMutator__Lorg_mmtk_plan_MutatorContext_2 (JavaObject* C, JavaObject* MC) {
}


extern "C" void Java_org_j3_mmtk_Collection_reportPhysicalAllocationFailed__ () { JavaThread::get()->printBacktrace(); abort(); }
extern "C" void Java_org_j3_mmtk_Collection_triggerAsyncCollection__I () { JavaThread::get()->printBacktrace(); abort(); }
extern "C" void Java_org_j3_mmtk_Collection_noThreadsInGC__ () { JavaThread::get()->printBacktrace(); abort(); }
extern "C" void Java_org_j3_mmtk_Collection_activeGCThreads__ () { JavaThread::get()->printBacktrace(); abort(); }
extern "C" void Java_org_j3_mmtk_Collection_activeGCThreadOrdinal__ () { JavaThread::get()->printBacktrace(); abort(); }
extern "C" void Java_org_j3_mmtk_Collection_requestMutatorFlush__ () { JavaThread::get()->printBacktrace(); abort(); }
