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