ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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]





 




Copyright © Lexa Software, 1996-2009.