Fixed problem processEvent which in rare cases return 0.
[yazpp-moved-to-github.git] / src / yaz-pdu-assoc-thread.cpp
1 /*
2  * Copyright (c) 1998-2001, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: yaz-pdu-assoc-thread.cpp,v 1.4 2001-11-04 22:36:21 adam Exp $
6  */
7
8 #ifdef WIN32
9 #include <process.h>
10 #else
11 #include <pthread.h>
12 #include <unistd.h>
13 #endif
14
15
16 #include <errno.h>
17 #include <yaz/log.h>
18 #include <yaz/tcpip.h>
19
20 #include <yaz++/yaz-pdu-assoc.h>
21 #include <yaz++/yaz-socket-manager.h>
22
23
24
25 Yaz_PDU_AssocThread::Yaz_PDU_AssocThread(
26     IYazSocketObservable *socketObservable)
27     : Yaz_PDU_Assoc(socketObservable)
28 {
29     
30 }
31
32 #ifdef WIN32
33 void __cdecl
34 #else
35 void *
36 #endif 
37 events(void *p)
38 {
39     Yaz_SocketManager *s = (Yaz_SocketManager *) p;
40     
41     yaz_log (LOG_LOG, "thread started");
42     while (s->processEvent() > 0)
43         ;
44     yaz_log (LOG_LOG, "thread finished");
45 #ifdef WIN32
46 #else
47     return 0;
48 #endif
49 }
50
51 void Yaz_PDU_AssocThread::childNotify(COMSTACK cs)
52 {
53     Yaz_SocketManager *socket_observable = new Yaz_SocketManager;
54     Yaz_PDU_Assoc *new_observable = new Yaz_PDU_Assoc (socket_observable, cs);
55
56     new_observable->m_next = m_children;
57     m_children = new_observable;
58     new_observable->m_parent = this;
59
60     /// Clone PDU Observer
61     new_observable->m_PDU_Observer =
62         m_PDU_Observer->sessionNotify(new_observable, cs_fileno(cs));
63 #ifdef WIN32
64     long t_id;
65     t_id = _beginthread (events, 0, socket_observable);
66     if (t_id == -1)
67     {
68         yaz_log (LOG_FATAL|LOG_ERRNO, "_beginthread failed");
69         exit (1);
70     }
71 #else
72     pthread_t tid;
73
74     int id = pthread_create (&tid, 0, events, socket_observable);
75     if (id)
76         yaz_log (LOG_ERRNO|LOG_FATAL, "pthread_create returned id=%d", id);
77     else
78         pthread_detach (tid);
79 #endif
80 }