Здравствуйте, _Artem_, Вы писали:
_A_>Доброе время суток!
_A_>Пишу модуль для nginx. Там идеология такая что модули вкомпиливаются внутрь nginx. Сам nginx написан на чистом C. Модуль же мой написан на C++. Возникла проблема того что после вызова функций C++ корявяться данные ngnix. Видимо C++ не инициализируется корректно в этом случае и при работе с памятью пишет куда-то не туда. И вот возник вопрос, с чем это связано, может быть кто-нибудь сталкивался с подобным? И как можно это исправить? C++ линкуется с nginx как статическая библиотека.
new/delete не переопределяли?
Насколько я понимаю в nginx свои функции для управления памятью и юзать нужно их.
Ну и поподробней можно суть проблемы? А то не полнятно что вызываете и чего после этого корявится
Здравствуйте, skeptic, Вы писали:
S>new/delete не переопределяли?
S>Насколько я понимаю в nginx свои функции для управления памятью и юзать нужно их.
S>Ну и поподробней можно суть проблемы? А то не полнятно что вызываете и чего после этого корявится
Нет, new и delete родные c++. В модуль передается указатель ngx_http_request_t дальше из запроса выбирается заголовок и происходит определенная обработка. Вот код функции которая вызывается из nginx:
int request_handler(ngx_http_request_t * r)
{
try {
headers_t headers;
make_headers(r, headers);
boost::shared_ptr<RequestHandler> h(CreateRequestHandler(headers));
NginxRequestHandlerCallback cb(r);
h->HandleRequest(cb);
headers_t headers_out;
cb.SendResponseHeader(200, headers, true);
}
catch(std::exception & e)
{
NginxRequestHandlerCallback::SendErrorStatus(400, e.what(), r);
}
return 200;
}
После выхода из этой функции значение поля r->cleanup изменяется с 0 на 1. Видимо кто-то что-то там трет))) И потом, когда запрос очищается, вот здесь возникает попытка обратиться к неинициализированной памяти SIGSEG что-ли звучит
for (cln = r->cleanup; cln; cln = cln->next) {
if (cln->handler) {
cln->handler(cln->data);
}
}
Сейчас попробую память брать у nginx.
Здравствуйте, skeptic, Вы писали:
S>new/delete не переопределяли?
S>Насколько я понимаю в nginx свои функции для управления памятью и юзать нужно их.
S>Ну и поподробней можно суть проблемы? А то не полнятно что вызываете и чего после этого корявится
Не помогло, тоже самое SIGSEG, для примера через глобальную переменную сделал
void * operator new (std::size_t size) throw (std::bad_alloc)
{
return ngx_pcalloc(g_r->pool, size);
}
void * operator new[](std::size_t size) throw (std::bad_alloc)
{
return ngx_pcalloc(g_r->pool, size);
}
Здравствуйте, skeptic, Вы писали:
S>new/delete не переопределяли?
S>Насколько я понимаю в nginx свои функции для управления памятью и юзать нужно их.
S>Ну и поподробней можно суть проблемы? А то не полнятно что вызываете и чего после этого корявится
Собственно все получилось))
Вот здесь можно почитать как заставить работать, уже оказывается есть решение
http://www.lexa.ru/nginx-ru/msg16535.html