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