Newer
Older
#include <boost/lexical_cast.hpp>
#include <google/protobuf/stubs/common.h>
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_dBManager_sp = DBManager::create(deviceImpl_p, configuration_sp);
m_ioService_sp.reset(new boost::asio::io_service);
m_work_sp.reset(new boost::asio::io_service::work(*m_ioService_sp));
m_acceptor_sp.reset(new boost::asio::ip::tcp::acceptor(*m_ioService_sp));
std::string localHost = m_configuration_sp->getLocalHost();
unsigned int localPort = m_configuration_sp->getLocalPort();
INFO_STREAM << "Server::Server() listen on " << localHost << ":" << localPort << endl;
boost::asio::ip::tcp::resolver::query query(localHost,
boost::lexical_cast<std::string>(localPort));
boost::asio::ip::tcp::resolver resolver(*m_ioService_sp);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
m_acceptor_sp->open(endpoint.protocol());
m_acceptor_sp->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
m_acceptor_sp->bind(endpoint);
m_acceptor_sp->listen();
m_state = Tango::OFF;
}
//==============================================================================
// Server::Server()
//==============================================================================
Server::~Server()
{
DEBUG_STREAM << "Server::~Server()" << endl;
m_state = Tango::OFF;
m_status="Disconnected";
m_acceptor_sp->close();
if(m_threadGroup_sp)
{
m_threadGroup_sp->interrupt_all();
m_threadGroup_sp->join_all();
google::protobuf::ShutdownProtobufLibrary();
}
//==============================================================================
// 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; i<workerNumber; ++i)
m_threadGroup_sp->add_thread(new boost::thread(&WorkerThread::run, worker));
}
//==============================================================================
// Server::stop()
//==============================================================================
void Server::stop()
{
DEBUG_STREAM << "Server::stop()" << endl;
if(m_threadGroup_sp)
{
m_threadGroup_sp->interrupt_all();
m_threadGroup_sp->join_all();
}
//==============================================================================
// Client::readState()
//==============================================================================
Tango::DevState Server::readState()
{
DEBUG_STREAM << "Server::readState()" << endl;
boost::mutex::scoped_lock stateLock(m_stateMutex);
return m_state;
}
//==============================================================================
//==============================================================================
std::string Server::readStatus()
{
DEBUG_STREAM << "Server::readStatus()" << endl;
boost::mutex::scoped_lock statusLock(m_stateMutex);
return m_status;
}
//==============================================================================
// 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();