Slab: fixed initialization on win32.

On Windows, a worker process does not call ngx_slab_init() from
ngx_init_zone_pool(), so ngx_slab_max_size, ngx_slab_exact_size,
and ngx_slab_exact_shift were left uninitialized.
This commit is contained in:
Ruslan Ermilov 2017-08-08 15:16:01 +03:00
parent e6ee489fa5
commit 60a85fc416
3 changed files with 20 additions and 10 deletions

View File

@ -273,6 +273,12 @@ main(int argc, char *const *argv)
return 1;
}
/*
* ngx_slab_sizes_init() requires ngx_pagesize set in ngx_os_init()
*/
ngx_slab_sizes_init();
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
return 1;
}

View File

@ -82,6 +82,19 @@ static ngx_uint_t ngx_slab_exact_size;
static ngx_uint_t ngx_slab_exact_shift;
void
ngx_slab_sizes_init(void)
{
ngx_uint_t n;
ngx_slab_max_size = ngx_pagesize / 2;
ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));
for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) {
/* void */
}
}
void
ngx_slab_init(ngx_slab_pool_t *pool)
{
@ -91,16 +104,6 @@ ngx_slab_init(ngx_slab_pool_t *pool)
ngx_uint_t i, n, pages;
ngx_slab_page_t *slots, *page;
/* STUB */
if (ngx_slab_max_size == 0) {
ngx_slab_max_size = ngx_pagesize / 2;
ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));
for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) {
/* void */
}
}
/**/
pool->min_size = (size_t) 1 << pool->min_shift;
slots = ngx_slab_slots(pool);

View File

@ -59,6 +59,7 @@ typedef struct {
} ngx_slab_pool_t;
void ngx_slab_sizes_init(void);
void ngx_slab_init(ngx_slab_pool_t *pool);
void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);