/*
 *  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.TraceLocal;
import org.vmmagic.pragma.Uninterruptible;
import org.vmmagic.unboxed.Address;
import org.vmmagic.unboxed.ObjectReference;

/**
 *
 */
@Uninterruptible
public abstract class Debug {
  /**
   * Global switch for debugging - if false the other methods of this
   * class are never called.
   * @return Whether debugging is enabled
   */
  public abstract boolean isEnabled();

  /**
   * A modbuf (object remembering barrier) entry has been
   * traced during collection.
   * @param object The modbuf entry
   */
  public void modbufEntry(ObjectReference object) { }

  /**
   * A remset (slot remembering barrier) entry has been
   * traced during collection.
   * @param slot The remset entry
   */
  public void remsetEntry(Address slot) { }

  /**
   * An array remset entry has been traced during collection.  Implicitly
   * the slots from start (inclusive) through to guard (non-inclusive)
   * are traced as remset entries
   * @param start The entry start address
   * @param guard The guard
   */
  public void arrayRemsetEntry(Address start, Address guard) { }

  /**
   * A global GC collection phase
   * @param phaseId The phase ID
   * @param before true at the start of the phase, false at the end
   */
  public void globalPhase(short phaseId, boolean before) { }

  /**
   * A per-collector GC collection phase
   * @param phaseId The phase ID
   * @param ordinal The collector ID (within this collection)
   * @param before true at the start of the phase, false at the end
   */
  public void collectorPhase(short phaseId, int ordinal, boolean before) { }

  /**
   * A per-mutator GC collection phase
   * @param phaseId The phase ID
   * @param ordinal The mutator ID
   * @param before true at the start of the phase, false at the end
   */
  public void mutatorPhase(short phaseId, int ordinal, boolean before) { }

  /**
   * Trace an object during GC
   *
   * *** Non-standard, requires plumbing into a collector during debugging ***
   *
   * @param trace The trace being performed
   * @param object The object
   */
  public void traceObject(TraceLocal trace, ObjectReference object) { }

  /**
   * An entry has been inserted at the head of a queue
   *
   * *** Non-standard, requires plumbing into a collector during debugging ***
   *
   * @param queueName The name of the queue
   * @param value The value
   */
  public void queueHeadInsert(String queueName, Address value) {
  }

  /**
   * An entry has been inserted at the head of a queue
   *
   * *** Non-standard, requires plumbing into a collector during debugging ***
   *
   * @param queueName The name of the queue
   * @param value The value
   */
  public void queueTailInsert(String queueName, Address value) {
  }

  /**
   * An entry has been inserted at the head of a queue
   *
   * *** Non-standard, requires plumbing into a collector during debugging ***
   *
   * @param queueName The name of the queue
   * @param value The value
   */
  public void queueHeadRemove(String queueName, Address value) { }

  /**
   * An entry has been inserted at the head of a queue
   *
   * *** Non-standard, requires plumbing into a collector during debugging ***
   *
   * @param queueName The name of the queue
   * @param value The value
   */
  public void queueTailRemove(String queueName, Address value) { }

  /*
   * NOTE: These methods should not be called by anything other than the
   * reflective mechanisms in org.mmtk.vm.VM, and are not implemented by
   * subclasses.
   *
   * This hack exists only to allow us to declare the respective
   * methods as protected.
   */
  static final boolean isEnabledTrapdoor(Debug d) {
    return d.isEnabled();
  }

}
