Вызов C++ из C под линукс
От: _Artem_ Россия  
Дата: 27.04.11 04:15
Оценка:
Доброе время суток!
Пишу модуль для nginx. Там идеология такая что модули вкомпиливаются внутрь nginx. Сам nginx написан на чистом C. Модуль же мой написан на C++. Возникла проблема того что после вызова функций C++ корявяться данные ngnix. Видимо C++ не инициализируется корректно в этом случае и при работе с памятью пишет куда-то не туда. И вот возник вопрос, с чем это связано, может быть кто-нибудь сталкивался с подобным? И как можно это исправить? C++ линкуется с nginx как статическая библиотека.
Re: Вызов C++ из C под линукс
От: skeptic  
Дата: 27.04.11 04:39
Оценка:
Здравствуйте, _Artem_, Вы писали:

_A_>Доброе время суток!

_A_>Пишу модуль для nginx. Там идеология такая что модули вкомпиливаются внутрь nginx. Сам nginx написан на чистом C. Модуль же мой написан на C++. Возникла проблема того что после вызова функций C++ корявяться данные ngnix. Видимо C++ не инициализируется корректно в этом случае и при работе с памятью пишет куда-то не туда. И вот возник вопрос, с чем это связано, может быть кто-нибудь сталкивался с подобным? И как можно это исправить? C++ линкуется с nginx как статическая библиотека.

new/delete не переопределяли?
Насколько я понимаю в nginx свои функции для управления памятью и юзать нужно их.
Ну и поподробней можно суть проблемы? А то не полнятно что вызываете и чего после этого корявится
Re[2]: Вызов C++ из C под линукс
От: _Artem_ Россия  
Дата: 27.04.11 05:33
Оценка:
Здравствуйте, 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.
Re[2]: Вызов C++ из C под линукс
От: _Artem_ Россия  
Дата: 27.04.11 05:56
Оценка:
Здравствуйте, 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);
}
Re[2]: Вызов C++ из C под линукс
От: _Artem_ Россия  
Дата: 27.04.11 06:05
Оценка:
Здравствуйте, skeptic, Вы писали:
S>new/delete не переопределяли?
S>Насколько я понимаю в nginx свои функции для управления памятью и юзать нужно их.
S>Ну и поподробней можно суть проблемы? А то не полнятно что вызываете и чего после этого корявится

Собственно все получилось))
Вот здесь можно почитать как заставить работать, уже оказывается есть решение http://www.lexa.ru/nginx-ru/msg16535.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.