Форум ApacheDev

Apache isn't the fastest or maximally customizable web server, its popularity comes from the fact that it provides a very good balance of these things bundled with maximum portability and reliability.

Вы не зашли.

#1 2008-04-13 09:59:13

PM85
Новичок
Зарегистрирован: 2008-04-13
Сообщений: 5
Рейтинг :   

О времени жизни переменных в модулях

Некорректно я поставил вопрос.
Немного разобрался в проблеме, читайте следующий комментарий.


Интересную картину наблюдаю при работе с переменными, время жизни которых не ограничивается одним request или connection циклом.

Пробовал разные способы выделения динамической переменной через apr_palloc (c apr_pool_userdata_set и без) и в пул модуля, и в главный пул сервера, и с использованием мутекса, да даже просто через malloc в памяти, не связывая ни как с пулом соответственно. Как бы не пробовал - переменные живут только небольшое время. Если обращений к серверу нет ~минуту то ссылка обязательно обнуляется в любом случае. Хотя пул не пропадает вроде.

Подскажите пожалуйста какая логика работы сервера? Почему выделенная память пропадает даже из глобального пула после некоторого времени застоя?

Код:

static int test_handler(request_rec *r)
{
    int *bb;
    void *dd = NULL;
    
    if (apr_pool_userdata_get (&dd, "my:data", r->server->process->pool) != APR_SUCCESS ) {
        jdc_echo_debug("data get bad");
    } else {
        jdc_echo_debug("data get ok");
        bb = (int*)dd;
    }
        
    if (dd == NULL) {
        echo_debug("dd == NULL");
        bb = (int*) apr_palloc (jdc_pglobal, sizeof (int));
        *bb = 17;
        dd = (void*)bb;
        apr_pool_userdata_set (dd, "my:data", NULL, r->server->process->pool);
    } else {
        *bb += 1;
        dd = (void*)bb;
    }
    echo_debug("bb = ");
    echo_debug_simple_i(*bb);
    
    
    r->content_type = "plain/text";
    
    ap_rputs("OK", r);
    
    echo_debug("All OK");
    
    return OK;
}

Вот вывод:

DEBUG [16:49:55] : data get ok
DEBUG [16:49:55] : dd == NULL
DEBUG [16:49:55] : bb = 17
DEBUG [16:49:55] : All OK
DEBUG [16:50:00] : data get ok
DEBUG [16:50:00] : bb = 18
DEBUG [16:50:00] : All OK
DEBUG [16:50:04] : data get ok
DEBUG [16:50:04] : bb = 19
DEBUG [16:50:04] : All OK
DEBUG [16:51:30] : data get ok
DEBUG [16:51:30] : dd == NULL
DEBUG [16:51:30] : bb = 17
DEBUG [16:51:30] : All OK

Отредактированно PM85 (2008-04-14 08:23:05)

Неактивен

 

#2 2008-04-14 05:40:36

PM85
Новичок
Зарегистрирован: 2008-04-13
Сообщений: 5
Рейтинг :   

Re: О времени жизни переменных в модулях

Интересное наблюдение сделал. Выделял большие объёмы памяти и смотрел процессы по используемым ресурсам.

Выделенная память действительно НЕ пропадает на протяжении всего времени жизни сервера, но через минуту apr_pool_userdata_get уже данных получить не может, потому что запрос обрабатывает уже другой поток сервера.

Значит нужно только как-то определять область памяти доступную всем потокам.
http://httpd.apache.org/docs/2.0/develo … afety.html - здесь написано что необходимо использовать функции apr_atomic_* и apr_thread_mutex_*. Так же нашёл группу функций apr_shm_*, но не могу понять чем и как пользоваться, чтобы выделить раздяемую потоками память.

Отредактированно PM85 (2008-04-14 08:20:58)

Неактивен

 

#3 2008-04-22 14:47:39

yaroslav
Новичок
Зарегистрирован: 2007-12-06
Сообщений: 7
Рейтинг :   

Re: О времени жизни переменных в модулях

тебе Нужна общая память для всех модулей или только для одного!?
Если общая память для одного модуля то выделяй ее в 
функциях создания и слияния;
module my_module = {
STANDARD20_MODULE_STUFF,
my_create_dir_conf, /* Создание конфигурации каталога */
my_merge_dir_conf, /* Слияние конфигураций каталогов */
my_create_svr_conf, /* Создание конфигурации сервера */
my_merge_svr_conf, /* Слияние конфигураций серверов */
my_cmds, /* Директивы конфигурации */
my_hooks
};

а вот если глобально видели все модули
то в структуре /2006/06/10/strukturyi-dannyih-apache-request_rec/ есть переменная apr_table_t *notes; через нее можно передавать

Неактивен

 

#4 2008-04-23 17:44:49

PM85
Новичок
Зарегистрирован: 2008-04-13
Сообщений: 5
Рейтинг :   

Re: О времени жизни переменных в модулях

Память нужна для динамической работы. Не уверен, что после выделения её под конфиг она не копируется в область памяти каждого процесса сервера. В любом случае это не совсем кошерный метод.
Решил выделять ресурсы в каждом процессе отдельно. Небольшие потери ресурсов, зато конкретная стабильность.

Неактивен

 

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson