1/* 2 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package sun.java2d.jules; 27 28import java.util.*; 29 30public class IdleTileCache { 31 static final int IDLE_TILE_SYNC_GRANULARITY = 16; 32 static final ArrayList<JulesTile> idleBuffers = new ArrayList<JulesTile>(); 33 34 ArrayList<JulesTile> idleTileWorkerCacheList = new ArrayList<JulesTile>(); 35 ArrayList<JulesTile> idleTileConsumerCacheList = 36 new ArrayList<JulesTile>(IDLE_TILE_SYNC_GRANULARITY); 37 38 /** 39 * Return a cached Tile, if possible from cache. 40 * Allowed caller: Rasterizer/Producer-Thread 41 * 42 * @param: maxCache - Specify the maximum amount of tiles needed 43 */ 44 public JulesTile getIdleTileWorker(int maxCache) { 45 /* Try to fetch idle tiles from the global cache list */ 46 if (idleTileWorkerCacheList.size() == 0) { 47 idleTileWorkerCacheList.ensureCapacity(maxCache); 48 49 synchronized (idleBuffers) { 50 for (int i = 0; i < maxCache && idleBuffers.size() > 0; i++) { 51 idleTileWorkerCacheList.add( 52 idleBuffers.remove(idleBuffers.size() - 1)); 53 } 54 } 55 } 56 57 if (idleTileWorkerCacheList.size() > 0) { 58 return idleTileWorkerCacheList.remove(idleTileWorkerCacheList.size() - 1); 59 } 60 61 return new JulesTile(); 62 } 63 64 /** 65 * Release tile and allow it to be re-used by another thread. Allowed 66 * Allowed caller: MaskBlit/Consumer-Thread 67 */ 68 public void releaseTile(JulesTile tile) { 69 if (tile != null && tile.hasBuffer()) { 70 idleTileConsumerCacheList.add(tile); 71 72 if (idleTileConsumerCacheList.size() > IDLE_TILE_SYNC_GRANULARITY) { 73 synchronized (idleBuffers) { 74 idleBuffers.addAll(idleTileConsumerCacheList); 75 } 76 idleTileConsumerCacheList.clear(); 77 } 78 } 79 } 80 81 /** 82 * Releases thread-local tiles cached for use by the rasterizing thread. 83 * Allowed caller: Rasterizer/Producer-Thread 84 */ 85 public void disposeRasterizerResources() { 86 releaseTiles(idleTileWorkerCacheList); 87 } 88 89 /** 90 * Releases thread-local tiles cached for performance reasons. Allowed 91 * Allowed caller: MaskBlit/Consumer-Thread 92 */ 93 public void disposeConsumerResources() { 94 releaseTiles(idleTileConsumerCacheList); 95 } 96 97 /** 98 * Release a list of tiles and allow it to be re-used by another thread. 99 * Thread safe. 100 */ 101 public void releaseTiles(List<JulesTile> tileList) { 102 if (tileList.size() > 0) { 103 synchronized (idleBuffers) { 104 idleBuffers.addAll(tileList); 105 } 106 tileList.clear(); 107 } 108 } 109} 110