PDU_Assoc keeps track of children. Using yaz_log instead of logf.
[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  * $Log: yaz-pdu-assoc-thread.cpp,v $
6  * Revision 1.3  2001-08-13 16:39:12  adam
7  * PDU_Assoc keeps track of children. Using yaz_log instead of logf.
8  *
9  * Revision 1.2  2001/03/27 14:47:45  adam
10  * New server facility scheme.
11  *
12  * Revision 1.1  2001/03/26 14:43:49  adam
13  * New threaded PDU association.
14  *
15  */
16
17 #ifdef WIN32
18 #include <process.h>
19 #else
20 #include <pthread.h>
21 #include <unistd.h>
22 #endif
23
24
25 #include <errno.h>
26 #include <yaz/log.h>
27 #include <yaz/tcpip.h>
28
29 #include <yaz++/yaz-pdu-assoc.h>
30 #include <yaz++/yaz-socket-manager.h>
31
32
33
34 Yaz_PDU_AssocThread::Yaz_PDU_AssocThread(
35     IYazSocketObservable *socketObservable)
36     : Yaz_PDU_Assoc(socketObservable)
37 {
38     
39 }
40
41 #ifdef WIN32
42 void __cdecl
43 #else
44 void *
45 #endif 
46 events(void *p)
47 {
48     Yaz_SocketManager *s = (Yaz_SocketManager *) p;
49     
50     yaz_log (LOG_LOG, "thread started");
51     while (s->processEvent() > 0)
52         ;
53     yaz_log (LOG_LOG, "thread finished");
54 #ifdef WIN32
55 #else
56     return 0;
57 #endif
58 }
59
60 void Yaz_PDU_AssocThread::childNotify(COMSTACK cs)
61 {
62     Yaz_SocketManager *socket_observable = new Yaz_SocketManager;
63     Yaz_PDU_Assoc *new_observable = new Yaz_PDU_Assoc (socket_observable, cs);
64
65     new_observable->m_next = m_children;
66     m_children = new_observable;
67     new_observable->m_parent = this;
68
69     /// Clone PDU Observer
70     new_observable->m_PDU_Observer =
71         m_PDU_Observer->sessionNotify(new_observable, cs_fileno(cs));
72 #ifdef WIN32
73     long t_id;
74     t_id = _beginthread (events, 0, socket_observable);
75     if (t_id == -1)
76     {
77         yaz_log (LOG_FATAL|LOG_ERRNO, "_beginthread failed");
78         exit (1);
79     }
80 #else
81     pthread_t tid;
82
83     int id = pthread_create (&tid, 0, events, socket_observable);
84     if (id)
85         yaz_log (LOG_ERRNO|LOG_FATAL, "pthread_create returned id=%d", id);
86     else
87         pthread_detach (tid);
88 #endif
89 }