< prev index next >
src/java.desktop/share/classes/sun/java2d/loops/GraphicsPrimitive.java
Print this page
rev 55352 : JB_base_webrev
@@ -38,10 +38,11 @@
import sun.java2d.pipe.Region;
import java.lang.reflect.Field;
import java.util.StringTokenizer;
import java.util.Iterator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.io.PrintStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
@@ -320,44 +321,69 @@
static HashMap<Object, int[]> traceMap;
public static int traceflags;
public static String tracefile;
+ public static String pname;
public static PrintStream traceout;
+ public static long treshold = 0;
+ public static boolean verbose = false;
public static final int TRACELOG = 1;
public static final int TRACETIMESTAMP = 2;
public static final int TRACECOUNTS = 4;
+ public static final int TRACEPTIME = 8;
+ public static final int TRACEPNAME = 16;
+ public static final int TRACEPIMPL = 32;
+
+ static void showTraceUsage() {
+ System.err.println("usage: -Dsun.java2d.trace="+
+ "[log[,timestamp]],[count],[ptime],[pimpl],[name:<substr pattern>],"+
+ "[out:<filename>],[td=<treshold>],[help],[verbose]");
+ }
static {
GetPropertyAction gpa = new GetPropertyAction("sun.java2d.trace");
String trace = AccessController.doPrivileged(gpa);
if (trace != null) {
- boolean verbose = false;
int traceflags = 0;
StringTokenizer st = new StringTokenizer(trace, ",");
while (st.hasMoreTokens()) {
String tok = st.nextToken();
if (tok.equalsIgnoreCase("count")) {
traceflags |= GraphicsPrimitive.TRACECOUNTS;
} else if (tok.equalsIgnoreCase("log")) {
traceflags |= GraphicsPrimitive.TRACELOG;
} else if (tok.equalsIgnoreCase("timestamp")) {
traceflags |= GraphicsPrimitive.TRACETIMESTAMP;
+ } else if (tok.equalsIgnoreCase("ptime")) {
+ traceflags |=GraphicsPrimitive.TRACEPTIME;
+ } else if (tok.equalsIgnoreCase("pimpl")) {
+ traceflags |=GraphicsPrimitive.TRACEPIMPL;
+ } else if (tok.regionMatches(true, 0, "name:", 0, 5)) {
+ traceflags |=GraphicsPrimitive.TRACEPNAME;
+ pname = tok.substring(6);
} else if (tok.equalsIgnoreCase("verbose")) {
verbose = true;
} else if (tok.regionMatches(true, 0, "out:", 0, 4)) {
tracefile = tok.substring(4);
+ } else if (tok.regionMatches(true, 0, "td=", 0, 3)) {
+ try {
+ treshold = Long.parseLong(tok.substring(3));
+ } catch (NumberFormatException e) {
+ showTraceUsage();
+ }
} else {
if (!tok.equalsIgnoreCase("help")) {
System.err.println("unrecognized token: "+tok);
}
- System.err.println("usage: -Dsun.java2d.trace="+
- "[log[,timestamp]],[count],"+
- "[out:<filename>],[help],[verbose]");
+ showTraceUsage();
}
}
+
+ GraphicsPrimitiveMgr.setTraceFlags(traceflags);
+
if (verbose) {
System.err.print("GraphicsPrimitive logging ");
if ((traceflags & GraphicsPrimitive.TRACELOG) != 0) {
System.err.println("enabled");
System.err.print("GraphicsPrimitive timetamps ");
@@ -414,11 +440,16 @@
}
return traceout;
}
public static class TraceReporter implements Runnable {
- public static void setShutdownHook() {
+ private static boolean hookEnabled = false;
+
+ public static synchronized void setShutdownHook() {
+ if (hookEnabled) return;
+ hookEnabled = true;
+
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
TraceReporter t = new TraceReporter();
Thread thread = new Thread(
ThreadGroupUtils.getRootThreadGroup(), t,
"TraceReporter", 0, false);
@@ -428,10 +459,11 @@
});
}
public void run() {
PrintStream ps = getTraceOutputFile();
+ if (traceMap != null) {
Iterator<Map.Entry<Object, int[]>> iterator =
traceMap.entrySet().iterator();
long total = 0;
int numprims = 0;
while (iterator.hasNext()) {
@@ -439,26 +471,31 @@
Object prim = me.getKey();
int[] count = me.getValue();
if (count[0] == 1) {
ps.print("1 call to ");
} else {
- ps.print(count[0]+" calls to ");
+ ps.print(count[0] + " calls to ");
}
ps.println(prim);
numprims++;
total += count[0];
}
if (numprims == 0) {
ps.println("No graphics primitives executed");
} else if (numprims > 1) {
- ps.println(total+" total calls to "+
- numprims+" different primitives");
+ ps.println(total + " total calls to " +
+ numprims + " different primitives");
+ }
+ }
}
}
+
+ public synchronized static void tracePrimitive(Object prim) {
+ if ((traceflags & TRACEPNAME) != 0) {
+ if (!prim.toString().contains(pname)) return;
}
- public static synchronized void tracePrimitive(Object prim) {
if ((traceflags & TRACECOUNTS) != 0) {
if (traceMap == null) {
traceMap = new HashMap<>();
TraceReporter.setShutdownHook();
}
@@ -476,10 +513,44 @@
}
ps.println(prim);
}
}
+ public synchronized static void traceImplPrimitive(Object prim, Object msg) {
+ if ((traceflags & TRACEPNAME) != 0) {
+ if (!prim.toString().contains(pname)) return;
+ }
+
+ if ((traceflags & TRACEPIMPL) != 0) {
+ PrintStream ps = getTraceOutputFile();
+ if ((traceflags & TRACETIMESTAMP) != 0) {
+ ps.print(System.currentTimeMillis());
+ }
+ ps.println(prim + " : " + msg);
+ }
+ }
+
+
+ public synchronized static void tracePrimitiveTime(Object prim, long time) {
+ if ((traceflags & TRACEPNAME) != 0) {
+ if (!prim.toString().contains(pname)) return;
+ }
+ if (time > treshold && (traceflags & TRACEPTIME) != 0 && (traceflags & TRACELOG) != 0) {
+ PrintStream ps = getTraceOutputFile();
+ ps.println(prim + " time: " + time);
+ if (verbose) {
+ final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+ if (stackTrace.length > 3) {
+ for (int i = 3; i < stackTrace.length; i++) {
+ ps.println(" " + stackTrace[i].toString());
+ }
+ }
+ ps.println();
+ }
+ }
+ }
+
protected void setupGeneralBinaryOp(GeneralBinaryOp gbo) {
int primID = gbo.getPrimTypeID();
String methodSignature = gbo.getSignature();
SurfaceType srctype = gbo.getSourceType();
CompositeType comptype = gbo.getCompositeType();
< prev index next >