X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-socket-manager.cpp;h=0a3797a6cdff764575e2563ef8f06936903ce79f;hb=53d173adf3fb13f5fd25a7b02f339e2731d8a834;hp=62182d8e23a0dd82403f04ff6020c76b739541b9;hpb=0084c40d8bc6babaeb0b833b12d9cd625c807525;p=yazpp-moved-to-github.git diff --git a/src/yaz-socket-manager.cpp b/src/yaz-socket-manager.cpp index 62182d8..0a3797a 100644 --- a/src/yaz-socket-manager.cpp +++ b/src/yaz-socket-manager.cpp @@ -32,13 +32,22 @@ SocketManager::SocketEntry **SocketManager::lookupObserver( ISocketObserver *observer) { SocketEntry **se; - + for (se = &m_observers; *se; se = &(*se)->next) if ((*se)->observer == observer) break; return se; } +int SocketManager::getNumberOfObservers() +{ + int i = 0; + SocketEntry *se; + for (se = m_observers; se; se = se->next, i++) + ; + return i; +} + void SocketManager::addObserver(int fd, ISocketObserver *observer) { SocketEntry *se; @@ -72,7 +81,7 @@ void SocketManager::deleteObserver(ISocketObserver *observer) void SocketManager::deleteObservers() { SocketEntry *se = m_observers; - + while (se) { SocketEntry *se_next = se->next; @@ -115,10 +124,21 @@ void SocketManager::inspect_poll_result(int res, struct yaz_poll_fd *fds, time_t now = time(0); int i; int no_put_events = 0; - SocketEntry *p; + int no_lost_observers = 0; - for (i = 0, p = m_observers; p; p = p->next, i++) + for (i = 0; i < no_fds; i++) { + SocketEntry *p; + for (p = m_observers; p; p = p->next) + if (p->fd == fds[i].fd) + break; + if (!p) + { + // m_observers list changed since poll started + no_lost_observers++; + continue; + } + enum yaz_poll_mask output_mask = fds[i].output_mask; int mask = 0; @@ -130,7 +150,7 @@ void SocketManager::inspect_poll_result(int res, struct yaz_poll_fd *fds, if (output_mask & yaz_poll_except) mask |= SOCKET_OBSERVE_EXCEPT; - + if (mask) { SocketEvent *event = new SocketEvent; @@ -152,7 +172,7 @@ void SocketManager::inspect_poll_result(int res, struct yaz_poll_fd *fds, event->event = SOCKET_OBSERVE_TIMEOUT; putEvent (event); no_put_events++; - + } } SocketEvent *event = getEvent(); @@ -163,12 +183,14 @@ void SocketManager::inspect_poll_result(int res, struct yaz_poll_fd *fds, } else { - // bug #2035 - - yaz_log(YLOG_WARN, "unhandled socket event. yaz_poll returned %d", res); - yaz_log(YLOG_WARN, "no_put_events=%d no_fds=%d i=%d timeout=%d", - no_put_events, no_fds, i, timeout); - abort(); + if (no_lost_observers == 0) + { + // bug #2035 + yaz_log(YLOG_WARN, "unhandled socket event. yaz_poll returned %d", + res); + yaz_log(YLOG_WARN, "no_put_events=%d no_fds=%d i=%d timeout=%d", + no_put_events, no_fds, i, timeout); + } } } @@ -219,7 +241,7 @@ int SocketManager::processEvent() if (timeout == -1 || timeout_this < timeout) timeout = timeout_this; p->timeout_this = timeout_this; - yaz_log (m_log, "SocketManager::select timeout_this=%d", + yaz_log (m_log, "SocketManager::select timeout_this=%d", p->timeout_this); } else @@ -228,21 +250,22 @@ int SocketManager::processEvent() } int pass = 0; - while ((res = yaz_poll(fds, no_fds, timeout, 0)) < 0) + while ((res = yaz_poll(fds, no_fds, timeout, 0)) < 0 && pass < 10) { - if (errno != EINTR) + if (errno == EINTR) { - yaz_log(YLOG_ERRNO|YLOG_WARN, "yaz_poll"); - yaz_log(YLOG_WARN, "errno=%d timeout=%d", errno, timeout); - if (++pass > 10) - return -1; + delete [] fds; + return 1; } + yaz_log(YLOG_ERRNO|YLOG_WARN, "yaz_poll"); + yaz_log(YLOG_WARN, "errno=%d timeout=%d", errno, timeout); } - inspect_poll_result(res, fds, no_fds, timeout); + if (res >= 0) + inspect_poll_result(res, fds, no_fds, timeout); delete [] fds; - return 1; + return res >= 0 ? 1 : -1; }