X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-pdu-assoc-thread.cpp;h=5957ac4b072bb9c0cfe89e3e2e58dae43560fb02;hb=f4a712d1c3fe702351dadafdeab971a16d9960c4;hp=294aa609475bdbb5118314549cf7e62ffb2498bc;hpb=7411ed6df7fc0b535f83503f73d70e80f390e295;p=yazpp-moved-to-github.git diff --git a/src/yaz-pdu-assoc-thread.cpp b/src/yaz-pdu-assoc-thread.cpp index 294aa60..5957ac4 100644 --- a/src/yaz-pdu-assoc-thread.cpp +++ b/src/yaz-pdu-assoc-thread.cpp @@ -2,7 +2,7 @@ * Copyright (c) 1998-2004, Index Data. * See the file LICENSE for details. * - * $Id: yaz-pdu-assoc-thread.cpp,v 1.12 2005-06-25 15:53:19 adam Exp $ + * $Id: yaz-pdu-assoc-thread.cpp,v 1.15 2006-03-30 11:58:00 adam Exp $ */ #ifdef WIN32 @@ -30,11 +30,18 @@ #include #include -#include -#include +#include +#include using namespace yazpp_1; +class worker { +public: + SocketManager *m_mgr; + PDU_Assoc *m_assoc; + void run(); +}; + PDU_AssocThread::PDU_AssocThread( ISocketObservable *socketObservable) : PDU_Assoc(socketObservable) @@ -42,6 +49,16 @@ PDU_AssocThread::PDU_AssocThread( } +void worker::run() +{ + yaz_log (YLOG_LOG, "thread started"); + while (this->m_mgr->processEvent() > 0) + ; + yaz_log (YLOG_LOG, "thread finished"); + delete this->m_mgr; + delete this; +} + #ifdef WIN32 void __cdecl #else @@ -49,12 +66,8 @@ void * #endif events(void *p) { - SocketManager *s = (SocketManager *) p; - - yaz_log (YLOG_LOG, "thread started"); - while (s->processEvent() > 0) - ; - yaz_log (YLOG_LOG, "thread finished"); + worker *w = (worker *) p; + w->run(); #ifdef WIN32 #else return 0; @@ -66,16 +79,25 @@ void PDU_AssocThread::childNotify(COMSTACK cs) SocketManager *socket_observable = new SocketManager; PDU_Assoc *new_observable = new PDU_Assoc (socket_observable, cs); - new_observable->m_next = m_children; - m_children = new_observable; - new_observable->m_parent = this; - /// Clone PDU Observer new_observable->m_PDU_Observer = m_PDU_Observer->sessionNotify(new_observable, cs_fileno(cs)); + + if (!new_observable->m_PDU_Observer) + { + new_observable->close(); + delete new_observable; + delete socket_observable; + return; + } + + worker *w = new worker; + w->m_assoc = new_observable; + w->m_mgr = socket_observable; + #ifdef WIN32 long t_id; - t_id = _beginthread (events, 0, socket_observable); + t_id = _beginthread (events, 0, w); if (t_id == -1) { yaz_log (YLOG_FATAL|YLOG_ERRNO, "_beginthread failed"); @@ -84,7 +106,7 @@ void PDU_AssocThread::childNotify(COMSTACK cs) #else pthread_t tid; - int id = pthread_create (&tid, 0, events, socket_observable); + int id = pthread_create (&tid, 0, events, w); if (id) yaz_log (YLOG_ERRNO|YLOG_FATAL, "pthread_create returned id=%d", id); else