1a6424c2e397d1e5df883a807619d5c1bbbbb03a
[WebKit-https.git] / Source / WebKit / UIProcess / WebProcessCache.h
1 /*
2  * Copyright (C) 2019 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
27 #pragma once
28
29 #include <wtf/HashMap.h>
30 #include <wtf/RunLoop.h>
31 #include <wtf/text/WTFString.h>
32
33 namespace WebKit {
34
35 class WebProcessPool;
36 class WebProcessProxy;
37 class WebsiteDataStore;
38
39 class WebProcessCache {
40     WTF_MAKE_FAST_ALLOCATED;
41 public:
42     explicit WebProcessCache(WebProcessPool&);
43
44     bool addProcessIfPossible(const String& registrableDomain, Ref<WebProcessProxy>&&);
45     RefPtr<WebProcessProxy> takeProcess(const String& registrableDomain, WebsiteDataStore&);
46
47     void updateCapacity(WebProcessPool&);
48     unsigned capacity() { return m_capacity; }
49
50     unsigned size() const { return m_processesPerRegistrableDomain.size(); }
51
52     void setIsDisabled(bool isDisabled) { m_isDisabled = isDisabled; }
53
54     void clear();
55     void setApplicationIsActive(bool);
56
57 private:
58     static Seconds cachedProcessLifetime;
59     static Seconds clearingDelayAfterApplicationResignsActive;
60
61     void evictProcess(WebProcessProxy&);
62     void platformInitialize();
63     bool addProcess(const String& registrableDomain, Ref<WebProcessProxy>&&);
64
65     unsigned m_capacity { 0 };
66     bool m_isDisabled { false };
67
68     class CachedProcess {
69         WTF_MAKE_FAST_ALLOCATED;
70     public:
71         CachedProcess(Ref<WebProcessProxy>&&);
72         ~CachedProcess();
73
74         Ref<WebProcessProxy> takeProcess();
75         WebProcessProxy& process() { ASSERT(m_process); return *m_process; }
76
77     private:
78         void evictionTimerFired();
79
80         RefPtr<WebProcessProxy> m_process;
81         RunLoop::Timer<CachedProcess> m_evictionTimer;
82     };
83
84     HashMap<String, std::unique_ptr<CachedProcess>> m_processesPerRegistrableDomain;
85     RunLoop::Timer<WebProcessCache> m_evictionTimer;
86 };
87
88 } // namespace WebKit