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 c60beecc6ab5
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 *)