Changes in kernel/generic/src/adt/bitmap.c [89ea2dc:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/adt/bitmap.c
r89ea2dc ra35b458 62 62 size_t byte = element / BITMAP_ELEMENT; 63 63 uint8_t mask = 1 << (element & BITMAP_REMAINER); 64 64 65 65 return !!((bitmap->bits)[byte] & mask); 66 66 } … … 78 78 { 79 79 size_t size = elements / BITMAP_ELEMENT; 80 80 81 81 if ((elements % BITMAP_ELEMENT) != 0) 82 82 size++; 83 83 84 84 return size; 85 85 } … … 113 113 { 114 114 assert(start + count <= bitmap->elements); 115 115 116 116 if (count == 0) 117 117 return; 118 118 119 119 size_t start_byte = start / BITMAP_ELEMENT; 120 120 size_t aligned_start = ALIGN_UP(start, BITMAP_ELEMENT); 121 121 122 122 /* Leading unaligned bits */ 123 123 size_t lub = min(aligned_start - start, count); 124 124 125 125 /* Aligned middle bits */ 126 126 size_t amb = (count > lub) ? (count - lub) : 0; 127 127 128 128 /* Trailing aligned bits */ 129 129 size_t tab = amb % BITMAP_ELEMENT; 130 130 131 131 if (start + count < aligned_start) { 132 132 /* Set bits in the middle of byte. */ … … 135 135 return; 136 136 } 137 137 138 138 if (lub) { 139 139 /* Make sure to set any leading unaligned bits. */ … … 141 141 ~((1 << (BITMAP_ELEMENT - lub)) - 1); 142 142 } 143 143 144 144 size_t i; 145 145 146 146 for (i = 0; i < amb / BITMAP_ELEMENT; i++) { 147 147 /* The middle bits can be set byte by byte. */ … … 149 149 ALL_ONES; 150 150 } 151 151 152 152 if (tab) { 153 153 /* Make sure to set any trailing aligned bits. */ … … 167 167 { 168 168 assert(start + count <= bitmap->elements); 169 169 170 170 if (count == 0) 171 171 return; 172 172 173 173 size_t start_byte = start / BITMAP_ELEMENT; 174 174 size_t aligned_start = ALIGN_UP(start, BITMAP_ELEMENT); 175 175 176 176 /* Leading unaligned bits */ 177 177 size_t lub = min(aligned_start - start, count); 178 178 179 179 /* Aligned middle bits */ 180 180 size_t amb = (count > lub) ? (count - lub) : 0; 181 181 182 182 /* Trailing aligned bits */ 183 183 size_t tab = amb % BITMAP_ELEMENT; 184 184 185 185 if (start + count < aligned_start) { 186 186 /* Set bits in the middle of byte */ … … 189 189 return; 190 190 } 191 191 192 192 if (lub) { 193 193 /* Make sure to clear any leading unaligned bits. */ … … 195 195 (1 << (BITMAP_ELEMENT - lub)) - 1; 196 196 } 197 197 198 198 size_t i; 199 199 200 200 for (i = 0; i < amb / BITMAP_ELEMENT; i++) { 201 201 /* The middle bits can be cleared byte by byte. */ … … 203 203 ALL_ZEROES; 204 204 } 205 205 206 206 if (tab) { 207 207 /* Make sure to clear any trailing aligned bits. */ … … 209 209 ~((1 << tab) - 1); 210 210 } 211 211 212 212 bitmap->next_fit = start_byte; 213 213 } … … 224 224 assert(count <= dst->elements); 225 225 assert(count <= src->elements); 226 226 227 227 size_t i; 228 228 229 229 for (i = 0; i < count / BITMAP_ELEMENT; i++) 230 230 dst->bits[i] = src->bits[i]; 231 231 232 232 if (count % BITMAP_ELEMENT) { 233 233 bitmap_clear_range(dst, i * BITMAP_ELEMENT, … … 274 274 if (count == 0) 275 275 return false; 276 276 277 277 size_t size = bitmap_size(bitmap->elements); 278 278 size_t next_fit = bitmap->next_fit; 279 279 280 280 /* 281 281 * Adjust the next-fit value according to the address … … 284 284 if ((prefered > base) && (prefered < base + bitmap->elements)) { 285 285 size_t prefered_fit = (prefered - base) / BITMAP_ELEMENT; 286 286 287 287 if (prefered_fit > next_fit) 288 288 next_fit = prefered_fit; 289 289 } 290 290 291 291 for (size_t pos = 0; pos < size; pos++) { 292 292 size_t byte = (next_fit + pos) % size; 293 293 294 294 /* Skip if the current byte has all bits set */ 295 295 if (bitmap->bits[byte] == ALL_ONES) 296 296 continue; 297 297 298 298 size_t byte_bit = byte * BITMAP_ELEMENT; 299 299 300 300 for (size_t bit = 0; bit < BITMAP_ELEMENT; bit++) { 301 301 size_t i = byte_bit + bit; 302 302 303 303 if (i >= bitmap->elements) 304 304 break; 305 305 306 306 if (!constraint_satisfy(i, base, constraint)) 307 307 continue; 308 308 309 309 if (!bitmap_get_fast(bitmap, i)) { 310 310 size_t continuous = 1; 311 311 312 312 for (size_t j = 1; j < count; j++) { 313 313 if ((i + j < bitmap->elements) && … … 317 317 break; 318 318 } 319 319 320 320 if (continuous == count) { 321 321 if (index != NULL) { … … 324 324 *index = i; 325 325 } 326 326 327 327 return true; 328 328 } else … … 331 331 } 332 332 } 333 333 334 334 return false; 335 335 }
Note:
See TracChangeset
for help on using the changeset viewer.