23b930805cdd1f183c0c20c4a6b312190afa9f60
[yazpp-moved-to-github.git] / src / yaz-pdu-assoc-thread.cpp
1 /*
2  * Copyright (c) 1998-2004, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: yaz-pdu-assoc-thread.cpp,v 1.13 2005-10-10 15:59:43 adam Exp $
6  */
7
8 #ifdef WIN32
9 #define USE_THREADS 1
10 #endif
11
12 #if YAZ_POSIX_THREADS
13 #define USE_THREADS 1
14 #endif
15
16 #if USE_THREADS
17
18 #if HAVE_UNISTD_H
19 #include <unistd.h>
20 #endif
21
22 #ifdef WIN32
23 #include <process.h>
24 #else
25 #include <pthread.h>
26 #endif
27
28
29 #include <errno.h>
30 #include <yaz/log.h>
31 #include <yaz/tcpip.h>
32
33 #include <yaz++/pdu-assoc.h>
34 #include <yaz++/socket-manager.h>
35
36 using namespace yazpp_1;
37
38 class worker {
39 public:
40     SocketManager *m_mgr;
41     PDU_Assoc *m_assoc;
42     void run();
43 };
44
45 PDU_AssocThread::PDU_AssocThread(
46     ISocketObservable *socketObservable)
47     : PDU_Assoc(socketObservable)
48 {
49     
50 }
51
52 void worker::run()
53 {
54     yaz_log (YLOG_LOG, "thread started");
55     while (this->m_mgr->processEvent() > 0)
56         ;
57     yaz_log (YLOG_LOG, "thread finished");
58     delete this->m_mgr;
59     delete this;
60 }
61
62 #ifdef WIN32
63 void __cdecl
64 #else
65 void *
66 #endif 
67 events(void *p)
68 {
69     worker *w = (worker *) p;
70     w->run();
71 #ifdef WIN32
72 #else
73     return 0;
74 #endif
75 }
76
77 void PDU_AssocThread::childNotify(COMSTACK cs)
78 {
79     SocketManager *socket_observable = new SocketManager;
80     PDU_Assoc *new_observable = new PDU_Assoc (socket_observable, cs);
81
82     /// Clone PDU Observer
83     new_observable->m_PDU_Observer =
84         m_PDU_Observer->sessionNotify(new_observable, cs_fileno(cs));
85
86     worker *w = new worker;
87     w->m_assoc = new_observable;
88     w->m_mgr = socket_observable;
89
90 #ifdef WIN32
91     long t_id;
92     t_id = _beginthread (events, 0, w);
93     if (t_id == -1)
94     {
95         yaz_log (YLOG_FATAL|YLOG_ERRNO, "_beginthread failed");
96         exit (1);
97     }
98 #else
99     pthread_t tid;
100
101     int id = pthread_create (&tid, 0, events, w);
102     if (id)
103         yaz_log (YLOG_ERRNO|YLOG_FATAL, "pthread_create returned id=%d", id);
104     else
105         pthread_detach (tid);
106 #endif
107 }
108 #endif
109 /*
110  * Local variables:
111  * c-basic-offset: 4
112  * indent-tabs-mode: nil
113  * End:
114  * vim: shiftwidth=4 tabstop=8 expandtab
115  */
116