OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CallbackStack_h | 5 #ifndef CallbackStack_h |
6 #define CallbackStack_h | 6 #define CallbackStack_h |
7 | 7 |
8 #include "platform/heap/ThreadState.h" | 8 #include "platform/heap/ThreadState.h" |
9 #include "wtf/Allocator.h" | 9 #include "wtf/Allocator.h" |
10 #include "wtf/Assertions.h" | 10 #include "wtf/Assertions.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 } | 30 } |
31 void* object() { return m_object; } | 31 void* object() { return m_object; } |
32 VisitorCallback callback() { return m_callback; } | 32 VisitorCallback callback() { return m_callback; } |
33 void call(Visitor* visitor) { m_callback(visitor, m_object); } | 33 void call(Visitor* visitor) { m_callback(visitor, m_object); } |
34 | 34 |
35 private: | 35 private: |
36 void* m_object; | 36 void* m_object; |
37 VisitorCallback m_callback; | 37 VisitorCallback m_callback; |
38 }; | 38 }; |
39 | 39 |
40 CallbackStack(); | 40 explicit CallbackStack(size_t); |
41 ~CallbackStack(); | 41 ~CallbackStack(); |
42 | 42 |
43 void clear(); | 43 void clear(); |
44 | 44 |
45 Item* allocateEntry(); | 45 Item* allocateEntry(); |
46 Item* pop(); | 46 Item* pop(); |
47 | 47 |
48 bool isEmpty() const; | 48 bool isEmpty() const; |
49 | 49 |
50 void invokeEphemeronCallbacks(Visitor*); | 50 void invokeEphemeronCallbacks(Visitor*); |
51 | 51 |
52 #if ENABLE(ASSERT) | 52 #if ENABLE(ASSERT) |
53 bool hasCallbackForObject(const void*); | 53 bool hasCallbackForObject(const void*); |
54 #endif | 54 #endif |
55 | 55 |
56 private: | 56 private: |
57 static const size_t blockSize = 8192; | |
58 | |
59 class Block { | 57 class Block { |
60 USING_FAST_MALLOC(Block); | 58 USING_FAST_MALLOC(Block); |
61 public: | 59 public: |
62 explicit Block(Block* next) | 60 explicit Block(Block*, size_t); |
63 : m_limit(&(m_buffer[blockSize])) | 61 ~Block(); |
64 , m_current(&(m_buffer[0])) | |
65 , m_next(next) | |
66 { | |
67 clearUnused(); | |
68 } | |
69 | |
70 ~Block() | |
71 { | |
72 clearUnused(); | |
73 } | |
74 | 62 |
75 void clear(); | 63 void clear(); |
76 | 64 |
77 Block* next() const { return m_next; } | 65 Block* next() const { return m_next; } |
78 void setNext(Block* next) { m_next = next; } | 66 void setNext(Block* next) { m_next = next; } |
| 67 size_t blockSize() const { return m_blockSize; } |
79 | 68 |
80 bool isEmptyBlock() const | 69 bool isEmptyBlock() const |
81 { | 70 { |
82 return m_current == &(m_buffer[0]); | 71 return m_current == &(m_buffer[0]); |
83 } | 72 } |
84 | 73 |
85 size_t size() const | |
86 { | |
87 return blockSize - (m_limit - m_current); | |
88 } | |
89 | |
90 Item* allocateEntry() | 74 Item* allocateEntry() |
91 { | 75 { |
92 if (LIKELY(m_current < m_limit)) | 76 if (LIKELY(m_current < m_limit)) |
93 return m_current++; | 77 return m_current++; |
94 return nullptr; | 78 return nullptr; |
95 } | 79 } |
96 | 80 |
97 Item* pop() | 81 Item* pop() |
98 { | 82 { |
99 if (UNLIKELY(isEmptyBlock())) | 83 if (UNLIKELY(isEmptyBlock())) |
100 return nullptr; | 84 return nullptr; |
101 return --m_current; | 85 return --m_current; |
102 } | 86 } |
103 | 87 |
104 void invokeEphemeronCallbacks(Visitor*); | 88 void invokeEphemeronCallbacks(Visitor*); |
105 #if ENABLE(ASSERT) | 89 #if ENABLE(ASSERT) |
106 bool hasCallbackForObject(const void*); | 90 bool hasCallbackForObject(const void*); |
107 #endif | 91 #endif |
108 | 92 |
109 private: | 93 private: |
110 void clearUnused(); | 94 void clearUnused(); |
111 | 95 |
112 Item m_buffer[blockSize]; | 96 Item* m_buffer; |
113 Item* m_limit; | 97 Item* m_limit; |
114 Item* m_current; | 98 Item* m_current; |
115 Block* m_next; | 99 Block* m_next; |
| 100 size_t m_blockSize; |
116 }; | 101 }; |
117 | 102 |
118 Item* popSlow(); | 103 Item* popSlow(); |
119 Item* allocateEntrySlow(); | 104 Item* allocateEntrySlow(); |
120 void invokeOldestCallbacks(Block*, Block*, Visitor*); | 105 void invokeOldestCallbacks(Block*, Block*, Visitor*); |
121 bool hasJustOneBlock() const; | 106 bool hasJustOneBlock() const; |
122 | 107 |
123 Block* m_first; | 108 Block* m_first; |
124 Block* m_last; | 109 Block* m_last; |
125 }; | 110 }; |
(...skipping 12 matching lines...) Expand all Loading... |
138 Item* item = m_first->pop(); | 123 Item* item = m_first->pop(); |
139 if (LIKELY(!!item)) | 124 if (LIKELY(!!item)) |
140 return item; | 125 return item; |
141 | 126 |
142 return popSlow(); | 127 return popSlow(); |
143 } | 128 } |
144 | 129 |
145 } // namespace blink | 130 } // namespace blink |
146 | 131 |
147 #endif // CallbackStack_h | 132 #endif // CallbackStack_h |
OLD | NEW |