Bump copyright year
[yazpp-moved-to-github.git] / src / yaz-pdu-assoc-thread.cpp
index fd4373a..d11176a 100644 (file)
@@ -1,8 +1,6 @@
-/*
- * Copyright (c) 1998-2004, Index Data.
+/* This file is part of the yazpp toolkit.
+ * Copyright (C) 1998-2010 Index Data and Mike Taylor
  * See the file LICENSE for details.
- * 
- * $Id: yaz-pdu-assoc-thread.cpp,v 1.9 2005-01-14 10:13:50 adam Exp $
  */
 
 #ifdef WIN32
 #include <yaz/log.h>
 #include <yaz/tcpip.h>
 
-#include <yaz++/pdu-assoc.h>
-#include <yaz++/socket-manager.h>
+#include <yazpp/pdu-assoc.h>
+#include <yazpp/socket-manager.h>
+
+using namespace yazpp_1;
+
+class worker {
+public:
+    SocketManager *m_mgr;
+    PDU_Assoc *m_assoc;
+    void run();
+};
 
-Yaz_PDU_AssocThread::Yaz_PDU_AssocThread(
-    IYazSocketObservable *socketObservable)
-    : Yaz_PDU_Assoc(socketObservable)
+PDU_AssocThread::PDU_AssocThread(
+    ISocketObservable *socketObservable)
+    : PDU_Assoc(socketObservable)
 {
     
 }
 
+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
@@ -47,33 +64,38 @@ void *
 #endif 
 events(void *p)
 {
-    Yaz_SocketManager *s = (Yaz_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;
 #endif
 }
 
-void Yaz_PDU_AssocThread::childNotify(COMSTACK cs)
+void PDU_AssocThread::childNotify(COMSTACK cs)
 {
-    Yaz_SocketManager *socket_observable = new Yaz_SocketManager;
-    Yaz_PDU_Assoc *new_observable = new Yaz_PDU_Assoc (socket_observable, cs);
-
-    new_observable->m_next = m_children;
-    m_children = new_observable;
-    new_observable->m_parent = this;
+    SocketManager *socket_observable = new SocketManager;
+    PDU_Assoc *new_observable = new PDU_Assoc (socket_observable, cs);
 
     /// Clone PDU Observer
     new_observable->m_PDU_Observer =
-       m_PDU_Observer->sessionNotify(new_observable, cs_fileno(cs));
+        m_PDU_Observer->sessionNotify(new_observable, cs_fileno(cs));
+    
+    if (!new_observable->m_PDU_Observer)
+    {
+        new_observable->shutdown();
+        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");
@@ -82,11 +104,20 @@ void Yaz_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);
+        yaz_log (YLOG_ERRNO|YLOG_FATAL, "pthread_create returned id=%d", id);
     else
-       pthread_detach (tid);
+        pthread_detach (tid);
 #endif
 }
 #endif
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+