Working on UrsulaRenewal, Request, and Update
[yazpp-moved-to-github.git] / src / yaz-socket-manager.cpp
index eeb06e2..669597a 100644 (file)
@@ -1,10 +1,46 @@
 /*
- * Copyright (c) 1998-1999, Index Data.
+ * Copyright (c) 1998-2000, Index Data.
  * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
  * 
  * $Log: yaz-socket-manager.cpp,v $
- * Revision 1.4  1999-03-23 14:17:57  adam
+ * Revision 1.15  2001-03-26 14:43:49  adam
+ * New threaded PDU association.
+ *
+ * Revision 1.14  2000/11/20 14:17:36  adam
+ * Yet another WIN32 fix for connect notify.
+ *
+ * Revision 1.13  2000/11/20 11:27:33  adam
+ * Fixes for connect operation (timeout and notify fix).
+ *
+ * Revision 1.12  2000/10/24 12:29:57  adam
+ * Fixed bug in proxy where a Yaz_ProxyClient could be owned by
+ * two Yaz_Proxy's (fatal).
+ *
+ * Revision 1.11  2000/10/11 11:58:17  adam
+ * Moved header files to include/yaz++. Switched to libtool and automake.
+ * Configure script creates yaz++-config script.
+ *
+ * Revision 1.10  2000/09/08 10:23:42  adam
+ * Added skeleton of yaz-z-server.
+ *
+ * Revision 1.9  2000/08/07 14:19:59  adam
+ * Fixed serious bug regarding timeouts. Improved logging for proxy.
+ *
+ * Revision 1.8  1999/12/06 13:52:45  adam
+ * Modified for new location of YAZ header files. Experimental threaded
+ * operation.
+ *
+ * Revision 1.7  1999/04/28 13:02:08  adam
+ * Added include of string.h.
+ *
+ * Revision 1.6  1999/04/21 12:09:01  adam
+ * Many improvements. Modified to proxy server to work with "sessions"
+ * based on cookies.
+ *
+ * Revision 1.5  1999/04/09 11:46:57  adam
+ * Added object Yaz_Z_Assoc. Much more functional client.
+ *
+ * Revision 1.4  1999/03/23 14:17:57  adam
  * More work on timeout handling. Work on yaz-client.
  *
  * Revision 1.3  1999/02/02 14:01:23  adam
 #include <unistd.h>
 #endif
 #include <errno.h>
+#include <string.h>
 
-#include <log.h>
-#include <yaz-socket-manager.h>
-
+#include <yaz/log.h>
+#include <yaz++/yaz-socket-manager.h>
 
 Yaz_SocketManager::YazSocketEntry **Yaz_SocketManager::lookupObserver(
     IYazSocketObserver *observer)
@@ -110,6 +146,7 @@ int Yaz_SocketManager::processEvent()
     YazSocketEntry *p;
     YazSocketEvent *event = getEvent();
     unsigned timeout = 0;
+    logf (m_log, "Yaz_SocketManager::processEvent manager=%p", this);
     if (event)
     {
        event->observer->socketNotify(event->event);
@@ -133,11 +170,20 @@ int Yaz_SocketManager::processEvent()
        if (p->mask)
            no++;
        if (p->mask & YAZ_SOCKET_OBSERVE_READ)
+        {
+            yaz_log (m_log, "Yaz_SocketManager::select fd=%d read", fd);
            FD_SET(fd, &in);
+        }
        if (p->mask & YAZ_SOCKET_OBSERVE_WRITE)
+        {
+            yaz_log (m_log, "Yaz_SocketManager::select fd=%d write", fd);
            FD_SET(fd, &out);
+        }
        if (p->mask & YAZ_SOCKET_OBSERVE_EXCEPT)
+        {
+            yaz_log (m_log, "Yaz_SocketManager::select fd=%d except", fd);
            FD_SET(fd, &except);
+        }
        if (fd > max)
            max = fd;
        if (p->timeout)
@@ -146,6 +192,8 @@ int Yaz_SocketManager::processEvent()
            timeout_this = p->timeout;
            if (p->last_activity)
                timeout_this -= now - p->last_activity;
+           else
+               p->last_activity = now;
            if (timeout_this < 1)
                timeout_this = 1;
            if (!timeout || timeout_this < timeout)
@@ -153,12 +201,18 @@ int Yaz_SocketManager::processEvent()
        }
     }
     if (!no)
+    {
+       logf (m_log, "no pending events return 0");
+       if (!m_observers)
+           logf (m_log, "no observers");
        return 0;
+    }
 
     struct timeval to;
     to.tv_sec = timeout;
     to.tv_usec = 0;
-
+    
+    logf (m_log, "Yaz_SocketManager::select no=%d timeout=%d", no, timeout);
     while ((res = select(max + 1, &in, &out, &except, timeout ? &to : 0)) < 0)
        if (errno != EINTR)
            return -1;
@@ -184,9 +238,12 @@ int Yaz_SocketManager::processEvent()
            event->event = mask;
            putEvent (event);
        }
-       else if (p->timeout && now >= p->last_activity + (int) (p->timeout))
+       else if (p->timeout && p->last_activity && 
+                now >= p->last_activity + (int) (p->timeout))
        {
            YazSocketEvent *event = new YazSocketEvent;
+           logf (m_log, "timeout, now = %ld last_activity=%ld timeout=%d",
+                 now, p->last_activity, p->timeout);
            p->last_activity = now;
            event->observer = p->observer;
            event->event = YAZ_SOCKET_OBSERVE_TIMEOUT;
@@ -202,6 +259,10 @@ int Yaz_SocketManager::processEvent()
     return 0;
 }
 
+
+//    n p    n p  ......   n p    n p
+//   front                        back
+
 void Yaz_SocketManager::putEvent(YazSocketEvent *event)
 {
     // put in back of queue
@@ -265,6 +326,7 @@ Yaz_SocketManager::Yaz_SocketManager()
     m_observers = 0;
     m_queue_front = 0;
     m_queue_back = 0;
+    m_log = LOG_DEBUG;
 }
 
 Yaz_SocketManager::~Yaz_SocketManager()