+
+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
+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-socket-manager.h>
+#include <pthread.h>
+
+class thread_info {
+ Yaz_SocketManager *socketManager;
+ IYaz_PDU_Observable *
+
+};
+
+static void *events(void *p)
+{
+ Yaz_SocketManager *s = (Yaz_SocketManager *) p;
+
+ while (s->processEvent() > 0)
+ ;
+ return 0;
+}
+
+void Yaz_PDU_Assoc::childNotify(int fd)
+{
+ Yaz_SocketManager *socket_observable = new Yaz_SocketManager;
+ IYaz_PDU_Observable *new_observable = clone();
+
+ m_socketObservable = 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);
+
+ pthread_t type;
+
+ int id = pthread_create (&type, 0, events, socket_observable);
+ logf (LOG_LOG, "pthread_create returned id=%d", id);
+}
+#endif
+