/*
 *  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.policy;

import org.mmtk.utility.alloc.LargeObjectAllocator;
import org.mmtk.utility.gcspy.drivers.TreadmillDriver;
import org.mmtk.utility.Constants;

import org.vmmagic.pragma.*;

/**
 * Each instance of this class is intended to provide fast,
 * unsynchronized access to a treadmill.  Therefore instances must not
 * be shared across truely concurrent threads (CPUs).  Rather, one or
 * more instances of this class should be bound to each CPU.  The
 * shared VMResource used by each instance is the point of global
 * synchronization, and synchronization only occurs at the granularity
 * of aquiring (and releasing) chunks of memory from the VMResource.
 *
 * If there are C CPUs and T TreadmillSpaces, there must be C X T
 * instances of this class, one for each CPU, TreadmillSpace pair.
 */
@Uninterruptible
public final class LargeObjectLocal extends LargeObjectAllocator implements Constants {

  /****************************************************************************
   *
   * Class variables
   */

  /****************************************************************************
   *
   * Instance variables
   */

  /****************************************************************************
   *
   * Initialization
   */

  /**
   * Constructor
   *
   * @param space The treadmill space to which this thread instance is
   * bound.
   */
  public LargeObjectLocal(BaseLargeObjectSpace space) {
    super(space);
  }

  /****************************************************************************
   *
   * Allocation
   */

  /****************************************************************************
   *
   * Collection
   */

  /**
   * Prepare for a collection.  Clear the treadmill to-space head and
   * prepare the collector.  If paranoid, perform a sanity check.
   */
  public void prepare(boolean fullHeap) {
  }

  /**
   * Finish up after a collection.
   */
  public void release(boolean fullHeap) {
  }

  /****************************************************************************
   *
   * Miscellaneous size-related methods
   */

  /**
   * Gather data for GCSpy from the nursery
   * @param event the gc event
   * @param losDriver the GCSpy space driver
   */
  public void gcspyGatherData(int event, TreadmillDriver losDriver) {
    // TODO: assumes single threaded
    // TODO: assumes non-explit LOS
    ((LargeObjectSpace)space).getTreadmill().gcspyGatherData(event, losDriver);
  }

  /**
   * Gather data for GCSpy for an older space
   * @param event the gc event
   * @param losDriver the GCSpy space driver
   * @param tospace gather from tospace?
   */
  public void gcspyGatherData(int event, TreadmillDriver losDriver, boolean tospace) {
    // TODO: assumes single threaded
    ((LargeObjectSpace)space).getTreadmill().gcspyGatherData(event, losDriver, tospace);
  }
}
