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

import org.mmtk.utility.Log;
import org.mmtk.utility.options.*;
import org.mmtk.vm.VM;
import org.mmtk.vm.gcspy.ServerInterpreter;
import org.mmtk.vm.gcspy.Util;

import org.vmmagic.pragma.*;

/**
 * This class implements collector-independent GCspy functionality to start
 * the GCspy server.  It handles command-line parameters for port number,
 * whether the VM should wait for a GCspy client to connect, and tile size.
 * Most importantly, it calls the Plan's startGCspyServer method which
 * creates a new ServerInterpreter, and adds events and space drivers.
 */
@Uninterruptible public class GCspy {

  /****************************************************************************
   *
   * Class variables
   */

  public static final Util util = VM.newGCspyUtil();
  public static final ServerInterpreter server = VM.newGCspyServerInterpreter();

  /****************************************************************************
   *
   * Initialization
   */

  @Interruptible
  public static void createOptions() {
    Options.gcspyPort = new GCspyPort();
    Options.gcspyWait = new GCspyWait();
    Options.gcspyTileSize = new GCspyTileSize();
  }

  /**
   * The boot method is called by the runtime immediately after
   * command-line arguments are available.  Note that allocation must
   * be supported prior to this point because the runtime
   * infrastructure may require allocation in order to parse the
   * command line arguments.
   */
  public static void postBoot() { }

  /**
   * Get the number of the port that GCspy communicates on
   *
   * @return the GCspy port number
   */
  public static int getGCspyPort() {
    return Options.gcspyPort.getValue();
  }

  /**
   * Should the VM wait for GCspy to connect?
   *
   * @return whether the VM should wait for the visualiser to connect
   */
  public static boolean getGCspyWait() {
    return Options.gcspyWait.getValue();
  }

  /**
   * Start the GCspy server.
   * WARNING: allocates memory indirectly
   */
  @Interruptible
  public static void startGCspyServer() {
    int port = getGCspyPort();
    Log.write("GCspy.startGCspyServer, port="); Log.write(port);
    Log.write(", wait=");
    Log.writeln(getGCspyWait());
    if (port > 0) {
      VM.activePlan.global().startGCspyServer(port, getGCspyWait());
      //Log.writeln("gcspy thread booted");
    }
  }
}

