+ */
+ yaz_log (m_log, "new session: parent fd=%d child fd=%d",
+ cs_fileno(m_cs), cs_fileno(new_line));
+ childNotify (new_line);
+ }
+ break;
+ case Writing:
+ if (event & (SOCKET_OBSERVE_READ|SOCKET_OBSERVE_WRITE))
+ flush_PDU();
+ break;
+ case Ready:
+ if (event & (SOCKET_OBSERVE_READ|SOCKET_OBSERVE_WRITE))
+ {
+ do
+ {
+ int res = cs_get (m_cs, &m_input_buf, &m_input_len);
+ if (res == 1)
+ {
+ unsigned mask = SOCKET_OBSERVE_EXCEPT;
+ if (m_cs->io_pending & CS_WANT_WRITE)
+ mask |= SOCKET_OBSERVE_WRITE;
+ if (m_cs->io_pending & CS_WANT_READ)
+ mask |= SOCKET_OBSERVE_READ;
+ yaz_log(m_log, "maskObserver 4");
+ m_socketObservable->maskObserver(this, mask);
+ return;
+ }
+ else if (res <= 0)
+ {
+ yaz_log (m_log, "PDU_Assoc::Connection closed by peer");
+ shutdown();
+ if (m_PDU_Observer)
+ m_PDU_Observer->failNotify(); // problem here..
+ return;
+ }
+ // lock it, so we know if recv_PDU deletes it.
+ int destroyed = 0;
+ m_destroyed = &destroyed;
+
+ if (!m_PDU_Observer)
+ return;
+#if 0
+ PDU_Queue **pq = &m_queue_in;
+ while (*pq)
+ pq = &(*pq)->m_next;
+
+ *pq = new PDU_Queue(m_input_buf, res);
+#else
+ m_PDU_Observer->recv_PDU(m_input_buf, res);
+#endif
+ if (destroyed) // it really was destroyed, return now.
+ return;
+ m_destroyed = 0;
+ } while (m_cs && cs_more (m_cs));
+ if (m_cs && m_state == Ready)
+ {
+ yaz_log(m_log, "maskObserver 5");
+ m_socketObservable->maskObserver(this,
+ SOCKET_OBSERVE_EXCEPT|
+ SOCKET_OBSERVE_READ);
+ }
+ }
+ break;
+ case Closed:
+ yaz_log (m_log, "CLOSING state=%d event was %d", m_state, event);
+ shutdown();
+ m_PDU_Observer->failNotify();
+ break;
+ default:
+ yaz_log (m_log, "Unknown state=%d event was %d", m_state, event);
+ shutdown();
+ m_PDU_Observer->failNotify();