+ YAZ_SOCKET_OBSERVE_EXCEPT|
+ YAZ_SOCKET_OBSERVE_WRITE);
+ m_state = Connecting;
+}
+
+void Yaz_PDU_Assoc::socket(IYaz_PDU_Observer *observer, int fd)
+{
+ close();
+ m_PDU_Observer = observer;
+ if (fd >= 0)
+ {
+ CS_TYPE cs_type = tcpip_type;
+ m_cs = cs_createbysocket(fd, cs_type, 0, PROTO_Z3950);
+ m_state = Ready;
+ m_socketObservable->addObserver(fd, this);
+ m_socketObservable->maskObserver(this,
+ YAZ_SOCKET_OBSERVE_READ|
+ YAZ_SOCKET_OBSERVE_EXCEPT);
+ m_socketObservable->timeoutObserver(this, m_idleTime);
+ }
+}
+
+#if 1
+ // 1 = single-threaded
+ // 0 = multi-threaded
+
+// Single-threaded... Only useful for non-blocking handlers
+void Yaz_PDU_Assoc::childNotify(int fd)
+{
+ // Clone PDU Observable (keep socket manager)
+ IYaz_PDU_Observable *new_observable = clone();
+
+ // Clone PDU Observer
+ IYaz_PDU_Observer *observer = m_PDU_Observer->clone(new_observable);
+
+ // Attach new socket to it
+ new_observable->socket(observer, fd);
+}
+#else
+
+#include <yaz++/yaz-socket-manager.h>
+
+#ifdef WIN32
+#include <process.h>
+#else
+#include <pthread.h>
+#endif
+
+#ifdef WIN32
+void __cdecl
+#else
+void *
+#endif
+ events(void *p)
+{
+ Yaz_SocketManager *s = (Yaz_SocketManager *) p;
+
+ logf (LOG_LOG, "thread started");
+ while (s->processEvent() > 0)
+ ;
+ logf (LOG_LOG, "thread finished");
+#ifdef WIN32
+#else
+ return 0;
+#endif
+}
+
+void Yaz_PDU_Assoc::childNotify(int fd)
+{
+ Yaz_SocketManager *socket_observable = new Yaz_SocketManager;
+ Yaz_PDU_Assoc *new_observable = new Yaz_PDU_Assoc (socket_observable);
+
+ /// Clone PDU Observer
+ IYaz_PDU_Observer *observer = m_PDU_Observer->clone(new_observable);
+
+ /// Attach new socket to it
+ new_observable->socket(observer, fd);
+
+#ifdef WIN32
+ long t_id;
+ t_id = _beginthread (events, 0, socket_observable);
+ if (t_id == -1)
+ {
+ logf (LOG_FATAL|LOG_ERRNO, "_beginthread failed");
+ exit (1);
+ }
+#else
+ pthread_t type;
+
+ int id = pthread_create (&type, 0, events, socket_observable);
+ logf (LOG_LOG, "pthread_create returned id=%d", id);
+#endif