Проблема с памятью в самописных модулях

Alexey N. Kovyrin alexey at kovyrin.net
Wed Feb 1 12:45:28 MSK 2006


Igor Sysoev пишет:
> On Mon, 30 Jan 2006, Alexey N. Kovyrin wrote:
>
>> Alexey N. Kovyrin пишет:
>>>
>>> P.S. Насчет geoip... а как мне можно освобождать память, которую он 
>>> выделяет (только сейчас в голову пришло, что он тоже вполне имеет 
>>> право на это)?
>> Посмотрел - точно - там тонны маллоков.... Куда его запихать - этот 
>> инициализарующий вызов, чтобы потом можно было результаты 
>> использовать в баннерофильтре (т.к. я не нашел утверждений об 
>> обратном, считаем, что он не thread-safe)?
> Инициализирующий вызов - куда угодно. После этого нужно привязать
> деинициализацию к пулу cf->pool с помощью ngx_pool_cleanup_add()
> на примере ngx_pool_cleanup_file().
Хочу проверить, правильно ли понял...
Итак, если у нас есть в create_conf у модуля какой-то вызов внешней 
процедуры, возвращающей нам "SomeType* x" и мы должны вызывать 
SomeFree(x) при обновлении  конфигурации через -HUP, то делать нужно так 
(на примере GeoIP):

void
ngx_pool_cleanup_geoip(void *data)
{
    GeoIP *clngeo = data;
    if (clngeo) GeoIP_delete(clngeo);
}

static void *
ngx_http_banner_create_conf(ngx_conf_t *cf)
{
    ....
    ngx_pool_cleanup_t      *cln;
    ...
    bcf->gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD);
    if (bcf->gi == NULL) {
        return NGX_CONF_ERROR;
    }

    cln = ngx_pool_cleanup_add(cf->pool, 0);
    if (cln == NULL) {
        return NGX_CONF_ERROR;
    }
    cln->handler = ngx_pool_cleanup_geoip;
    cln->data = bcf->gi;

    ...
    return bcf;
}

Игорь, если не правильно, ткните носом, плиз. Заранее говорю: "Спасибо!".

-- 
/Scoundrel    [http://kovyrin.info]







More information about the nginx-ru mailing list