00001
00002 #include "Server.h"
00003 #include <sstream>
00004
00005 namespace MosesServer
00006 {
00007 Server::
00008 Server(Moses::Parameter& params)
00009 : m_server_options(params),
00010 m_updater(new Updater),
00011 m_optimizer(new Optimizer),
00012 m_translator(new Translator(*this)),
00013 m_close_session(new CloseSession(*this))
00014 {
00015 m_registry.addMethod("translate", m_translator);
00016 m_registry.addMethod("updater", m_updater);
00017 m_registry.addMethod("optimize", m_optimizer);
00018 m_registry.addMethod("close_session", m_close_session);
00019 }
00020
00021 Server::
00022 ~Server()
00023 {
00024 unlink(m_pidfile.c_str());
00025 }
00026
00027 int
00028 Server::
00029 run()
00030 {
00031 xmlrpc_c::serverAbyss myAbyssServer
00032 (xmlrpc_c::serverAbyss::constrOpt()
00033 .registryP(&m_registry)
00034 .portNumber(m_server_options.port)
00035 .logFileName(m_server_options.logfile)
00036 .allowOrigin("*")
00037 .maxConn(m_server_options.maxConn)
00038 .maxConnBacklog(m_server_options.maxConnBacklog)
00039 .keepaliveTimeout(m_server_options.keepaliveTimeout)
00040 .keepaliveMaxConn(m_server_options.keepaliveMaxConn)
00041 .timeout(m_server_options.timeout)
00042 );
00043 std::ostringstream pidfilename;
00044 pidfilename << "/tmp/moses-server." << m_server_options.port << ".pid";
00045 m_pidfile = pidfilename.str();
00046 std::ofstream pidfile(m_pidfile.c_str());
00047 pidfile << getpid() << std::endl;
00048 pidfile.close();
00049 XVERBOSE(1,"Listening on port " << m_server_options.port << std::endl);
00050 if (m_server_options.is_serial)
00051 {
00052 VERBOSE(1,"Running server in serial mode." << std::endl);
00053 while(true) myAbyssServer.runOnce();
00054 }
00055 else myAbyssServer.run();
00056
00057 std::cerr << "xmlrpc_c::serverAbyss.run() returned but it should not."
00058 << std::endl;
00059 return 1;
00060 }
00061
00062 Moses::ServerOptions const&
00063 Server::
00064 options() const
00065 {
00066 return m_server_options;
00067 }
00068
00069 Session const&
00070 Server::
00071 get_session(uint64_t session_id)
00072 {
00073 return m_session_cache[session_id];
00074 }
00075
00076 void
00077 Server::
00078 delete_session(uint64_t const session_id)
00079 {
00080 return m_session_cache.erase(session_id);
00081 }
00082 }