ПРОЕКТЫ 


  АРХИВ 


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: Проблема с память ю в самописных модуля х



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



 




Copyright © Lexa Software, 1996-2009.