REGRESSION (r213412): JPEG premultiplication tests fail under GuardMalloc
[WebKit-https.git] / Source / WebCore / platform / graphics / cg / IOSurfacePool.h
1 /*
2  * Copyright (C) 2013, 2014 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 IOSurfacePool_h
27 #define IOSurfacePool_h
28
29 #if USE(IOSURFACE)
30
31 #include "IOSurface.h"
32 #include "IntSize.h"
33 #include "IntSizeHash.h"
34 #include "Timer.h"
35 #include <wtf/Deque.h>
36 #include <wtf/HashMap.h>
37 #include <wtf/NeverDestroyed.h>
38
39 namespace WebCore {
40
41 class IOSurfacePool {
42     WTF_MAKE_NONCOPYABLE(IOSurfacePool);
43     WTF_MAKE_FAST_ALLOCATED;
44     friend class NeverDestroyed<IOSurfacePool>;
45
46 public:
47     WEBCORE_EXPORT static IOSurfacePool& sharedPool();
48
49     std::unique_ptr<IOSurface> takeSurface(IntSize, CGColorSpaceRef, IOSurface::Format);
50     WEBCORE_EXPORT void addSurface(std::unique_ptr<IOSurface>);
51
52     void discardAllSurfaces();
53
54     WEBCORE_EXPORT void setPoolSize(size_t);
55
56 private:
57     IOSurfacePool();
58
59     struct CachedSurfaceDetails {
60         CachedSurfaceDetails()
61             : hasMarkedPurgeable(false)
62         { }
63
64         void resetLastUseTime() { lastUseTime = std::chrono::steady_clock::now(); }
65
66         std::chrono::steady_clock::time_point lastUseTime;
67         bool hasMarkedPurgeable;
68     };
69
70     typedef Deque<std::unique_ptr<IOSurface>> CachedSurfaceQueue;
71     typedef HashMap<IntSize, CachedSurfaceQueue> CachedSurfaceMap;
72     typedef HashMap<IOSurface*, CachedSurfaceDetails> CachedSurfaceDetailsMap;
73     
74     bool shouldCacheSurface(const IOSurface&) const;
75
76     void willAddSurface(IOSurface&, bool inUse);
77     void didRemoveSurface(IOSurface&, bool inUse);
78     void didUseSurfaceOfSize(IntSize);
79
80     void insertSurfaceIntoPool(std::unique_ptr<IOSurface>);
81
82     void evict(size_t additionalSize);
83     void tryEvictInUseSurface();
84     void tryEvictOldestCachedSurface();
85
86     void scheduleCollectionTimer();
87     void collectionTimerFired();
88     void collectInUseSurfaces();
89     bool markOlderSurfacesPurgeable();
90
91     void platformGarbageCollectNow();
92
93     void showPoolStatistics(const char*);
94
95     Timer m_collectionTimer;
96     CachedSurfaceMap m_cachedSurfaces;
97     CachedSurfaceQueue m_inUseSurfaces;
98     CachedSurfaceDetailsMap m_surfaceDetails;
99     Vector<IntSize> m_sizesInPruneOrder;
100
101     size_t m_bytesCached;
102     size_t m_inUseBytesCached;
103     size_t m_maximumBytesCached;
104 };
105
106 }
107 #endif // USE(IOSURFACE)
108
109 #endif // IOSurfacePool_h