Exemplo n.º 1
0
static ngx_int_t
ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
{
    u_char           *file;
    ngx_slab_pool_t  *sp;
    sp = (ngx_slab_pool_t *) zn->shm.addr;
    if (zn->shm.exists)
    {
        if (sp == sp->addr)
        {
            return NGX_OK;
        }
#if (NGX_WIN32)
        /* remap at the required address */
        if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK)
        {
            return NGX_ERROR;
        }
        sp = (ngx_slab_pool_t *) zn->shm.addr;
        if (sp == sp->addr)
        {
            return NGX_OK;
        }
#endif
        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
                      "shared zone \"%V\" has no equal addresses: %p vs %p",
                      &zn->shm.name, sp->addr, sp);
        return NGX_ERROR;
    }
    sp->end = zn->shm.addr + zn->shm.size;
    sp->min_shift = 3;
    sp->addr = zn->shm.addr;
#if (NGX_HAVE_ATOMIC_OPS)
    file = NULL;
#else
    file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);
    if (file == NULL)
    {
        return NGX_ERROR;
    }
    (void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);
#endif
    if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK)
    {
        return NGX_ERROR;
    }
    ngx_slab_init(sp);
    return NGX_OK;
}
Exemplo n.º 2
0
static ngx_int_t
ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
{
    u_char           *file;
    ngx_slab_pool_t  *sp;

    //slab共享内存指向shm共享内存的首地址
    sp = (ngx_slab_pool_t *) zn->shm.addr;

    if (zn->shm.exists) {   //shm共享内存已经存在了
        
        //sp == sp->addr表示这个slab共享内存池已经初始化过了
        if (sp == sp->addr) {
            return NGX_OK;
        }

#if (NGX_WIN32)

        /* remap at the required address */

        if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK) {
            return NGX_ERROR;
        }

        sp = (ngx_slab_pool_t *) zn->shm.addr;

        //sp == sp->addr表示这个slab共享内存池已经初始化过了
        if (sp == sp->addr) {
            return NGX_OK;
        }

#endif

        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
                      "shared zone \"%V\" has no equal addresses: %p vs %p",
                      &zn->shm.name, sp->addr, sp);
        return NGX_ERROR;
    }

    sp->end = zn->shm.addr + zn->shm.size;  //end指向slab共享内存池的末尾
    sp->min_shift = 3;  //指定slab共享内存池中每页的最小内存块(trunk)对应的偏移量
    sp->addr = zn->shm.addr; //slab共享内存池管理结构中的addr成员也指向slab内存池首地址

#if (NGX_HAVE_ATOMIC_OPS)

    file = NULL;

#else

    file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);
    if (file == NULL) {
        return NGX_ERROR;
    }

    (void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);

#endif

    //创建slab共享内存互斥锁
    if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK) {
        return NGX_ERROR;
    }

    //初始化slab共享内存池
    ngx_slab_init(sp);

    return NGX_OK;
}