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