1 /* -*- C++ -*- */
2 
3 /****************************************************************************
4 ** Copyright (c) 2001-2014
5 **
6 ** This file is part of the QuickFIX FIX Engine
7 **
8 ** This file may be distributed under the terms of the quickfixengine.org
9 ** license as defined by quickfixengine.org and appearing in the file
10 ** LICENSE included in the packaging of this file.
11 **
12 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14 **
15 ** See http://www.quickfixengine.org/LICENSE for licensing information.
16 **
17 ** Contact ask@quickfixengine.org if any conditions of this licensing are
18 ** not clear to you.
19 **
20 ****************************************************************************/
21 
22 #ifndef FIX_THREADEDSOCKETACCEPTOR_H
23 #define FIX_THREADEDSOCKETACCEPTOR_H
24 
25 #ifdef _MSC_VER
26 #pragma warning( disable : 4503 4355 4786 4290 )
27 #endif
28 
29 #include "Acceptor.h"
30 #include "ThreadedSocketConnection.h"
31 #include "Mutex.h"
32 
33 namespace FIX
34 {
35 /// Threaded Socket implementation of Acceptor.
36 class ThreadedSocketAcceptor : public Acceptor
37 {
38   friend class SocketConnection;
39 public:
40   ThreadedSocketAcceptor( Application&, MessageStoreFactory&,
41                           const SessionSettings& ) throw( ConfigError );
42   ThreadedSocketAcceptor( Application&, MessageStoreFactory&,
43                           const SessionSettings&,
44                           LogFactory& ) throw( ConfigError );
45 
46   virtual ~ThreadedSocketAcceptor();
47 
48 private:
49   struct AcceptorThreadInfo
50   {
AcceptorThreadInfoAcceptorThreadInfo51     AcceptorThreadInfo( ThreadedSocketAcceptor* pAcceptor, int socket, int port )
52     : m_pAcceptor( pAcceptor ), m_socket( socket ), m_port( port ) {}
53 
54     ThreadedSocketAcceptor* m_pAcceptor;
55     int m_socket;
56     int m_port;
57   };
58 
59   struct ConnectionThreadInfo
60   {
ConnectionThreadInfoConnectionThreadInfo61     ConnectionThreadInfo( ThreadedSocketAcceptor* pAcceptor,
62                           ThreadedSocketConnection* pConnection )
63     : m_pAcceptor( pAcceptor ), m_pConnection( pConnection ) {}
64 
65     ThreadedSocketAcceptor* m_pAcceptor;
66     ThreadedSocketConnection* m_pConnection;
67   };
68 
69   bool readSettings( const SessionSettings& );
70 
71   typedef std::set < int >  Sockets;
72   typedef std::set < SessionID > Sessions;
73   typedef std::map < int, Sessions > PortToSessions;
74   typedef std::map < int, int > SocketToPort;
75   typedef std::map < int, thread_id > SocketToThread;
76 
77   void onConfigure( const SessionSettings& ) throw ( ConfigError );
78   void onInitialize( const SessionSettings& ) throw ( RuntimeError );
79 
80   void onStart();
81   bool onPoll( double timeout );
82   void onStop();
83 
84   void addThread( int s, thread_id t );
85   void removeThread( int s );
86   static THREAD_PROC socketAcceptorThread( void* p );
87   static THREAD_PROC socketConnectionThread( void* p );
88 
89   Sockets m_sockets;
90   PortToSessions m_portToSessions;
91   SocketToPort m_socketToPort;
92   SocketToThread m_threads;
93   Mutex m_mutex;
94 };
95 /*! @} */
96 }
97 
98 #endif //FIX_THREADEDSOCKETACCEPTOR_H
99