< 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
*** 892,912 **** // 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")); --- 892,911 ---- // 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 or for child contexts (reentrance) ! private static final ConcurrentLinkedQueue<Object> rdrCtxQueue ! = new ConcurrentLinkedQueue<Object>(); // Static initializer to use TL or CLQ mode static { useThreadLocal = MarlinProperties.isUseThreadLocal(); rdrCtxThreadLocal = (useThreadLocal) ? new ThreadLocal<Object>() : null; // Soft reference by default: String refType = AccessController.doPrivileged( new GetPropertyAction("sun.java2d.renderer.useRef", "soft"));
*** 1024,1064 **** * @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; } /** * Reset and return the given RendererContext instance for reuse * @param rdrCtx RendererContext instance */ static void returnRendererContext(final RendererContext rdrCtx) { rdrCtx.dispose(); if (doMonitors) { RendererContext.stats.mon_pre_getAATileGenerator.stop(); } ! if (!useThreadLocal) { rdrCtxQueue.offer(rdrCtx.reference); } } } --- 1023,1089 ---- * @return RendererContext instance */ @SuppressWarnings({"unchecked"}) static RendererContext getRendererContext() { RendererContext rdrCtx = null; ! if (useThreadLocal) { ! final Object ref = rdrCtxThreadLocal.get(); ! if (ref != null) { ! rdrCtx = (REF_TYPE == REF_HARD) ? ((RendererContext) ref) ! : ((Reference<RendererContext>) ref).get(); ! } ! if (rdrCtx == null) { ! // create a new RendererContext (TL) if none is available ! rdrCtx = RendererContext.createContext(false); // update thread local reference: rdrCtxThreadLocal.set(rdrCtx.reference); } + // Check reentrance: + if (rdrCtx.usedTL) { + // get or create another RendererContext: + rdrCtx = getOrCreateContextFromQueue(); + } else { + // TL mode: set used flag: + rdrCtx.usedTL = true; + } + } else { + rdrCtx = getOrCreateContextFromQueue(); } if (doMonitors) { RendererContext.stats.mon_pre_getAATileGenerator.start(); } return rdrCtx; } + @SuppressWarnings({"unchecked"}) + private static RendererContext getOrCreateContextFromQueue() { + RendererContext rdrCtx = null; + final Object ref = rdrCtxQueue.poll(); + if (ref != null) { + rdrCtx = (REF_TYPE == REF_HARD) ? ((RendererContext) ref) + : ((Reference<RendererContext>) ref).get(); + } + if (rdrCtx == null) { + // create a new RendererContext (QUEUE) if none is available + rdrCtx = RendererContext.createContext(true); + } + return rdrCtx; + } + /** * Reset and return the given RendererContext instance for reuse * @param rdrCtx RendererContext instance */ static void returnRendererContext(final RendererContext rdrCtx) { rdrCtx.dispose(); if (doMonitors) { RendererContext.stats.mon_pre_getAATileGenerator.stop(); } ! if (!useThreadLocal || rdrCtx.storageQueue) { rdrCtxQueue.offer(rdrCtx.reference); + } else { + // TL mode: unset used flag: + rdrCtx.usedTL = false; } } }
< prev index next >