< prev index next >
src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 28,42 ****
import java.awt.BasicStroke;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
- import java.lang.ref.Reference;
import java.security.AccessController;
- import java.util.concurrent.ConcurrentLinkedQueue;
import static sun.java2d.marlin.MarlinUtils.logInfo;
import sun.awt.geom.PathConsumer2D;
import sun.java2d.pipe.AATileGenerator;
import sun.java2d.pipe.Region;
import sun.java2d.pipe.RenderingEngine;
import sun.security.action.GetPropertyAction;
--- 28,43 ----
import java.awt.BasicStroke;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.security.AccessController;
import static sun.java2d.marlin.MarlinUtils.logInfo;
import sun.awt.geom.PathConsumer2D;
+ import sun.java2d.ReentrantContextProvider;
+ import sun.java2d.ReentrantContextProviderCLQ;
+ import sun.java2d.ReentrantContextProviderTL;
import sun.java2d.pipe.AATileGenerator;
import sun.java2d.pipe.Region;
import sun.java2d.pipe.RenderingEngine;
import sun.security.action.GetPropertyAction;
*** 880,929 ****
// --- RendererContext handling ---
// use ThreadLocal or ConcurrentLinkedQueue to get one RendererContext
private static final boolean useThreadLocal;
- // hard reference
- static final int REF_HARD = 0;
- // soft reference
- static final int REF_SOFT = 1;
- // weak reference
- static final int REF_WEAK = 2;
-
// reference type stored in either TL or CLQ
static final int REF_TYPE;
// Per-thread RendererContext
! private static final ThreadLocal<Object> rdrCtxThreadLocal;
! // RendererContext queue when ThreadLocal is disabled
! private static final ConcurrentLinkedQueue<Object> rdrCtxQueue;
// Static initializer to use TL or CLQ mode
static {
- // CLQ mode by default:
useThreadLocal = MarlinProperties.isUseThreadLocal();
- rdrCtxThreadLocal = (useThreadLocal) ? new ThreadLocal<Object>()
- : null;
- rdrCtxQueue = (!useThreadLocal) ? new ConcurrentLinkedQueue<Object>()
- : null;
// Soft reference by default:
! String refType = AccessController.doPrivileged(
new GetPropertyAction("sun.java2d.renderer.useRef",
"soft"));
switch (refType) {
default:
case "soft":
! REF_TYPE = REF_SOFT;
break;
case "weak":
! REF_TYPE = REF_WEAK;
break;
case "hard":
! REF_TYPE = REF_HARD;
break;
}
}
private static boolean settingsLogged = !enableLogs;
private static void logSettings(final String reClass) {
--- 881,934 ----
// --- RendererContext handling ---
// use ThreadLocal or ConcurrentLinkedQueue to get one RendererContext
private static final boolean useThreadLocal;
// reference type stored in either TL or CLQ
static final int REF_TYPE;
// Per-thread RendererContext
! private static final ReentrantContextProvider<RendererContext> rdrCtxProvider;
// Static initializer to use TL or CLQ mode
static {
useThreadLocal = MarlinProperties.isUseThreadLocal();
// Soft reference by default:
! final String refType = AccessController.doPrivileged(
new GetPropertyAction("sun.java2d.renderer.useRef",
"soft"));
switch (refType) {
default:
case "soft":
! REF_TYPE = ReentrantContextProvider.REF_SOFT;
break;
case "weak":
! REF_TYPE = ReentrantContextProvider.REF_WEAK;
break;
case "hard":
! REF_TYPE = ReentrantContextProvider.REF_HARD;
break;
}
+
+ if (useThreadLocal) {
+ rdrCtxProvider = new ReentrantContextProviderTL<RendererContext>(REF_TYPE)
+ {
+ @Override
+ protected RendererContext newContext() {
+ return RendererContext.createContext();
+ }
+ };
+ } else {
+ rdrCtxProvider = new ReentrantContextProviderCLQ<RendererContext>(REF_TYPE)
+ {
+ @Override
+ protected RendererContext newContext() {
+ return RendererContext.createContext();
+ }
+ };
+ }
}
private static boolean settingsLogged = !enableLogs;
private static void logSettings(final String reClass) {
*** 934,950 ****
settingsLogged = true;
String refType;
switch (REF_TYPE) {
default:
! case REF_HARD:
refType = "hard";
break;
! case REF_SOFT:
refType = "soft";
break;
! case REF_WEAK:
refType = "weak";
break;
}
logInfo("=========================================================="
--- 939,955 ----
settingsLogged = true;
String refType;
switch (REF_TYPE) {
default:
! case ReentrantContextProvider.REF_HARD:
refType = "hard";
break;
! case ReentrantContextProvider.REF_SOFT:
refType = "soft";
break;
! case ReentrantContextProvider.REF_WEAK:
refType = "weak";
break;
}
logInfo("=========================================================="
*** 1023,1048 ****
* Get the RendererContext instance dedicated to the current thread
* @return RendererContext instance
*/
@SuppressWarnings({"unchecked"})
static RendererContext getRendererContext() {
! RendererContext rdrCtx = null;
! final Object ref = (useThreadLocal) ? rdrCtxThreadLocal.get()
! : rdrCtxQueue.poll();
! if (ref != null) {
! // resolve reference:
! rdrCtx = (REF_TYPE == REF_HARD) ? ((RendererContext) ref)
! : ((Reference<RendererContext>) ref).get();
! }
! // create a new RendererContext if none is available
! if (rdrCtx == null) {
! rdrCtx = RendererContext.createContext();
! if (useThreadLocal) {
! // update thread local reference:
! rdrCtxThreadLocal.set(rdrCtx.reference);
! }
! }
if (doMonitors) {
RendererContext.stats.mon_pre_getAATileGenerator.start();
}
return rdrCtx;
}
--- 1028,1038 ----
* Get the RendererContext instance dedicated to the current thread
* @return RendererContext instance
*/
@SuppressWarnings({"unchecked"})
static RendererContext getRendererContext() {
! final RendererContext rdrCtx = rdrCtxProvider.acquire();
if (doMonitors) {
RendererContext.stats.mon_pre_getAATileGenerator.start();
}
return rdrCtx;
}
*** 1055,1064 ****
rdrCtx.dispose();
if (doMonitors) {
RendererContext.stats.mon_pre_getAATileGenerator.stop();
}
! if (!useThreadLocal) {
! rdrCtxQueue.offer(rdrCtx.reference);
! }
}
}
--- 1045,1052 ----
rdrCtx.dispose();
if (doMonitors) {
RendererContext.stats.mon_pre_getAATileGenerator.stop();
}
! rdrCtxProvider.release(rdrCtx);
}
}
< prev index next >