/* * 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.vmmagic.pragma.*; import org.vmmagic.unboxed.Address; /** * Abstract class for the GCspy server interpreter * * Implementing classes will mostly forward calls to the C gcspy library. */ @Uninterruptible public abstract class ServerInterpreter { protected static final int MAX_LEN = 64 * 1024; // Buffer size protected static final int MAX_SPACES = 32; // Maximum number of spaces protected static boolean initialised = false; protected ServerSpace[] spaces; // The server's spaces protected Address server; // a pointer to the c server, gcspy_main_server_t server protected static final boolean DEBUG = false; /** * Create a new ServerInterpreter singleton. * @param name The name of the server * @param port The number of the port on which to communicate * @param verbose Whether the server is to run verbosely */ @Interruptible public abstract void init(String name, int port, boolean verbose); /** * Add an event to the ServerInterpreter. * @param num the event number * @param name the event name */ public abstract void addEvent(int num, String name); /** * Set the general info for the ServerInterpreter. * @param info the information */ public abstract void setGeneralInfo(String info); /** * Get a pointer to the C server, gcspy_main_server_t. * This address is used in alll calls to the server in the C library. * @return the address of the server */ public Address getServerAddress() { return server; } /** * Add a GCspy ServerSpace to the ServerInterpreter. * This method returns a unique space ID for the ServerSpace * (again used in calls to the C library). * * @param space the ServerSpace to add * @return a unique id for this space * @exception IndexOutOfBoundsException on attempt to add more than * MAX_SPACES spaces */ @Interruptible public int addSpace(ServerSpace space) { int id = 0; while (id < MAX_SPACES) { if (spaces[id] == null) { spaces[id] = space; return id; } id++; } throw new IndexOutOfBoundsException( "Too many spaces to add to interpreter.\nSet MAX_SPACES to higher value in ServerInterpreter."); } /** * Start the server, running its main loop in a pthread. * @param wait Whether to wait for the client to connect */ public abstract void startServer(boolean wait); /** * Are we connected to a GCspy client? * @param event The current event * @return true if we are connected */ public abstract boolean isConnected(int event); /** * Start compensation timer so that time spent gathering data is * not confused with the time spent in the application and the VM. */ public abstract void startCompensationTimer(); /** * Stop compensation timer so that time spent gathering data is * not confused with the time spent in the application and the VM.r */ public abstract void stopCompensationTimer(); /** * Indicate that we are at a server safe point (e.g. the end of a GC). * This is a point at which the server can pause, play one, etc. * @param event The current event */ public abstract void serverSafepoint(int event); /** * Discover the smallest header size for objects. * @return the size in bytes */ public abstract int computeHeaderSize(); }