Добрый день! Написал и использую модуль для ограничения количества запросов к серверу за промежуток времени с одного IP. Данные организованы следующим образом: в разделяемой памяти хранятся связанные списки структур статистики по ip адресам, нужная строка выбирается простой хеширующей функцией от ip адреса. Соответсвенно там происходит выделение и освобождение памяти. Для защиты указателей списка во время поиска по строке я использую pthread_mutex_lock на строку. Чтобы понятнее было:
.. addr = ((struct sockaddr_in *) (r->connection->sockaddr))->sin_addr.s_addr; key = rlimit_hash_key(addr, ..); .. pthread_mutex_lock(&ctx->hash_locks[key]); .. тут ищем статистику, в общем шаримся по разделяемой памяти
.. ret = check_node(..); pthread_mutex_unlock(&ctx->hash_locks[key]); return ret;
Обработчик устанавливается через: .. h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
..
Собственно вопрос в чем. Я печатаю статистику работы модуля и число процессов в критическом интервале все время равно нулю, несмотря на довольно значительную загрузку сервера. У меня складывается ощущение, что я чего-то не понимаю.
То ли вообще нет необходимости в защите разделяемой памяти в этом месте, то ли это специфично только для freeBSD. Под Linux, увы, нет достаточно нагруженного сервера. Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?
С уважением, Александр P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем, семафоры?