57a6c07a1ab751787c902a1d67d86f6228479e12
[WebKit-https.git] / Source / WebKit / win / Plugins / PluginMainThreadScheduler.cpp
1 /*
2  * Copyright (C) 2008 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "PluginMainThreadScheduler.h"
28
29 namespace WebCore {
30
31 PluginMainThreadScheduler& PluginMainThreadScheduler::scheduler()
32 {
33     DEPRECATED_DEFINE_STATIC_LOCAL(PluginMainThreadScheduler, scheduler, ());
34
35     return scheduler;
36 }
37
38 PluginMainThreadScheduler::PluginMainThreadScheduler()
39     : m_callPending(false)
40 {
41 }
42
43 void PluginMainThreadScheduler::scheduleCall(NPP npp, MainThreadFunction function, void* userData)
44 {
45     DeprecatedMutexLocker lock(m_queueMutex);
46
47     CallQueueMap::iterator it = m_callQueueMap.find(npp);
48     if (it == m_callQueueMap.end())
49         return;
50
51     it->value.append(Call(function, userData));
52
53     if (!m_callPending) {
54         callOnMainThread(mainThreadCallback, this);
55         m_callPending = true;
56     }
57 }
58
59 void PluginMainThreadScheduler::registerPlugin(NPP npp)
60 {
61     DeprecatedMutexLocker lock(m_queueMutex);
62
63     ASSERT(!m_callQueueMap.contains(npp));
64     m_callQueueMap.set(npp, Deque<Call>());
65 }
66
67 void PluginMainThreadScheduler::unregisterPlugin(NPP npp)
68 {
69     DeprecatedMutexLocker lock(m_queueMutex);
70
71     ASSERT(m_callQueueMap.contains(npp));
72     m_callQueueMap.remove(npp);
73 }
74
75 void PluginMainThreadScheduler::dispatchCallsForPlugin(NPP npp, const Deque<Call>& calls)
76 {
77     for (auto& call : calls) {
78         // Check if the plug-in has been destroyed.
79         {
80             DeprecatedMutexLocker lock(m_queueMutex);
81             if (!m_callQueueMap.contains(npp))
82                 return;
83         }
84
85         call.performCall();
86     }
87 }
88
89 void PluginMainThreadScheduler::dispatchCalls()
90 {
91     m_queueMutex.lock();
92     CallQueueMap copy(m_callQueueMap);
93
94     // Empty all the queues in the original map
95     for (auto& call : m_callQueueMap.values())
96         call.clear();
97
98     m_callPending = false;
99     m_queueMutex.unlock();
100
101     for (auto& entry : copy)
102         dispatchCallsForPlugin(entry.key, entry.value);
103 }
104
105 void PluginMainThreadScheduler::mainThreadCallback(void* context)
106 {
107     static_cast<PluginMainThreadScheduler*>(context)->dispatchCalls();
108 }
109
110 } // namespace WebCore