001/*
002 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 *  This file is licensed to You under the Eclipse Public License (EPL);
005 *  You may not use this file except in compliance with the License. You
006 *  may obtain a copy of the License at
007 *
008 *      http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 *  See the COPYRIGHT.txt file distributed with this work for information
011 *  regarding copyright ownership.
012 */
013package org.mmtk.vm.gcspy;
014
015import org.mmtk.utility.Log;
016import org.mmtk.utility.gcspy.drivers.AbstractDriver;
017import org.vmmagic.unboxed.*;
018import org.vmmagic.pragma.*;
019
020/**
021 * Abstract class for the GCspy Space abstraction.<p>
022 *
023 * Implementing classes will largely forward calls to the gcspy C library.
024 */
025@Uninterruptible public abstract class ServerSpace {
026
027  /****************************************************************************
028   *
029   * Class variables
030   */
031
032  /** The "unused" string */
033  protected static final String DEFAULT_UNUSED_STRING = "NOT USED";
034
035  /****************************************************************************
036  *
037  * Instance variables
038  */
039
040  /** the space's ID */
041  protected int spaceId;
042  /** a pointer to the C driver, {@code gcspy_gc_drivert *driver} */
043  protected Address driver;
044  protected static final boolean DEBUG = false;
045
046
047  /**
048   * Get a pointer to the native driver
049   * @return The address of the C driver, {@code gcspy_gc_drivert *}, used in all calls
050   * to the C library.
051   */
052  Address getDriverAddress() {
053    return driver;
054  }
055
056  /**
057   * Tell the native driver the tile name.
058   * @param i the number of the tile
059   * @param start the starting address of the tile
060   * @param end the end address
061   */
062  public abstract void setTilename(int i, Address start, Address end);
063
064  /**
065   * Tell the native driver the tile name.
066   * @param i the number of the tile
067   * @param format the name of the tile, a format string
068   * @param value The value for the format string
069   */
070  public abstract void setTilename(int i, Address format, long value);
071
072  /**
073   * Tell the native driver the tile names.
074   * @param i the number of the tile
075   * @param format The name, including format tags
076   * @param value The value for the format string
077   */
078  public abstract void setTilename(int i, String format, long value);
079
080  /**
081   * Tell the C driver to resize
082   * @param size the new driver size
083   */
084  public abstract void resize(int size);
085
086  /**
087   * Start a transmission
088   */
089  public abstract void startCommunication();
090
091  /**
092   * Add a stream to the native driver
093   * @param id the stream's ID
094   * @return the address of the C {@code gcspy_gc_stream_t}
095   */
096  public abstract Address addStream(int id);
097
098  /**
099   * Start transmitting a stream.
100   * @param id The stream's ID
101   * @param len The number of items in the stream
102   */
103  public abstract void stream(int id, int len);
104
105  /**
106   * Send a byte
107   * @param value The byte
108   */
109  public abstract void streamByteValue(byte value);
110
111  /**
112   * Send a short
113   * @param value The short
114   */
115  public abstract void streamShortValue(short value);
116
117  /**
118   * Send an int
119   * @param value The int
120   */
121  public abstract void streamIntValue(int value);
122
123  /**
124   * End of this stream
125   */
126  public abstract void streamEnd();
127
128  /**
129   * Start to send a summary
130   * @param id The stream's ID
131   * @param len The number of items to be sent
132   */
133  public abstract void summary(int id, int len);
134
135  /**
136   * Send a summary value
137   * @param val The value
138   */
139  public abstract void summaryValue(int val);
140
141  /**
142   * End the summary
143   */
144  public abstract void summaryEnd();
145
146  /**
147   * Send all the control info for the space
148   * @param space The GCspy driver for this space
149   * @param tileNum The number of tiles
150   */
151  public abstract void sendControls(AbstractDriver space, int tileNum);
152
153  /**
154   * Send info for this space
155   * @param info A pointer to the information (held as C string)
156   */
157  public abstract void spaceInfo(Address info);
158
159  /**
160   * End the transmission (for this event)
161   */
162  public void endCommunication() {
163    if (DEBUG) Log.write("endComm\n");
164  }
165}