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 */ 013 package org.mmtk.vm.gcspy; 014 015 import org.vmmagic.pragma.*; 016 import org.vmmagic.unboxed.Address; 017 018 /** 019 * Abstract class for the GCspy server interpreter<p> 020 * 021 * Implementing classes will mostly forward calls to the C gcspy library. 022 */ 023 @Uninterruptible public abstract class ServerInterpreter { 024 025 protected static final int MAX_LEN = 64 * 1024; // Buffer size 026 protected static final int MAX_SPACES = 32; // Maximum number of spaces 027 protected static boolean initialised = false; 028 029 protected ServerSpace[] spaces; // The server's spaces 030 protected Address server; // a pointer to the c server, gcspy_main_server_t server 031 032 protected static final boolean DEBUG = false; 033 034 /** 035 * Create a new ServerInterpreter singleton. 036 * @param name The name of the server 037 * @param port The number of the port on which to communicate 038 * @param verbose Whether the server is to run verbosely 039 */ 040 @Interruptible 041 public abstract void init(String name, int port, boolean verbose); 042 043 /** 044 * Add an event to the ServerInterpreter. 045 * @param num the event number 046 * @param name the event name 047 */ 048 public abstract void addEvent(int num, String name); 049 050 /** 051 * Set the general info for the ServerInterpreter. 052 * @param info the information 053 */ 054 public abstract void setGeneralInfo(String info); 055 056 /** 057 * Get a pointer to the C server, gcspy_main_server_t. 058 * This address is used in all calls to the server in the C library. 059 * @return the address of the server 060 */ 061 public Address getServerAddress() { return server; } 062 063 /** 064 * Add a GCspy ServerSpace to the ServerInterpreter. 065 * This method returns a unique space ID for the ServerSpace 066 * (again used in calls to the C library). 067 * 068 * @param space the ServerSpace to add 069 * @return a unique id for this space 070 * @exception IndexOutOfBoundsException on attempt to add more than 071 * MAX_SPACES spaces 072 */ 073 @Interruptible 074 public int addSpace(ServerSpace space) { 075 int id = 0; 076 while (id < MAX_SPACES) { 077 if (spaces[id] == null) { 078 spaces[id] = space; 079 return id; 080 } 081 id++; 082 } 083 throw new IndexOutOfBoundsException( 084 "Too many spaces to add to interpreter.\nSet MAX_SPACES to higher value in ServerInterpreter."); 085 } 086 087 /** 088 * Start the server, running its main loop in a pthread. 089 * @param wait Whether to wait for the client to connect 090 */ 091 public abstract void startServer(boolean wait); 092 093 /** 094 * Are we connected to a GCspy client? 095 * @param event The current event 096 * @return {@code true} if we are connected 097 */ 098 public abstract boolean isConnected(int event); 099 100 /** 101 * Start compensation timer so that time spent gathering data is 102 * not confused with the time spent in the application and the VM. 103 */ 104 public abstract void startCompensationTimer(); 105 106 /** 107 * Stop compensation timer so that time spent gathering data is 108 * not confused with the time spent in the application and the VM.r 109 */ 110 public abstract void stopCompensationTimer(); 111 112 /** 113 * Indicate that we are at a server safe point (e.g. the end of a GC). 114 * This is a point at which the server can pause, play one, etc. 115 * @param event The current event 116 */ 117 public abstract void serverSafepoint(int event); 118 119 /** 120 * Discover the smallest header size for objects. 121 * @return the size in bytes 122 */ 123 public abstract int computeHeaderSize(); 124 }