All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.prism.impl.ResourcePool Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2013, 2014, 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
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.sun.prism.impl;

/**
 * An interface for tracking the usage of a particular resource from which
 * managed resources are allocated.
 * A given resource pool may share its underlying space with another
 * resource pool, such as the case of allocating textures from the Java
 * heap.
 * In the case of a shared resource, the {@link used()} and {@link max()}
 * methods will return absolute values indicating the amounts used or
 * available for all resources that come from the shared pool, but the
 * {@link managed()} method will only indicate the amount of the resource
 * used for managed resources and the {@link target()} method will return
 * the amount of the total shared resource that the allocation methods
 * should attempt to stay under.
 * 
 *     long newsize = ...; // size of new resource allocation
 *     if (pool.used() + newsize >= pool.target()) {
 *         cleanup(pool);
 *         // possibly multiple passes of increasing aggressiveness
 *     }
 *     if (pool.used() + newsize >= pool.max()) {
 *         throw OOM();
 *     }
 *     allocate(newsize);
 * 
* The amounts and sizes returned from the methods should all be in the * same units, usually bytes. * * @param the type of resource stored in this pool * @see ManagedResource */ public interface ResourcePool { /** * Check that all resources are in the correct state for an idle condition * and free any resources which were disposed from a non-resource thread. * This method must be called on a thread that is appropriate for disposing * and managing resources for this resource pool. * The boolean {@code forgiveStaleLocks} parameter is used to indicate that * an exceptional condition occurred which caused the caller to abort a * cycle of resource usage, potentially with outstanding resource locks. * This method will unlock all non-permanent resources that have outstanding * locks if {@code forgiveStaleLocks} is {@code true}, or it will print out * a warning and a resource summary if that parameter is {@code false}. * * @param forgiveStaleLocks {@code true} if the caller wishes to forgive * and unlock all outstanding locks on non-permanent resources */ public void freeDisposalRequestedAndCheckResources(boolean forgiveStaleLocks); /** * True if Thread.currentThread() is a thread that created this ResourcePool * @return true if Thread.currentThread() is a thread that created this ResourcePool */ public boolean isManagerThread(); /** * The amount of a resource currently being used to hold any kind of * resource, whether managed or not. * @return the amount being used */ public long used(); /** * The amount of this resource currently being used to hold managed * resources. * This amount may be less than the amount returned by the {@link used()} * method if the pool is shared amongst other resources. * @return the amount being used to hold managed resources */ public long managed(); /** * The total space available in this pool for allocating any kind of * resource, even unmanaged resources, and including those resources * already allocated. * @return the maximum amount of the resource */ public long max(); /** * The current target of the maximum amount of space in this resource pool * that should be used so as to be friendly to other parts of the system. * This number must be less than or equal to the amount returned by the * {@link max()} method, larger than the amount returned by the * {@link origTarget()} method, and may change over time. * @return the current target amount of the resource to be used * @see #setTarget(long) */ public long target(); /** * The initial target of the maximum amount of space in this resource pool * that should be used so as to be friendly to other parts of the system. * This number must be less than or equal to the amount returned by the * {@link max()} method. * @return the initial target amount of the resource to be used */ public long origTarget(); /** * Sets a new current target of the maximum amount of space in this * resource pool that should be used so as to be friendly to other parts * of the system. * The specified {@code newTarget} number must be less than or equal to * the amount returned by the {@link max()} method, larger than the amount * returned by the {@link origTarget()} method. * @param newTarget the new current target to be set */ public void setTarget(long newTarget); /** * The estimated size of the indicated resource. * * @param resource the resource to be measured * @return the space within this resource pool that the object occupies. */ public long size(T resource); /** * Record the indicated amount of the resource as being allocated for * a {@link ManagedResource}. * * @param size the amount of the resource to be indicated as managed. */ public void recordAllocated(long size); /** * Record the indicated amount of the resource as no longer being * held in a {@link ManagedResource}. * * @param size the amount of the resource to remove from the managed amount. */ public void recordFree(long size); /** * Record the {@link ManagedResource} object as being currently managed * by this pool. * * @param resource the resource that is now being managed */ public void resourceManaged(ManagedResource resource); /** * Record the {@link ManagedResource} object as no longer being managed * by this pool. * * @param resource the resource that is freed, no longer being managed */ public void resourceFreed(ManagedResource resource); /** * Prepare for an allocation of a resource from this pool of the * indicated size by freeing up uninteresting resources until the * allocation fits within the target() or max() sizes. * * @param size the size of the resource that is about to be allocated * @return true if there is room for the indicated resource */ public boolean prepareForAllocation(long size); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy