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 }