X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-pdu-assoc.cpp;h=bcdededb71af498acfdd66aeb1ec3ac44f04dfc0;hb=3e85e9f144d417835d0a6d46bc1526ee3c655078;hp=0ed6f2955489aca54c62d3b49e126f419e683be9;hpb=966d1a0443071c2b75426d0214bfb9960c5c3fba;p=yazpp-moved-to-github.git diff --git a/src/yaz-pdu-assoc.cpp b/src/yaz-pdu-assoc.cpp index 0ed6f29..bcdeded 100644 --- a/src/yaz-pdu-assoc.cpp +++ b/src/yaz-pdu-assoc.cpp @@ -2,7 +2,7 @@ * Copyright (c) 1998-2001, Index Data. * See the file LICENSE for details. * - * $Id: yaz-pdu-assoc.cpp,v 1.25 2001-11-04 22:36:21 adam Exp $ + * $Id: yaz-pdu-assoc.cpp,v 1.29 2003-07-25 19:27:36 adam Exp $ */ #include @@ -10,7 +10,7 @@ #include #include -#include +#include void Yaz_PDU_Assoc::init(IYazSocketObservable *socketObservable) @@ -58,6 +58,7 @@ Yaz_PDU_Assoc::Yaz_PDU_Assoc(IYazSocketObservable *socketObservable, // assume comstack is accepting... m_state = Accepting; m_socketObservable->addObserver(cs_fileno(cs), this); + yaz_log(m_log, "maskObserver 1"); m_socketObservable->maskObserver(this, mask |YAZ_SOCKET_OBSERVE_EXCEPT); } @@ -109,6 +110,7 @@ void Yaz_PDU_Assoc::socketNotify(int event) } else { // accept still incomplete. + yaz_log(m_log, "maskObserver 2"); m_socketObservable->maskObserver(this, mask|YAZ_SOCKET_OBSERVE_EXCEPT); } @@ -124,8 +126,8 @@ void Yaz_PDU_Assoc::socketNotify(int event) } else { - yaz_log (m_log, "cs_connect again"); - int res = cs_connect (m_cs, 0); + yaz_log (m_log, "cs_rcvconnect"); + int res = cs_rcvconnect (m_cs); if (res == 1) { unsigned mask = YAZ_SOCKET_OBSERVE_EXCEPT; @@ -133,6 +135,7 @@ void Yaz_PDU_Assoc::socketNotify(int event) mask |= YAZ_SOCKET_OBSERVE_WRITE; if (m_cs->io_pending & CS_WANT_READ) mask |= YAZ_SOCKET_OBSERVE_READ; + yaz_log(m_log, "maskObserver 3"); m_socketObservable->maskObserver(this, mask); } else @@ -187,6 +190,7 @@ void Yaz_PDU_Assoc::socketNotify(int event) mask |= YAZ_SOCKET_OBSERVE_WRITE; if (m_cs->io_pending & CS_WANT_READ) mask |= YAZ_SOCKET_OBSERVE_READ; + yaz_log(m_log, "maskObserver 4"); m_socketObservable->maskObserver(this, mask); return; } @@ -210,10 +214,13 @@ void Yaz_PDU_Assoc::socketNotify(int event) if (destroyed) // it really was destroyed, return now. return; } while (m_cs && cs_more (m_cs)); - if (m_cs) + if (m_cs && m_state == Ready) + { + yaz_log(m_log, "maskObserver 5"); m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_EXCEPT| YAZ_SOCKET_OBSERVE_READ); + } } break; case Closed: @@ -286,7 +293,7 @@ void Yaz_PDU_Assoc::destroy() Yaz_PDU_Assoc::PDU_Queue::PDU_Queue(const char *buf, int len) { - m_buf = (char *) malloc (len); + m_buf = (char *) xmalloc (len); memcpy (m_buf, buf, len); m_len = len; m_next = 0; @@ -294,7 +301,7 @@ Yaz_PDU_Assoc::PDU_Queue::PDU_Queue(const char *buf, int len) Yaz_PDU_Assoc::PDU_Queue::~PDU_Queue() { - free (m_buf); + xfree (m_buf); } int Yaz_PDU_Assoc::flush_PDU() @@ -311,6 +318,7 @@ int Yaz_PDU_Assoc::flush_PDU() { m_state = Ready; yaz_log (m_log, "YAZ_PDU_Assoc::flush_PDU queue empty"); + yaz_log(m_log, "maskObserver 6"); m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_READ| YAZ_SOCKET_OBSERVE_WRITE| YAZ_SOCKET_OBSERVE_EXCEPT); @@ -332,21 +340,26 @@ int Yaz_PDU_Assoc::flush_PDU() mask |= YAZ_SOCKET_OBSERVE_WRITE; if (m_cs->io_pending & CS_WANT_READ) mask |= YAZ_SOCKET_OBSERVE_READ; - + + mask |= YAZ_SOCKET_OBSERVE_WRITE; + yaz_log(m_log, "maskObserver 7"); m_socketObservable->maskObserver(this, mask); - yaz_log (m_log, "Yaz_PDU_Assoc::flush_PDU cs_put %d bytes (incomp)", - q->m_len); + yaz_log (m_log, "Yaz_PDU_Assoc::flush_PDU cs_put %d bytes fd=%d (inc)", + q->m_len, cs_fileno(m_cs)); return r; } - m_state = Ready; yaz_log (m_log, "Yaz_PDU_Assoc::flush_PDU cs_put %d bytes", q->m_len); // whole packet sent... delete this and proceed to next ... m_queue_out = q->m_next; delete q; // don't select on write if queue is empty ... if (!m_queue_out) + { + m_state = Ready; + yaz_log(m_log, "maskObserver 8"); m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_READ| YAZ_SOCKET_OBSERVE_EXCEPT); + } return r; } @@ -393,6 +406,7 @@ void Yaz_PDU_Assoc::listen(IYaz_PDU_Observer *observer, if (cs_bind(m_cs, ap, CS_SERVER) < 0) return; m_socketObservable->addObserver(cs_fileno(m_cs), this); + yaz_log(m_log, "maskObserver 9"); m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_READ| YAZ_SOCKET_OBSERVE_EXCEPT); yaz_log (m_log, "Yaz_PDU_Assoc::listen ok fd=%d", cs_fileno(m_cs)); @@ -420,19 +434,21 @@ void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer, m_socketObservable->addObserver(cs_fileno(m_cs), this); if (res >= 0) - { // Connect pending or complet + { // Connect pending or complete m_state = Connecting; unsigned mask = YAZ_SOCKET_OBSERVE_EXCEPT; if (m_cs->io_pending & CS_WANT_WRITE) mask |= YAZ_SOCKET_OBSERVE_WRITE; if (m_cs->io_pending & CS_WANT_READ) mask |= YAZ_SOCKET_OBSERVE_READ; + yaz_log(m_log, "maskObserver 11"); m_socketObservable->maskObserver(this, mask); } else { // Connect failed immediately // Since m_state is Closed we can distinguish this case from // normal connect in socketNotify handler + yaz_log(m_log, "maskObserver 12"); m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_WRITE| YAZ_SOCKET_OBSERVE_EXCEPT); } @@ -441,8 +457,6 @@ void Yaz_PDU_Assoc::connect(IYaz_PDU_Observer *observer, // Single-threaded... Only useful for non-blocking handlers void Yaz_PDU_Assoc::childNotify(COMSTACK cs) { - - Yaz_PDU_Assoc *new_observable = new Yaz_PDU_Assoc (m_socketObservable, cs);