Mercurial > hg > nginx-ranges
comparison src/core/ngx_slab.c @ 274:052a7b1d40e5 NGINX_0_5_7
nginx 0.5.7
*) Feature: the ssl_session_cache storage optimization.
*) Bugfixes in the "ssl_session_cache" and "limit_zone" directives.
*) Bugfix: the segmentation fault was occurred on start or while
reconfiguration if the "ssl_session_cache" or "limit_zone"
directives were used on 64-bit platforms.
*) Bugfix: a segmentation fault occurred if the "add_before_body" or
"add_after_body" directives were used and there was no
"Content-Type" header line in response.
*) Bugfix: the OpenSSL library was always built with the threads
support.
Thanks to Den Ivanov.
*) Bugfix: the PCRE-6.5+ library and the icc compiler compatibility.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 15 Jan 2007 00:00:00 +0300 |
parents | 29a6403156b0 |
children | e10168d6e371 |
comparison
equal
deleted
inserted
replaced
273:60df8db42ffb | 274:052a7b1d40e5 |
---|---|
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 |
419 | 419 |
420 void | 420 void |
421 ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p) | 421 ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p) |
422 { | 422 { |
423 size_t size; | 423 size_t size; |
424 uintptr_t slab, *bitmap; | 424 uintptr_t slab, m, *bitmap; |
425 ngx_uint_t n, m, type, slot, shift, map; | 425 ngx_uint_t n, type, slot, shift, map; |
426 ngx_slab_page_t *slots, *page; | 426 ngx_slab_page_t *slots, *page; |
427 | 427 |
428 ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p); | 428 ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p); |
429 | 429 |
430 if ((u_char *) p < pool->start || (u_char *) p > pool->end) { | 430 if ((u_char *) p < pool->start || (u_char *) p > pool->end) { |
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 *) |