• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef PluginMainThreadScheduler_h
27 #define PluginMainThreadScheduler_h
28 
29 #include <wtf/Deque.h>
30 #include <wtf/HashMap.h>
31 #include <wtf/MainThread.h>
32 #include <wtf/Threading.h>
33 
34 typedef struct _NPP NPP_t;
35 typedef NPP_t* NPP;
36 
37 namespace WebCore {
38 
39 class PluginMainThreadScheduler : public Noncopyable {
40 public:
41     typedef void MainThreadFunction(void*);
42 
43     static PluginMainThreadScheduler& scheduler();
44 
45     void scheduleCall(NPP, MainThreadFunction*, void* userData);
46 
47     void registerPlugin(NPP);
48     void unregisterPlugin(NPP);
49 
50 private:
51     PluginMainThreadScheduler();
52     void dispatchCalls();
53 
54     class Call;
55 
56     void dispatchCallsForPlugin(NPP, const Deque<Call>& calls);
57     typedef HashMap<NPP, Deque<Call> > CallQueueMap;
58 
59     static void mainThreadCallback(void* context);
60 
61     class Call {
62     public:
Call(MainThreadFunction * function,void * userData)63         Call(MainThreadFunction* function, void* userData)
64             : m_function(function)
65             , m_userData(userData)
66         {
67         }
68 
performCall()69         void performCall() const
70         {
71             m_function(m_userData);
72         }
73 
74     private:
75         MainThreadFunction* m_function;
76         void* m_userData;
77     };
78 
79     bool m_callPending;
80     CallQueueMap m_callQueueMap;
81     Mutex m_queueMutex;
82 };
83 
84 } // namespace WebCore
85 
86 #endif // PluginMainThreadScheduler_h
87