ПРОЕКТЫ 


  АРХИВ 


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: Модуль на C++ - во зможно?



On Fri, Mar 07, 2008 at 07:55:48AM -0800, Sergey S. wrote:

> Еще одна засада возникла =) В модуле используется map<string, string> для
> хранения конфигурации, и средствами nginx'а под нее память выделяется как-то
> неправильно. При обращении к контейнеру в обработчике для директив nginx
> падает в сегфолт.
> 
> Поэтому память приходится выделять так:
> 
> static void* ngx_http_test_create_loc_conf(ngx_conf_t *cf)
> {
>   ngx_http_test_loc_conf_t  *conf = new  ngx_http_test_loc_conf_t; // где
> ngx_http_test_loc_conf_t == map<string, string>
> 
>   return conf;
> }
> 
> Вопрос: как ее правильно освобождать? Сейчас память освобождается в коллбеке
> (но есть подозрения, что могут быть последствия):
> 
> void ngx_http_test_exit_process(ngx_cycle_t* cycle)
> {
>   delete g_conf;
> }
> 
> где g_conf - глобальный указатель на map<string,string>.

Неправильно.

Нужно делать регистрировать cleanup

    cln = ngx_pool_cleanup_add(cf->pool, 0);
    if (cln == NULL) {
        return NULL;
    }

    cln->handler = ngx_test_module_cleanup;
    cln->data = conf;

Который вызовется при разрушении pool'а.


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



 




Copyright © Lexa Software, 1996-2009.