#include #include #include namespace MetadataExporter_ns { //============================================================================== // Server::Server() //============================================================================== Server::Server(Tango::DeviceImpl* deviceImpl_p, Configuration::SP configuration_sp) : Tango::LogAdapter(deviceImpl_p), m_deviceImpl_p(deviceImpl_p), m_configuration_sp(configuration_sp) { DEBUG_STREAM << "Server::Server()" << endl; m_ioService_sp.reset(new boost::asio::io_service); m_work_sp.reset(new boost::asio::io_service::work(*m_ioService_sp)); boost::asio::ip::tcp::resolver resolver(*m_ioService_sp); //TODO: bad_lexical_cast boost::asio::ip::tcp::resolver::query query(m_configuration_sp->getAddress(), boost::lexical_cast(m_configuration_sp->getPort())); //TODO: system::system_error (runtime_error) boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query); m_acceptor_sp.reset(new boost::asio::ip::tcp::acceptor(*m_ioService_sp, endpoint)); } //============================================================================== // Server::Server() //============================================================================== Server::~Server() { DEBUG_STREAM << "Server::~Server()" << endl; m_ioService_sp->stop(); if(m_threadGroup_sp) { m_threadGroup_sp->interrupt_all(); m_threadGroup_sp->join_all(); } } //============================================================================== // Server::start() //============================================================================== void Server::start() { DEBUG_STREAM << "Server::start()" << endl; m_threadGroup_sp.reset(new boost::thread_group); unsigned int workerNumber = m_configuration_sp->getWorkerNumber(); WorkerThread worker(m_deviceImpl_p, m_ioService_sp); for(unsigned int i=0; iadd_thread(new boost::thread(&WorkerThread::run, worker)); } //============================================================================== // Server::stop() //============================================================================== void Server::stop() { DEBUG_STREAM << "Server::stop()" << endl; m_ioService_sp->stop(); if(m_threadGroup_sp) { m_threadGroup_sp->interrupt_all(); m_threadGroup_sp->join_all(); } } //============================================================================== // Server::handleAccept() //============================================================================== void Server::handleAccept(Session::SP session_sp, const boost::system::error_code& ec) { DEBUG_STREAM << "Server::handleAccept()" << endl; if(!ec) session_sp->start(); else WARN_STREAM << "Server::handleAccept() " << ec.message() << endl; startAccept(); } } //namespace