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 }