package com.sleepycat.je.utilint;
import de.ovgu.cide.jakutil.*;
/**
* Internal class used for transient event tracing. Subclass this with
* specific events. Subclasses should have toString methods for display and
* events should be added by calling EventTrace.addEvent();
*/
public class EventTrace {
static private int MAX_EVENTS=100;
static public final boolean TRACE_EVENTS=false;
static int currentEvent=0;
static final EventTrace[] events=new EventTrace[MAX_EVENTS];
static final int[] threadIdHashes=new int[MAX_EVENTS];
static boolean disableEvents=false;
protected String comment;
public EventTrace( String comment){
this.comment=comment;
}
public EventTrace(){
comment=null;
}
public String toString(){
return comment;
}
static public void addEvent( EventTrace event){
if (disableEvents) {
return;
}
int nextEventIdx=currentEvent++ % MAX_EVENTS;
events[nextEventIdx]=event;
threadIdHashes[nextEventIdx]=System.identityHashCode(Thread.currentThread());
}
static public void addEvent( String comment){
if (disableEvents) {
return;
}
addEvent(new EventTrace(comment));
}
static public void dumpEvents(){
if (disableEvents) {
return;
}
System.out.println("----- Event Dump -----");
EventTrace[] oldEvents=events;
int[] oldThreadIdHashes=threadIdHashes;
disableEvents=true;
int j=0;
for (int i=currentEvent; j < MAX_EVENTS; i++) {
EventTrace ev=oldEvents[i % MAX_EVENTS];
if (ev != null) {
int thisEventIdx=i % MAX_EVENTS;
System.out.print(oldThreadIdHashes[thisEventIdx] + " ");
System.out.println(j + "(" + thisEventIdx+ "): "+ ev);
}
j++;
}
}
static public class ExceptionEventTrace extends EventTrace {
private Exception event;
public ExceptionEventTrace(){
event=new Exception();
}
public String toString(){
return Tracer.getStackTrace(event);
}
}
}