Mercurial > hg > nginx
comparison src/core/ngx_slab.c @ 2611:2bce3f6416c6
improve ngx_slab_alloc() error logging
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 27 Mar 2009 17:00:42 +0000 |
parents | 3a9b22405138 |
children | 6b87e875e87a |
comparison
equal
deleted
inserted
replaced
2610:3a9b22405138 | 2611:2bce3f6416c6 |
---|---|
61 | 61 |
62 static ngx_slab_page_t *ngx_slab_alloc_pages(ngx_slab_pool_t *pool, | 62 static ngx_slab_page_t *ngx_slab_alloc_pages(ngx_slab_pool_t *pool, |
63 ngx_uint_t pages); | 63 ngx_uint_t pages); |
64 static void ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page, | 64 static void ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page, |
65 ngx_uint_t pages); | 65 ngx_uint_t pages); |
66 static void ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level, | |
67 char *text); | |
66 | 68 |
67 | 69 |
68 static ngx_uint_t ngx_slab_max_size; | 70 static ngx_uint_t ngx_slab_max_size; |
69 static ngx_uint_t ngx_slab_exact_size; | 71 static ngx_uint_t ngx_slab_exact_size; |
70 static ngx_uint_t ngx_slab_exact_shift; | 72 static ngx_uint_t ngx_slab_exact_shift; |
127 m = pages - (pool->end - pool->start) / ngx_pagesize; | 129 m = pages - (pool->end - pool->start) / ngx_pagesize; |
128 if (m > 0) { | 130 if (m > 0) { |
129 pages -= m; | 131 pages -= m; |
130 pool->pages->slab = pages; | 132 pool->pages->slab = pages; |
131 } | 133 } |
134 | |
135 pool->log_ctx = &pool->zero; | |
136 pool->zero = '\0'; | |
132 } | 137 } |
133 | 138 |
134 | 139 |
135 void * | 140 void * |
136 ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size) | 141 ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size) |
413 ngx_slab_page_t *slots, *page; | 418 ngx_slab_page_t *slots, *page; |
414 | 419 |
415 ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p); | 420 ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p); |
416 | 421 |
417 if ((u_char *) p < pool->start || (u_char *) p > pool->end) { | 422 if ((u_char *) p < pool->start || (u_char *) p > pool->end) { |
418 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, | 423 ngx_slab_error(pool, NGX_LOG_ALERT, "ngx_slab_free(): outside of pool"); |
419 "ngx_slab_free(): outside of pool"); | |
420 goto fail; | 424 goto fail; |
421 } | 425 } |
422 | 426 |
423 n = ((u_char *) p - pool->start) >> ngx_pagesize_shift; | 427 n = ((u_char *) p - pool->start) >> ngx_pagesize_shift; |
424 page = &pool->pages[n]; | 428 page = &pool->pages[n]; |
562 if ((uintptr_t) p & (ngx_pagesize - 1)) { | 566 if ((uintptr_t) p & (ngx_pagesize - 1)) { |
563 goto wrong_chunk; | 567 goto wrong_chunk; |
564 } | 568 } |
565 | 569 |
566 if (slab == NGX_SLAB_PAGE_FREE) { | 570 if (slab == NGX_SLAB_PAGE_FREE) { |
567 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, | 571 ngx_slab_error(pool, NGX_LOG_ALERT, |
568 "ngx_slab_free(): page is already free"); | 572 "ngx_slab_free(): page is already free"); |
569 goto fail; | 573 goto fail; |
570 } | 574 } |
571 | 575 |
572 if (slab == NGX_SLAB_PAGE_BUSY) { | 576 if (slab == NGX_SLAB_PAGE_BUSY) { |
573 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, | 577 ngx_slab_error(pool, NGX_LOG_ALERT, |
574 "ngx_slab_free(): pointer to wrong page"); | 578 "ngx_slab_free(): pointer to wrong page"); |
575 goto fail; | 579 goto fail; |
576 } | 580 } |
577 | 581 |
578 n = ((u_char *) p - pool->start) >> ngx_pagesize_shift; | 582 n = ((u_char *) p - pool->start) >> ngx_pagesize_shift; |
579 size = slab & ~NGX_SLAB_PAGE_START; | 583 size = slab & ~NGX_SLAB_PAGE_START; |
595 | 599 |
596 return; | 600 return; |
597 | 601 |
598 wrong_chunk: | 602 wrong_chunk: |
599 | 603 |
600 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, | 604 ngx_slab_error(pool, NGX_LOG_ALERT, |
601 "ngx_slab_free(): pointer to wrong chunk"); | 605 "ngx_slab_free(): pointer to wrong chunk"); |
602 | 606 |
603 goto fail; | 607 goto fail; |
604 | 608 |
605 chunk_already_free: | 609 chunk_already_free: |
606 | 610 |
607 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, | 611 ngx_slab_error(pool, NGX_LOG_ALERT, |
608 "ngx_slab_free(): chunk is already free"); | 612 "ngx_slab_free(): chunk is already free"); |
609 | 613 |
610 fail: | 614 fail: |
611 | 615 |
612 return; | 616 return; |
613 } | 617 } |
654 | 658 |
655 return page; | 659 return page; |
656 } | 660 } |
657 } | 661 } |
658 | 662 |
659 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, NGX_ENOMEM, | 663 ngx_slab_error(pool, NGX_LOG_CRIT, "ngx_slab_alloc() failed: no memory"); |
660 "ngx_slab_alloc(): failed"); | |
661 | 664 |
662 return NULL; | 665 return NULL; |
663 } | 666 } |
664 | 667 |
665 | 668 |
686 | 689 |
687 page->next->prev = (uintptr_t) page; | 690 page->next->prev = (uintptr_t) page; |
688 | 691 |
689 pool->free.next = page; | 692 pool->free.next = page; |
690 } | 693 } |
694 | |
695 | |
696 static void | |
697 ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level, char *text) | |
698 { | |
699 ngx_log_error(level, ngx_cycle->log, 0, "%s%s", text, pool->log_ctx); | |
700 } |