blob: 53484ff6f5bce98f3308400d6501fb4c65be9a02 [file] [log] [blame]
/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.mmtk.vm;
import org.mmtk.plan.CollectorContext;
import org.mmtk.plan.MutatorContext;
import org.vmmagic.pragma.*;
@Uninterruptible public abstract class Collection {
/****************************************************************************
*
* Class variables
*/
/**
* An unknown GC trigger reason. Signals a logic bug.
*/
public static final int UNKNOWN_GC_TRIGGER = 0;
/**
* Concurrent collection phase trigger.
*/
public static final int INTERNAL_PHASE_GC_TRIGGER = 1;
/**
* Externally triggered garbage collection (eg call to System.gc())
*/
public static final int EXTERNAL_GC_TRIGGER = 2;
/**
* Resource triggered garbage collection. For example, an
* allocation request would take the number of pages in use beyond
* the number available.
*/
public static final int RESOURCE_GC_TRIGGER = 3;
/**
* Internally triggered garbage collection. For example, the memory
* manager attempting another collection after the first failed to
* free space.
*/
public static final int INTERNAL_GC_TRIGGER = 4;
/**
* The number of garbage collection trigger reasons.
*/
public static final int TRIGGER_REASONS = 5;
/** Short descriptions of the garbage collection trigger reasons. */
protected static final String[] triggerReasons = {
"unknown",
"concurrent phase",
"external request",
"resource exhaustion",
"internal request"
};
/**
* Triggers a collection.
*
* @param why the reason why a collection was triggered. 0 to
* <code>TRIGGER_REASONS - 1</code>.
*/
@Unpreemptible
public abstract void triggerCollection(int why);
/**
* Joins an already requested collection.
*/
@Unpreemptible
public abstract void joinCollection();
/**
* Trigger an asynchronous collection, checking for memory
* exhaustion first.
*
* @param why the reason why a collection was triggered. 0 to
* <code>TRIGGER_REASONS - 1</code>.
*/
public abstract void triggerAsyncCollection(int why);
/**
* The maximum number collection attempts across threads.
*/
public abstract int maximumCollectionAttempt();
/**
* Report that the allocation has succeeded.
*/
public abstract void reportAllocationSuccess();
/**
* Report that a physical allocation has failed.
*/
public abstract void reportPhysicalAllocationFailed();
/**
* Does the VM consider this an emergency alloction, where the normal
* heap size rules can be ignored.
*/
public abstract boolean isEmergencyAllocation();
/**
* Determine whether a collection cycle has fully completed (this is
* used to ensure a GC is not in the process of completing, to
* avoid, for example, an async GC being triggered on the switch
* from GC to mutator thread before all GC threads have switched.
*
* @return True if GC is not in progress.
*/
public abstract boolean noThreadsInGC();
/**
* Prepare a mutator for collection.
*
* @param m the mutator to prepare
*/
public abstract void prepareMutator(MutatorContext m);
/**
* Prepare a collector for a collection.
*
* @param c the collector to prepare
*/
public abstract void prepareCollector(CollectorContext c);
/**
* Rendezvous with all other processors, returning the rank
* (that is, the order this processor arrived at the barrier).
*/
public abstract int rendezvous(int where);
/** @return The number of active collector threads */
public abstract int activeGCThreads();
/**
* @return The ordinal ID of the running collector thread w.r.t.
* the set of active collector threads (zero based)
*/
public abstract int activeGCThreadOrdinal();
/**
* Request each mutator flush remembered sets. This method
* will trigger the flush and then yield until all processors have
* flushed.
*/
public abstract void requestMutatorFlush();
}