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

import org.mmtk.utility.Log;
import org.mmtk.utility.gcspy.drivers.AbstractDriver;
import org.vmmagic.unboxed.*;
import org.vmmagic.pragma.*;

/**
 * Abstract class for the GCspy Space abstraction.
 *
 * Implementing classes will largely forward calls to the gcspy C library.
 */
@Uninterruptible public abstract class ServerSpace {

  /****************************************************************************
   *
   * Class variables
   */
  protected static final String DEFAULT_UNUSED_STRING = "NOT USED";       // The "unused" string

  /****************************************************************************
  *
  * Instance variables
  */
  protected int spaceId;         // the space's ID
  protected Address driver;      // a pointer to the C driver, gcspy_gc_drivert *driver;
  protected static final boolean DEBUG = false;


  /**
   * Get a pointer to the native driver
   * @return The address of the C driver, gcspy_gc_drivert *, used in all calls
   * to the C library.
   */
  Address getDriverAddress() {
    return driver;
  }

  /**
   * Tell the native driver the tile name.
   * @param i the number of the tile
   * @param start the starting address of the tile
   * @param end the end address
   */
  public abstract void setTilename(int i, Address start, Address end);

  /**
   * Tell the native driver the tile name.
   * @param i the number of the tile
   * @param format the name of the tile, a format string
   * @param value The value for the format string
   */
  public abstract void setTilename(int i, Address format, long value);

  /**
   * Tell the native driver the tile names.
   * @param i the number of the tile
   * @param format The name, including format tags
   * @param value The value for the format string
   */
  public abstract void setTilename(int i, String format, long value);

  /**
   * Tell the C driver to resize
   * @param size the new driver size
   */
  public abstract void resize(int size);

  /**
   * Start a transmission
   */
  public abstract void startCommunication();

  /**
   * Add a stream to the native driver
   * @param id the stream's ID
   * @return the address of the C gcspy_gc_stream_t
   */
  public abstract Address addStream(int id);

  /**
   * Start transmitting a stream.
   * @param id The stream's ID
   * @param len The number of items in the stream
   */
  public abstract void stream(int id, int len);

  /**
   * Send a byte
   * @param value The byte
   */
  public abstract void streamByteValue(byte value);

  /**
   * Send a short
   * @param value The short
   */
  public abstract void streamShortValue(short value);

  /**
   * Send an int
   * @param value The int
   */
  public abstract void streamIntValue(int value);

  /**
   * End of this stream
   */
  public abstract void streamEnd();

  /**
   * Start to send a summary
   * @param id The stream's ID
   * @param len The number of items to be sent
   */
  public abstract void summary(int id, int len);

  /**
   * Send a summary value
   * @param val The value
   */
  public abstract void summaryValue(int val);

  /**
   * End the summary
   */
  public abstract void summaryEnd();

  /**
   * Send all the control info for the space
   * @param space The GCspy driver for this space
   * @param tileNum The number of tiles
   */
  public abstract void sendControls(AbstractDriver space, int tileNum);

  /**
   * Send info for this space
   * @param info A pointer to the information (held as C string)
   */
  public abstract void spaceInfo(Address info);

  /**
   * End the transmission (for this event)
   */
  public void endCommunication() {
    if (DEBUG) Log.write("endComm\n");
  }
}
