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

Igor Sysoev is at rambler-co.ru
Wed Feb 1 12:59:16 MSK 2006


On Wed, 1 Feb 2006, Alexey N. Kovyrin wrote:

> 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;
> }
>
> Игорь, если не правильно, ткните носом, плиз. Заранее говорю: "Спасибо!".

Не совсем. Вот такой порядок гарантирует, что bcf->gi будет освобождён:

    cln = ngx_pool_cleanup_add(cf->pool, 0);

    bcf->gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD);

    cln->handler = ngx_pool_cleanup_geoip;
    cln->data = bcf->gi;


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list