Mercurial > hg > nginx-quic
comparison src/core/ngx_slab.c @ 1016:d0e8c81d3bb7
fix slab allocator on 64-bit platfroms
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 11 Jan 2007 18:58:40 +0000 |
parents | 1cb178720355 |
children | 06306a20b8bb |
comparison
equal
deleted
inserted
replaced
1015:32ebb6b13ff3 | 1016:d0e8c81d3bb7 |
---|---|
126 pool->pages->slab = pages; | 126 pool->pages->slab = pages; |
127 pool->pages->next = &pool->free; | 127 pool->pages->next = &pool->free; |
128 pool->pages->prev = (uintptr_t) &pool->free; | 128 pool->pages->prev = (uintptr_t) &pool->free; |
129 | 129 |
130 pool->start = (u_char *) | 130 pool->start = (u_char *) |
131 ngx_align((uintptr_t) p + pages * sizeof(ngx_slab_page_t), | 131 ngx_align_ptr((uintptr_t) p + pages * sizeof(ngx_slab_page_t), |
132 ngx_pagesize); | 132 ngx_pagesize); |
133 | 133 |
134 m = pages - (pool->end - pool->start) / ngx_pagesize; | 134 m = pages - (pool->end - pool->start) / ngx_pagesize; |
135 if (m > 0) { | 135 if (m > 0) { |
136 pages -= m; | 136 pages -= m; |
293 | 293 |
294 } else { /* shift > ngx_slab_exact_shift */ | 294 } else { /* shift > ngx_slab_exact_shift */ |
295 | 295 |
296 n = ngx_pagesize_shift - (page->slab & NGX_SLAB_SHIFT_MASK); | 296 n = ngx_pagesize_shift - (page->slab & NGX_SLAB_SHIFT_MASK); |
297 n = 1 << n; | 297 n = 1 << n; |
298 n = (1 << n) - 1; | 298 n = ((uintptr_t) 1 << n) - 1; |
299 mask = n << NGX_SLAB_MAP_SHIFT; | 299 mask = n << NGX_SLAB_MAP_SHIFT; |
300 | 300 |
301 do { | 301 do { |
302 if ((page->slab & NGX_SLAB_MAP_MASK) != mask) { | 302 if ((page->slab & NGX_SLAB_MAP_MASK) != mask) { |
303 | 303 |
448 if ((uintptr_t) p & (size - 1)) { | 448 if ((uintptr_t) p & (size - 1)) { |
449 goto wrong_chunk; | 449 goto wrong_chunk; |
450 } | 450 } |
451 | 451 |
452 n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift; | 452 n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift; |
453 m = 1 << (n & (sizeof(uintptr_t) * 8 - 1)); | 453 m = (uintptr_t) 1 << (n & (sizeof(uintptr_t) * 8 - 1)); |
454 n /= (sizeof(uintptr_t) * 8); | 454 n /= (sizeof(uintptr_t) * 8); |
455 bitmap = (uintptr_t *) ((uintptr_t) p & ~(ngx_pagesize - 1)); | 455 bitmap = (uintptr_t *) ((uintptr_t) p & ~(ngx_pagesize - 1)); |
456 | 456 |
457 if (bitmap[n] & m) { | 457 if (bitmap[n] & m) { |
458 | 458 |
474 | 474 |
475 if (n == 0) { | 475 if (n == 0) { |
476 n = 1; | 476 n = 1; |
477 } | 477 } |
478 | 478 |
479 if (bitmap[0] & ~((1 << n) - 1)) { | 479 if (bitmap[0] & ~(((uintptr_t) 1 << n) - 1)) { |
480 goto done; | 480 goto done; |
481 } | 481 } |
482 | 482 |
483 map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8); | 483 map = (1 << (ngx_pagesize_shift - shift)) / (sizeof(uintptr_t) * 8); |
484 | 484 |
495 | 495 |
496 goto chunk_already_free; | 496 goto chunk_already_free; |
497 | 497 |
498 case NGX_SLAB_EXACT: | 498 case NGX_SLAB_EXACT: |
499 | 499 |
500 m = 1 << (((uintptr_t) p & (ngx_pagesize - 1)) >> ngx_slab_exact_shift); | 500 m = (uintptr_t) 1 << |
501 (((uintptr_t) p & (ngx_pagesize - 1)) >> ngx_slab_exact_shift); | |
501 size = ngx_slab_exact_size; | 502 size = ngx_slab_exact_size; |
502 | 503 |
503 if ((uintptr_t) p & (size - 1)) { | 504 if ((uintptr_t) p & (size - 1)) { |
504 goto wrong_chunk; | 505 goto wrong_chunk; |
505 } | 506 } |
537 | 538 |
538 if ((uintptr_t) p & (size - 1)) { | 539 if ((uintptr_t) p & (size - 1)) { |
539 goto wrong_chunk; | 540 goto wrong_chunk; |
540 } | 541 } |
541 | 542 |
542 m = 1 << ((((uintptr_t) p & (ngx_pagesize - 1)) >> shift) | 543 m = (uintptr_t) 1 << ((((uintptr_t) p & (ngx_pagesize - 1)) >> shift) |
543 + NGX_SLAB_MAP_SHIFT); | 544 + NGX_SLAB_MAP_SHIFT); |
544 | 545 |
545 if (slab & m) { | 546 if (slab & m) { |
546 | 547 |
547 if (page->next == NULL) { | 548 if (page->next == NULL) { |
548 slots = (ngx_slab_page_t *) | 549 slots = (ngx_slab_page_t *) |