1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef LegacyTileLayerPool_h 27#define LegacyTileLayerPool_h 28 29#if PLATFORM(IOS) 30 31#include "IntSize.h" 32#include "IntSizeHash.h" 33#include "Timer.h" 34#include <wtf/Deque.h> 35#include <wtf/HashMap.h> 36#include <wtf/NeverDestroyed.h> 37#include <wtf/OwnPtr.h> 38#include <wtf/RetainPtr.h> 39#include <wtf/Threading.h> 40#include <wtf/Vector.h> 41 42@class LegacyTileLayer; 43 44namespace WebCore { 45 46class LegacyTileLayerPool { 47 WTF_MAKE_NONCOPYABLE(LegacyTileLayerPool); 48public: 49 static LegacyTileLayerPool* sharedPool(); 50 51 void addLayer(const RetainPtr<LegacyTileLayer>&); 52 RetainPtr<LegacyTileLayer> takeLayerWithSize(const IntSize&); 53 54 // The maximum size of all queued layers in bytes. 55 unsigned capacity() const { return m_capacity; } 56 void setCapacity(unsigned); 57 void drain(); 58 59 unsigned decayedCapacity() const; 60 61 static unsigned bytesBackingLayerWithPixelSize(const IntSize&); 62 63private: 64 LegacyTileLayerPool(); 65 66 typedef Deque<RetainPtr<LegacyTileLayer> > LayerList; 67 68 bool canReuseLayerWithSize(const IntSize& size) const { return m_capacity && !size.isEmpty(); } 69 void schedulePrune(); 70 void prune(); 71 typedef enum { LeaveUnchanged, MarkAsUsed } AccessType; 72 LayerList& listOfLayersWithSize(const IntSize&, AccessType = LeaveUnchanged); 73 74 HashMap<IntSize, LayerList> m_reuseLists; 75 // Ordered by recent use. The last size is the most recently used. 76 Vector<IntSize> m_sizesInPruneOrder; 77 unsigned m_totalBytes; 78 unsigned m_capacity; 79 Mutex m_layerPoolMutex; 80 81 double m_lastAddTime; 82 bool m_needsPrune; 83 84 friend NeverDestroyed<LegacyTileLayerPool>; 85}; 86 87} // namespace WebCore 88 89#endif // PLATFORM(IOS) 90#endif // TileLayerPool_h 91