Reformat: delete trailing whitespace
[yazpp-moved-to-github.git] / src / yaz-socket-manager.cpp
index d872cf3..0a3797a 100644 (file)
@@ -32,7 +32,7 @@ SocketManager::SocketEntry **SocketManager::lookupObserver(
     ISocketObserver *observer)
 {
     SocketEntry **se;
-    
+
     for (se = &m_observers; *se; se = &(*se)->next)
         if ((*se)->observer == observer)
             break;
@@ -81,7 +81,7 @@ void SocketManager::deleteObserver(ISocketObserver *observer)
 void SocketManager::deleteObservers()
 {
     SocketEntry *se = m_observers;
-    
+
     while (se)
     {
         SocketEntry *se_next = se->next;
@@ -124,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;
@@ -139,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;
@@ -161,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();
@@ -172,11 +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);
+        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);
+        }
     }
 }
 
@@ -227,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
@@ -239,7 +253,10 @@ int SocketManager::processEvent()
     while ((res = yaz_poll(fds, no_fds, timeout, 0)) < 0 && pass < 10)
     {
         if (errno == EINTR)
-            continue;
+        {
+            delete [] fds;
+            return 1;
+        }
         yaz_log(YLOG_ERRNO|YLOG_WARN, "yaz_poll");
         yaz_log(YLOG_WARN, "errno=%d timeout=%d", errno, timeout);
     }