Mercurial > hg > nginx
comparison src/core/ngx_slab.c @ 6827:0e61510c56c4
Slab: simplified some math.
No functional changes.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Wed, 07 Dec 2016 22:25:37 +0300 |
parents | d0404c9a7675 |
children | 99770a5ea14f |
comparison
equal
deleted
inserted
replaced
6826:d0404c9a7675 | 6827:0e61510c56c4 |
---|---|
215 | 215 |
216 if (shift < ngx_slab_exact_shift) { | 216 if (shift < ngx_slab_exact_shift) { |
217 | 217 |
218 bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page); | 218 bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page); |
219 | 219 |
220 map = (1 << (ngx_pagesize_shift - shift)) | 220 map = (ngx_pagesize >> shift) / (sizeof(uintptr_t) * 8); |
221 / (sizeof(uintptr_t) * 8); | |
222 | 221 |
223 for (n = 0; n < map; n++) { | 222 for (n = 0; n < map; n++) { |
224 | 223 |
225 if (bitmap[n] != NGX_SLAB_BUSY) { | 224 if (bitmap[n] != NGX_SLAB_BUSY) { |
226 | 225 |
229 continue; | 228 continue; |
230 } | 229 } |
231 | 230 |
232 bitmap[n] |= m; | 231 bitmap[n] |= m; |
233 | 232 |
234 i = ((n * sizeof(uintptr_t) * 8) << shift) | 233 i = (n * sizeof(uintptr_t) * 8 + i) << shift; |
235 + (i << shift); | |
236 | 234 |
237 if (bitmap[n] == NGX_SLAB_BUSY) { | 235 if (bitmap[n] == NGX_SLAB_BUSY) { |
238 for (n = n + 1; n < map; n++) { | 236 for (n = n + 1; n < map; n++) { |
239 if (bitmap[n] != NGX_SLAB_BUSY) { | 237 if (bitmap[n] != NGX_SLAB_BUSY) { |
240 p = (uintptr_t) bitmap + i; | 238 p = (uintptr_t) bitmap + i; |
281 goto done; | 279 goto done; |
282 } | 280 } |
283 | 281 |
284 } else { /* shift > ngx_slab_exact_shift */ | 282 } else { /* shift > ngx_slab_exact_shift */ |
285 | 283 |
286 n = ngx_pagesize_shift - (page->slab & NGX_SLAB_SHIFT_MASK); | 284 mask = ((uintptr_t) 1 << (ngx_pagesize >> shift)) - 1; |
287 n = 1 << n; | 285 mask <<= NGX_SLAB_MAP_SHIFT; |
288 n = ((uintptr_t) 1 << n) - 1; | |
289 mask = n << NGX_SLAB_MAP_SHIFT; | |
290 | 286 |
291 for (m = (uintptr_t) 1 << NGX_SLAB_MAP_SHIFT, i = 0; | 287 for (m = (uintptr_t) 1 << NGX_SLAB_MAP_SHIFT, i = 0; |
292 m & mask; | 288 m & mask; |
293 m <<= 1, i++) | 289 m <<= 1, i++) |
294 { | 290 { |
321 | 317 |
322 if (page) { | 318 if (page) { |
323 if (shift < ngx_slab_exact_shift) { | 319 if (shift < ngx_slab_exact_shift) { |
324 bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page); | 320 bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page); |
325 | 321 |
326 s = 1 << shift; | 322 n = (ngx_pagesize >> shift) / ((1 << shift) * 8); |
327 n = (1 << (ngx_pagesize_shift - shift)) / 8 / s; | |
328 | 323 |
329 if (n == 0) { | 324 if (n == 0) { |
330 n = 1; | 325 n = 1; |
331 } | 326 } |
332 | 327 |
333 bitmap[0] = (2 << n) - 1; | 328 bitmap[0] = ((uintptr_t) 2 << n) - 1; |
334 | 329 |
335 map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8); | 330 map = (ngx_pagesize >> shift) / (sizeof(uintptr_t) * 8); |
336 | 331 |
337 for (i = 1; i < map; i++) { | 332 for (i = 1; i < map; i++) { |
338 bitmap[i] = 0; | 333 bitmap[i] = 0; |
339 } | 334 } |
340 | 335 |
342 page->next = &slots[slot]; | 337 page->next = &slots[slot]; |
343 page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL; | 338 page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL; |
344 | 339 |
345 slots[slot].next = page; | 340 slots[slot].next = page; |
346 | 341 |
347 p = ngx_slab_page_addr(pool, page) + s * n; | 342 p = ngx_slab_page_addr(pool, page) + (n << shift); |
348 | 343 |
349 goto done; | 344 goto done; |
350 | 345 |
351 } else if (shift == ngx_slab_exact_shift) { | 346 } else if (shift == ngx_slab_exact_shift) { |
352 | 347 |
455 if ((uintptr_t) p & (size - 1)) { | 450 if ((uintptr_t) p & (size - 1)) { |
456 goto wrong_chunk; | 451 goto wrong_chunk; |
457 } | 452 } |
458 | 453 |
459 n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift; | 454 n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift; |
460 m = (uintptr_t) 1 << (n & (sizeof(uintptr_t) * 8 - 1)); | 455 m = (uintptr_t) 1 << (n % (sizeof(uintptr_t) * 8)); |
461 n /= (sizeof(uintptr_t) * 8); | 456 n /= sizeof(uintptr_t) * 8; |
462 bitmap = (uintptr_t *) | 457 bitmap = (uintptr_t *) |
463 ((uintptr_t) p & ~((uintptr_t) ngx_pagesize - 1)); | 458 ((uintptr_t) p & ~((uintptr_t) ngx_pagesize - 1)); |
464 | 459 |
465 if (bitmap[n] & m) { | 460 if (bitmap[n] & m) { |
466 | 461 |
475 page->next->prev = (uintptr_t) page | NGX_SLAB_SMALL; | 470 page->next->prev = (uintptr_t) page | NGX_SLAB_SMALL; |
476 } | 471 } |
477 | 472 |
478 bitmap[n] &= ~m; | 473 bitmap[n] &= ~m; |
479 | 474 |
480 n = (1 << (ngx_pagesize_shift - shift)) / 8 / (1 << shift); | 475 n = (ngx_pagesize >> shift) / ((1 << shift) * 8); |
481 | 476 |
482 if (n == 0) { | 477 if (n == 0) { |
483 n = 1; | 478 n = 1; |
484 } | 479 } |
485 | 480 |
486 if (bitmap[0] & ~(((uintptr_t) 1 << n) - 1)) { | 481 if (bitmap[0] & ~(((uintptr_t) 1 << n) - 1)) { |
487 goto done; | 482 goto done; |
488 } | 483 } |
489 | 484 |
490 map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8); | 485 map = (ngx_pagesize >> shift) / (sizeof(uintptr_t) * 8); |
491 | 486 |
492 for (n = 1; n < map; n++) { | 487 for (n = 1; n < map; n++) { |
493 if (bitmap[n]) { | 488 if (bitmap[n]) { |
494 goto done; | 489 goto done; |
495 } | 490 } |