| /* |
| * 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(); |
| } |