diff options
Diffstat (limited to '')
-rw-r--r-- | src/nxt_mp.c | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/src/nxt_mp.c b/src/nxt_mp.c index 49e94ca8..bed70e59 100644 --- a/src/nxt_mp.c +++ b/src/nxt_mp.c @@ -138,8 +138,8 @@ struct nxt_mp_s { #if !(NXT_DEBUG_MEMORY) -static void *nxt_mp_get_small(nxt_mp_t *mp, nxt_queue_t *pages, size_t size); static void *nxt_mp_alloc_small(nxt_mp_t *mp, size_t size); +static void *nxt_mp_get_small(nxt_mp_t *mp, nxt_queue_t *pages, size_t size); static nxt_mp_page_t *nxt_mp_alloc_page(nxt_mp_t *mp); static nxt_mp_block_t *nxt_mp_alloc_cluster(nxt_mp_t *mp); #endif @@ -341,23 +341,6 @@ nxt_mp_zalign(nxt_mp_t *mp, size_t alignment, size_t size) } -#if !(NXT_DEBUG_MEMORY) - -nxt_inline u_char * -nxt_mp_page_addr(nxt_mp_t *mp, nxt_mp_page_t *page) -{ - size_t page_offset; - nxt_mp_block_t *block; - - page_offset = page->number * sizeof(nxt_mp_page_t) - + offsetof(nxt_mp_block_t, pages); - - block = (nxt_mp_block_t *) ((u_char *) page - page_offset); - - return block->start + (page->number << mp->page_size_shift); -} - - nxt_inline nxt_uint_t nxt_mp_chunk_pages_index(nxt_mp_t *mp, size_t size) { @@ -377,6 +360,23 @@ nxt_mp_chunk_pages_index(nxt_mp_t *mp, size_t size) } +#if !(NXT_DEBUG_MEMORY) + +nxt_inline u_char * +nxt_mp_page_addr(nxt_mp_t *mp, nxt_mp_page_t *page) +{ + size_t page_offset; + nxt_mp_block_t *block; + + page_offset = page->number * sizeof(nxt_mp_page_t) + + offsetof(nxt_mp_block_t, pages); + + block = (nxt_mp_block_t *) ((u_char *) page - page_offset); + + return block->start + (page->number << mp->page_size_shift); +} + + static void * nxt_mp_alloc_small(nxt_mp_t *mp, size_t size) { @@ -450,6 +450,55 @@ nxt_mp_alloc_small(nxt_mp_t *mp, size_t size) } +static void * +nxt_mp_get_small(nxt_mp_t *mp, nxt_queue_t *pages, size_t size) +{ + u_char *p; + uint32_t available; + nxt_mp_page_t *page; + nxt_queue_link_t *link, *next; + + for (link = nxt_queue_first(pages); + link != nxt_queue_tail(pages); + link = next) + { + next = nxt_queue_next(link); + page = nxt_queue_link_data(link, nxt_mp_page_t, link); + + available = mp->page_size - page->u.taken; + + if (size <= available) { + goto found; + } + + if (available == 0 || page->fails++ > 100) { + nxt_queue_remove(link); + } + } + + page = nxt_mp_alloc_page(mp); + + if (nxt_slow_path(page == NULL)) { + return page; + } + + nxt_queue_insert_head(pages, &page->link); + + page->size = 0xFF; + +found: + + p = nxt_mp_page_addr(mp, page); + + p += page->u.taken; + page->u.taken += size; + + nxt_debug_alloc("mp get: %p", p); + + return p; +} + + static nxt_mp_page_t * nxt_mp_alloc_page(nxt_mp_t *mp) { @@ -841,52 +890,3 @@ nxt_mp_zget(nxt_mp_t *mp, size_t size) return p; } - - -static void * -nxt_mp_get_small(nxt_mp_t *mp, nxt_queue_t *pages, size_t size) -{ - u_char *p; - uint32_t available; - nxt_mp_page_t *page; - nxt_queue_link_t *link, *next; - - for (link = nxt_queue_first(pages); - link != nxt_queue_tail(pages); - link = next) - { - next = nxt_queue_next(link); - page = nxt_queue_link_data(link, nxt_mp_page_t, link); - - available = mp->page_size - page->u.taken; - - if (size <= available) { - goto found; - } - - if (available == 0 || page->fails++ > 100) { - nxt_queue_remove(link); - } - } - - page = nxt_mp_alloc_page(mp); - - if (nxt_slow_path(page == NULL)) { - return page; - } - - nxt_queue_insert_head(pages, &page->link); - - page->size = 0xFF; - -found: - - p = nxt_mp_page_addr(mp, page); - - p += page->u.taken; - page->u.taken += size; - - nxt_debug_alloc("mp get: %p", p); - - return p; -} |