CodeBlock::prepareForExecution() is silly
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGWorklist.h
1 /*
2  * Copyright (C) 2013 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 DFGWorklist_h
27 #define DFGWorklist_h
28
29 #include <wtf/Platform.h>
30
31 #if ENABLE(DFG_JIT)
32
33 #include "DFGPlan.h"
34 #include <wtf/Deque.h>
35 #include <wtf/HashMap.h>
36 #include <wtf/Noncopyable.h>
37 #include <wtf/PassOwnPtr.h>
38 #include <wtf/ThreadingPrimitives.h>
39
40 namespace JSC { namespace DFG {
41
42 class Worklist : public RefCounted<Worklist> {
43 public:
44     enum State { NotKnown, Compiling, Compiled };
45
46     ~Worklist();
47     
48     static PassRefPtr<Worklist> create(unsigned numberOfThreads);
49     
50     void enqueue(PassRefPtr<Plan>);
51     
52     // This is equivalent to:
53     // worklist->waitUntilAllPlansForVMAreReady(vm);
54     // worklist->completeAllReadyPlansForVM(vm);
55     void completeAllPlansForVM(VM&);
56     
57     void waitUntilAllPlansForVMAreReady(VM&);
58     State completeAllReadyPlansForVM(VM&, CodeBlock* profiledBlock = 0);
59     void removeAllReadyPlansForVM(VM&);
60     
61     State compilationState(CodeBlock* profiledBlock);
62     
63     size_t queueLength();
64     void dump(PrintStream&) const;
65     
66 private:
67     Worklist();
68     void finishCreation(unsigned numberOfThreads);
69     
70     void runThread();
71     static void threadFunction(void* argument);
72     
73     void removeAllReadyPlansForVM(VM&, Vector<RefPtr<Plan>, 8>&);
74
75     void dump(const MutexLocker&, PrintStream&) const;
76
77     // Used to inform the thread about what work there is left to do.
78     Deque<RefPtr<Plan>, 16> m_queue;
79     
80     // Used to answer questions about the current state of a code block. This
81     // is particularly great for the cti_optimize OSR slow path, which wants
82     // to know: did I get here because a better version of me just got
83     // compiled?
84     typedef HashMap<RefPtr<CodeBlock>, RefPtr<Plan> > PlanMap;
85     PlanMap m_plans;
86     
87     // Used to quickly find which plans have been compiled and are ready to
88     // be completed.
89     Vector<RefPtr<Plan>, 16> m_readyPlans;
90     
91     mutable Mutex m_lock;
92     ThreadCondition m_planEnqueued;
93     ThreadCondition m_planCompiled;
94     Vector<ThreadIdentifier> m_threads;
95     unsigned m_numberOfActiveThreads;
96 };
97
98 // For now we use a single global worklist. It's not clear that this
99 // is the right thing to do, but it is what we do, for now. This function
100 // will lazily create one when it's needed.
101 //
102 // This returns null if for any reason we shouldn't be doing concurrent
103 // compilation.
104 Worklist* globalWorklist();
105
106 } } // namespace JSC::DFG
107
108 #endif // ENABLE(DFG_JIT)
109
110 #endif // DFGWorklist_h
111