Страниц: [1]
  Печать  
Автор Тема: QNet and unblocking client  (Прочитано 2682 раз)
john76
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Марта 03, 2004, 11:00:45 pm »

Есть менеджер ресурса, разблокирующий клиента только когда меняются данные, т.е., read() клиента может блокироваться на неопределенный период времени. Клиент и сервер как на одной машине, так и локально.

Логи показывают иногда (раз в день примерно) странную картину: в ф-и io_unblock() MsgError(rcvid, EINTR) возвращает -1, errno = 300 (ENOREMOTE). Документация не говорит, что MsgError() может _такое_ вернуть. Иногда возвращает ESRCH - это нормально, насколько я понимаю, это в случае kill -9 или просто - если клиент умер раньше, чем ему ответили. rcvid здесь = ctp->rcvid, пришедший в io_read() (а не пришедший в io_unblock())

В результате клиент остается висеть REPLY-blocked в ф-и read().

Разблокирование происходит одним из путей:
- клиентский процесс убили по SIGKILL
- один из потоков клиента послал заблокированному потоку клиента SignalKill(getpid(), blocked_tid, SIGINT, 0, 0)
- один из потоков вызвал close() заблокированному лескриптору

Размер сети - пока около 20 машин, клиентов и серверов такого типа - десятки.

Вопрос:
- может, неправильно разблокируем?
- может, еще что-то неправильно делаем?

Насколько топорна разблокировка по SignalKill()? Документация пишет, что таким образом можна разблокировать все кроме ChannelCreate() и SyncMutextLock(), why not?

Да еще и не очевидно как синхронизировати read() и SignalKill() так, чтоб послать сигнал когда поток будет ужезаблокирован?
Почему может не разблокироваться по close()? Почему иногда а не всегда? Нагрузка большая.

Спасибо большое
Записан
Страниц: [1]
  Печать  
 
Перейти в: