// Copyright 2006 Google Inc. // All Rights Reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in // the documentation and/or other materials provided with the // distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE // COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. /** * @fileoverview Datastructure: Priority Pool. * * * An extending of Pool that handles queueing and prioritization. */ goog.provide('goog.structs.PriorityPool'); goog.require('goog.structs.Pool'); goog.require('goog.structs.PriorityQueue'); /** * A generic pool class. If max is greater than min, an error is thrown. * @param {number} opt_minCount Min. number of objects (Default: 1). * @param {number} opt_maxCount Max. number of objects (Default: 10). * @constructor * @extends {goog.structs.Pool} */ goog.structs.PriorityPool = function(opt_minCount, opt_maxCount) { /** * Queue of requests for pool objects. * @type {goog.structs.PriorirtyQueue} * @private */ this.requestQueue_ = new goog.structs.PriorityQueue(); // Must break convention of putting the super-class's constructor first. This // is because the super-class constructor calls adjustForMinMax, which this // class overrides. In this class's implementation, it assumes that there // is a requestQueue_, and will error if not present. goog.structs.Pool.call(this, opt_minCount, opt_maxCount); }; goog.inherits(goog.structs.PriorityPool, goog.structs.Pool); /** * Default priority for pool objects requests. * @type {number} * @private */ goog.structs.PriorityPool.DEFAULT_PRIORITY_ = 100; /** * Get a new object from the the pool, if there is one available, otherwise * return undefined. * @param {Function} opt_callback The function to callback when an object is * available. This could be immediately. If this is not present, then an * object is immediately returned if available, or undefined if not. * @param {Object} opt_priority The priority of the request. * @return {Object|undefined} The new object from the pool if there is one * available and a callback is not given. Otherwise, undefined. */ goog.structs.PriorityPool.prototype.getObject = function(opt_callback, opt_priority) { if (!opt_callback) { return goog.structs.PriorityPool.superClass_.getObject.call(this); } var priority = opt_priority || goog.structs.PriorityPool.DEFAULT_PRIORITY_; this.requestQueue_.enqueue(priority, opt_callback); // Handle all requests. this.handleQueueRequests_(); return undefined; }; /** * Handles the request queue. Tries to fires off as many queued requests as * possible. * @private */ goog.structs.PriorityPool.prototype.handleQueueRequests_ = function() { var requestQueue = this.requestQueue_; while (requestQueue.getCount() > 0) { var obj = this.getObject(); if (!obj) { return; } else { var requestCallback = requestQueue.dequeue(); requestCallback.apply(this, [obj]); } } }; /** * Adds an object to the collection of objects that are free. If the object can * not be added, then it is disposed. * * NOTE: This method does not remove the object from the in use collection. * * @param {Object} obj The object to add to the collection of free objects. */ goog.structs.PriorityPool.prototype.addFreeObject = function(obj) { goog.structs.PriorityPool.superClass_.addFreeObject.call(this, obj); // Handle all requests. this.handleQueueRequests_(); }; /** * Adjusts the objects held in the pool to be within the min/max constraints. * * NOTE: It is possible that the number of objects in the pool will still be * greater than the maximum count of objects allowed. This will be the case * if no more free objects can be disposed of to get below the minimum count * (i.e., all objects are in use). */ goog.structs.PriorityPool.prototype.adjustForMinMax = function() { goog.structs.PriorityPool.superClass_.adjustForMinMax.call(this); // Handle all requests. this.handleQueueRequests_(); }; /** * Disposes of the pool. */ goog.structs.PriorityPool.prototype.disposeInternal = function() { goog.structs.PriorityPool.superClass_.disposeInternal.call(this); this.requestQueue_.clear(); this.requestQueue_ = null; };