Avoid copy-prone idiom "for (auto item : collection)"
[WebKit-https.git] / Source / JavaScriptCore / heap / CodeBlockSet.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 CodeBlockSet_h
27 #define CodeBlockSet_h
28
29 #include "GCSegmentedArray.h"
30 #include <wtf/HashSet.h>
31 #include <wtf/Noncopyable.h>
32 #include <wtf/PassRefPtr.h>
33 #include <wtf/RefPtr.h>
34
35 namespace JSC {
36
37 class BlockAllocator;
38 class CodeBlock;
39 class Heap;
40 class SlotVisitor;
41
42 // CodeBlockSet tracks all CodeBlocks. Every CodeBlock starts out with one
43 // reference coming in from GC. The GC is responsible for freeing CodeBlocks
44 // once they hasOneRef() and nobody is running code from that CodeBlock.
45
46 class CodeBlockSet {
47     WTF_MAKE_NONCOPYABLE(CodeBlockSet);
48
49 public:
50     CodeBlockSet(BlockAllocator&);
51     ~CodeBlockSet();
52     
53     // Add a CodeBlock. This is only called by CodeBlock constructors.
54     void add(PassRefPtr<CodeBlock>);
55     
56     // Clear all mark bits associated with DFG code blocks.
57     void clearMarks();
58     
59     // Mark a pointer that may be a CodeBlock that belongs to the set of DFG
60     // blocks. This is defined in CodeBlock.h.
61     void mark(CodeBlock* candidateCodeBlock);
62     void mark(void* candidateCodeBlock);
63     
64     // Delete all code blocks that are only referenced by this set (i.e. owned
65     // by this set), and that have not been marked.
66     void deleteUnmarkedAndUnreferenced();
67     
68     void remove(CodeBlock*);
69     
70     // Trace all marked code blocks. The CodeBlock is free to make use of
71     // mayBeExecuting.
72     void traceMarked(SlotVisitor&);
73
74     // Add all currently executing CodeBlocks to the remembered set to be 
75     // re-scanned during the next collection.
76     void rememberCurrentlyExecutingCodeBlocks(Heap*);
77
78     // Visits each CodeBlock in the heap until the visitor function returns true
79     // to indicate that it is done iterating, or until every CodeBlock has been
80     // visited.
81     template<typename Functor> void iterate(Functor& functor)
82     {
83         for (auto& codeBlock : m_set) {
84             bool done = functor(codeBlock);
85             if (done)
86                 break;
87         }
88     }
89
90 private:
91     // This is not a set of RefPtr<CodeBlock> because we need to be able to find
92     // arbitrary bogus pointers. I could have written a thingy that had peek types
93     // and all, but that seemed like overkill.
94     HashSet<CodeBlock* > m_set;
95     GCSegmentedArray<CodeBlock*> m_currentlyExecuting;
96 };
97
98 } // namespace JSC
99
100 #endif // CodeBlockSet_h
101