Mercurial > hg > blitz_condensed
view src/org/dancres/blitz/StatsDumper.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
line wrap: on
line source
package org.dancres.blitz; import java.net.*; import java.util.logging.Level; import org.dancres.blitz.disk.Disk; import org.dancres.blitz.stats.StatsBoard; import org.dancres.blitz.stats.Stat; /** <p>This class implements a remote access feature which allows a programmer to trigger dumping of useful debug information. It is triggered by <code>telnet</code>'ing to the debug port. StatsDumper detects the connection, closes it and dumps relevant output to console.</p> <p>For example, if Blitz were suffering from a deadlock, one could arrange for a connection on the debug port, to dump lock information, the default implementation (note that it requires a tweak to Db for it to provide the right information, contact dan@dancres.org, for information).</p> <p>If the port number is non-zero, the StatsDumper is enabled otherwise it's disabled. See <code>debugPort</code> in the configuration file.</p> @todo Find a nice way to handle the stack tracing stuff - only works on JDK 1.5 */ class StatsDumper implements Runnable, ActiveObject { private static StatsDumper theStatsDumper; private Thread theDebugThread; private boolean stopDebugging; private long theCycleTime; static void start(long aPause) { try { if (aPause == 0) return; System.err.println("Starting Stats Dumper: " + aPause); theStatsDumper = new StatsDumper(aPause); } catch (Exception anE) { System.err.println("StatsDumper didn't start!"); anE.printStackTrace(System.err); } } private StatsDumper(long aPause) throws Exception { theCycleTime = aPause; ActiveObjectRegistry.add(this); } public void begin() { theDebugThread = new Thread(this, "StatsDumper"); theDebugThread.start(); } public void halt() { synchronized(this) { stopDebugging = true; } theDebugThread.interrupt(); try { theDebugThread.join(); theDebugThread = null; } catch (InterruptedException anIE) { SpaceImpl.theLogger.log(Level.SEVERE, "Failed to wait for StatsDumper", anIE); } } public void run() { synchronized(this) { while(!stopDebugging) { try { wait(theCycleTime); if (stopDebugging) { continue; } Stat[] myStats = StatsBoard.get().getStats(); for (int i = 0; i < myStats.length; i++) { System.err.println(myStats[i]); } /* Only works on JDK 1.5!!!!!!!! Map myTraces = Thread.getAllStackTraces(); Iterator myThreads = myTraces.keySet().iterator(); while (myThreads.hasNext()) { Thread myThread = (Thread) myThreads.next(); StackTraceElement[] myTrace = (StackTraceElement[]) myTraces.get(myThread); System.err.println(); System.err.println(myThread); System.err.println(); for (int i = 0; i < myTrace.length; i++) { System.err.println(" " + myTrace[i]); } } */ } catch (InterruptedException anIE) { SpaceImpl.theLogger.log(Level.SEVERE, "StatsDumper interrupted"); } catch (Exception anE) { System.err.println("Whoops couldn't do dump stats"); } } } } }