|
Lines 1-5
Source/WTF/wtf/Bitmap.h_sec1
|
| 1 |
/* |
1 |
/* |
| 2 |
* Copyright (C) 2010 Apple Inc. All rights reserved. |
2 |
* Copyright (C) 2010, 2013 Apple Inc. All rights reserved. |
| 3 |
* |
3 |
* |
| 4 |
* This library is free software; you can redistribute it and/or |
4 |
* This library is free software; you can redistribute it and/or |
| 5 |
* modify it under the terms of the GNU Lesser General Public |
5 |
* modify it under the terms of the GNU Lesser General Public |
|
Lines 19-24
Source/WTF/wtf/Bitmap.h_sec2
|
| 19 |
#ifndef Bitmap_h |
19 |
#ifndef Bitmap_h |
| 20 |
#define Bitmap_h |
20 |
#define Bitmap_h |
| 21 |
|
21 |
|
|
|
22 |
#include <wtf/AtomicMode.h> |
| 22 |
#include <wtf/Atomics.h> |
23 |
#include <wtf/Atomics.h> |
| 23 |
#include <wtf/FixedArray.h> |
24 |
#include <wtf/FixedArray.h> |
| 24 |
#include <wtf/StdLibExtras.h> |
25 |
#include <wtf/StdLibExtras.h> |
|
Lines 27-42
Source/WTF/wtf/Bitmap.h_sec3
|
| 27 |
|
28 |
|
| 28 |
namespace WTF { |
29 |
namespace WTF { |
| 29 |
|
30 |
|
| 30 |
enum BitmapAtomicMode { |
31 |
template<size_t size, AtomicMode atomicMode = ModeNotAtomic> |
| 31 |
// This makes concurrentTestAndSet behave just like testAndSet. |
|
|
| 32 |
BitmapNotAtomic, |
| 33 |
|
| 34 |
// This makes concurrentTestAndSet use compareAndSwap, so that it's |
| 35 |
// atomic even when used concurrently. |
| 36 |
BitmapAtomic |
| 37 |
}; |
| 38 |
|
| 39 |
template<size_t size, BitmapAtomicMode atomicMode = BitmapNotAtomic> |
| 40 |
class Bitmap { |
32 |
class Bitmap { |
| 41 |
private: |
33 |
private: |
| 42 |
typedef uint32_t WordType; |
34 |
typedef uint32_t WordType; |
|
Lines 72-96
private:
Source/WTF/wtf/Bitmap.h_sec4
|
| 72 |
FixedArray<WordType, words> bits; |
64 |
FixedArray<WordType, words> bits; |
| 73 |
}; |
65 |
}; |
| 74 |
|
66 |
|
| 75 |
template<size_t size, BitmapAtomicMode atomicMode> |
67 |
template<size_t size, AtomicMode atomicMode> |
| 76 |
inline Bitmap<size, atomicMode>::Bitmap() |
68 |
inline Bitmap<size, atomicMode>::Bitmap() |
| 77 |
{ |
69 |
{ |
| 78 |
clearAll(); |
70 |
clearAll(); |
| 79 |
} |
71 |
} |
| 80 |
|
72 |
|
| 81 |
template<size_t size, BitmapAtomicMode atomicMode> |
73 |
template<size_t size, AtomicMode atomicMode> |
| 82 |
inline bool Bitmap<size, atomicMode>::get(size_t n) const |
74 |
inline bool Bitmap<size, atomicMode>::get(size_t n) const |
| 83 |
{ |
75 |
{ |
| 84 |
return !!(bits[n / wordSize] & (one << (n % wordSize))); |
76 |
return !!(bits[n / wordSize] & (one << (n % wordSize))); |
| 85 |
} |
77 |
} |
| 86 |
|
78 |
|
| 87 |
template<size_t size, BitmapAtomicMode atomicMode> |
79 |
template<size_t size, AtomicMode atomicMode> |
| 88 |
inline void Bitmap<size, atomicMode>::set(size_t n) |
80 |
inline void Bitmap<size, atomicMode>::set(size_t n) |
| 89 |
{ |
81 |
{ |
| 90 |
bits[n / wordSize] |= (one << (n % wordSize)); |
82 |
bits[n / wordSize] |= (one << (n % wordSize)); |
| 91 |
} |
83 |
} |
| 92 |
|
84 |
|
| 93 |
template<size_t size, BitmapAtomicMode atomicMode> |
85 |
template<size_t size, AtomicMode atomicMode> |
| 94 |
inline bool Bitmap<size, atomicMode>::testAndSet(size_t n) |
86 |
inline bool Bitmap<size, atomicMode>::testAndSet(size_t n) |
| 95 |
{ |
87 |
{ |
| 96 |
WordType mask = one << (n % wordSize); |
88 |
WordType mask = one << (n % wordSize); |
|
Lines 100-106
inline bool Bitmap<size, atomicMode>::te
Source/WTF/wtf/Bitmap.h_sec5
|
| 100 |
return result; |
92 |
return result; |
| 101 |
} |
93 |
} |
| 102 |
|
94 |
|
| 103 |
template<size_t size, BitmapAtomicMode atomicMode> |
95 |
template<size_t size, AtomicMode atomicMode> |
| 104 |
inline bool Bitmap<size, atomicMode>::testAndClear(size_t n) |
96 |
inline bool Bitmap<size, atomicMode>::testAndClear(size_t n) |
| 105 |
{ |
97 |
{ |
| 106 |
WordType mask = one << (n % wordSize); |
98 |
WordType mask = one << (n % wordSize); |
|
Lines 110-122
inline bool Bitmap<size, atomicMode>::te
Source/WTF/wtf/Bitmap.h_sec6
|
| 110 |
return result; |
102 |
return result; |
| 111 |
} |
103 |
} |
| 112 |
|
104 |
|
| 113 |
template<size_t size, BitmapAtomicMode atomicMode> |
105 |
template<size_t size, AtomicMode atomicMode> |
| 114 |
inline bool Bitmap<size, atomicMode>::concurrentTestAndSet(size_t n) |
106 |
inline bool Bitmap<size, atomicMode>::concurrentTestAndSet(size_t n) |
| 115 |
{ |
107 |
{ |
| 116 |
if (atomicMode == BitmapNotAtomic) |
108 |
if (atomicMode == ModeNotAtomic) |
| 117 |
return testAndSet(n); |
109 |
return testAndSet(n); |
| 118 |
|
110 |
|
| 119 |
ASSERT(atomicMode == BitmapAtomic); |
111 |
ASSERT(atomicMode == ModeAtomic); |
| 120 |
|
112 |
|
| 121 |
WordType mask = one << (n % wordSize); |
113 |
WordType mask = one << (n % wordSize); |
| 122 |
size_t index = n / wordSize; |
114 |
size_t index = n / wordSize; |
|
Lines 130-142
inline bool Bitmap<size, atomicMode>::co
Source/WTF/wtf/Bitmap.h_sec7
|
| 130 |
return false; |
122 |
return false; |
| 131 |
} |
123 |
} |
| 132 |
|
124 |
|
| 133 |
template<size_t size, BitmapAtomicMode atomicMode> |
125 |
template<size_t size, AtomicMode atomicMode> |
| 134 |
inline bool Bitmap<size, atomicMode>::concurrentTestAndClear(size_t n) |
126 |
inline bool Bitmap<size, atomicMode>::concurrentTestAndClear(size_t n) |
| 135 |
{ |
127 |
{ |
| 136 |
if (atomicMode == BitmapNotAtomic) |
128 |
if (atomicMode == ModeNotAtomic) |
| 137 |
return testAndClear(n); |
129 |
return testAndClear(n); |
| 138 |
|
130 |
|
| 139 |
ASSERT(atomicMode == BitmapAtomic); |
131 |
ASSERT(atomicMode == ModeAtomic); |
| 140 |
|
132 |
|
| 141 |
WordType mask = one << (n % wordSize); |
133 |
WordType mask = one << (n % wordSize); |
| 142 |
size_t index = n / wordSize; |
134 |
size_t index = n / wordSize; |
|
Lines 150-168
inline bool Bitmap<size, atomicMode>::co
Source/WTF/wtf/Bitmap.h_sec8
|
| 150 |
return true; |
142 |
return true; |
| 151 |
} |
143 |
} |
| 152 |
|
144 |
|
| 153 |
template<size_t size, BitmapAtomicMode atomicMode> |
145 |
template<size_t size, AtomicMode atomicMode> |
| 154 |
inline void Bitmap<size, atomicMode>::clear(size_t n) |
146 |
inline void Bitmap<size, atomicMode>::clear(size_t n) |
| 155 |
{ |
147 |
{ |
| 156 |
bits[n / wordSize] &= ~(one << (n % wordSize)); |
148 |
bits[n / wordSize] &= ~(one << (n % wordSize)); |
| 157 |
} |
149 |
} |
| 158 |
|
150 |
|
| 159 |
template<size_t size, BitmapAtomicMode atomicMode> |
151 |
template<size_t size, AtomicMode atomicMode> |
| 160 |
inline void Bitmap<size, atomicMode>::clearAll() |
152 |
inline void Bitmap<size, atomicMode>::clearAll() |
| 161 |
{ |
153 |
{ |
| 162 |
memset(bits.data(), 0, sizeof(bits)); |
154 |
memset(bits.data(), 0, sizeof(bits)); |
| 163 |
} |
155 |
} |
| 164 |
|
156 |
|
| 165 |
template<size_t size, BitmapAtomicMode atomicMode> |
157 |
template<size_t size, AtomicMode atomicMode> |
| 166 |
inline size_t Bitmap<size, atomicMode>::nextPossiblyUnset(size_t start) const |
158 |
inline size_t Bitmap<size, atomicMode>::nextPossiblyUnset(size_t start) const |
| 167 |
{ |
159 |
{ |
| 168 |
if (!~bits[start / wordSize]) |
160 |
if (!~bits[start / wordSize]) |
|
Lines 170-176
inline size_t Bitmap<size, atomicMode>::
Source/WTF/wtf/Bitmap.h_sec9
|
| 170 |
return start + 1; |
162 |
return start + 1; |
| 171 |
} |
163 |
} |
| 172 |
|
164 |
|
| 173 |
template<size_t size, BitmapAtomicMode atomicMode> |
165 |
template<size_t size, AtomicMode atomicMode> |
| 174 |
inline int64_t Bitmap<size, atomicMode>::findRunOfZeros(size_t runLength) const |
166 |
inline int64_t Bitmap<size, atomicMode>::findRunOfZeros(size_t runLength) const |
| 175 |
{ |
167 |
{ |
| 176 |
if (!runLength) |
168 |
if (!runLength) |
|
Lines 190-196
inline int64_t Bitmap<size, atomicMode>:
Source/WTF/wtf/Bitmap.h_sec10
|
| 190 |
return -1; |
182 |
return -1; |
| 191 |
} |
183 |
} |
| 192 |
|
184 |
|
| 193 |
template<size_t size, BitmapAtomicMode atomicMode> |
185 |
template<size_t size, AtomicMode atomicMode> |
| 194 |
inline size_t Bitmap<size, atomicMode>::count(size_t start) const |
186 |
inline size_t Bitmap<size, atomicMode>::count(size_t start) const |
| 195 |
{ |
187 |
{ |
| 196 |
size_t result = 0; |
188 |
size_t result = 0; |
|
Lines 203-209
inline size_t Bitmap<size, atomicMode>::
Source/WTF/wtf/Bitmap.h_sec11
|
| 203 |
return result; |
195 |
return result; |
| 204 |
} |
196 |
} |
| 205 |
|
197 |
|
| 206 |
template<size_t size, BitmapAtomicMode atomicMode> |
198 |
template<size_t size, AtomicMode atomicMode> |
| 207 |
inline size_t Bitmap<size, atomicMode>::isEmpty() const |
199 |
inline size_t Bitmap<size, atomicMode>::isEmpty() const |
| 208 |
{ |
200 |
{ |
| 209 |
for (size_t i = 0; i < words; ++i) |
201 |
for (size_t i = 0; i < words; ++i) |
|
Lines 212-218
inline size_t Bitmap<size, atomicMode>::
Source/WTF/wtf/Bitmap.h_sec12
|
| 212 |
return true; |
204 |
return true; |
| 213 |
} |
205 |
} |
| 214 |
|
206 |
|
| 215 |
template<size_t size, BitmapAtomicMode atomicMode> |
207 |
template<size_t size, AtomicMode atomicMode> |
| 216 |
inline size_t Bitmap<size, atomicMode>::isFull() const |
208 |
inline size_t Bitmap<size, atomicMode>::isFull() const |
| 217 |
{ |
209 |
{ |
| 218 |
for (size_t i = 0; i < words; ++i) |
210 |
for (size_t i = 0; i < words; ++i) |