Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Translator.cpp « server « moses2 - github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6f62123233854d7fb3eed5d542696e76bcb40dbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * Translator.cpp
 *
 *  Created on: 1 Apr 2016
 *      Author: hieu
 */
#include <boost/shared_ptr.hpp>
#include "Translator.h"
#include "TranslationRequest.h"
#include "Server.h"
#include "../parameters/ServerOptions.h"

using namespace std;

namespace Moses2
{

Translator::Translator(Server& server, System &system)
  : m_server(server),
    m_threadPool(server.options().numThreads),
    m_system(system),
    m_translationId(0)
{
  // signature and help strings are documentation -- the client
  // can query this information with a system.methodSignature and
  // system.methodHelp RPC.
  this->_signature = "S:S";
  this->_help = "Does translation";
}

Translator::~Translator()
{
  // TODO Auto-generated destructor stub
}

void Translator::execute(xmlrpc_c::paramList const& paramList,
                         xmlrpc_c::value *const  retvalP)
{
  typedef std::map<std::string,xmlrpc_c::value> param_t;
  param_t const& params = paramList.getStruct(0);
  param_t::const_iterator si;
  si = params.find("text");
  if (si == params.end()) {
    throw xmlrpc_c::fault("Missing source text", xmlrpc_c::fault::CODE_PARSE);
  }

  string line = xmlrpc_c::value_string(si->second);
  long translationId;

  // get unique id. Thread safe
  {
    boost::unique_lock<boost::shared_mutex> lock(m_accessLock);
    translationId = m_translationId++;
  }

  boost::condition_variable cond;
  boost::mutex mut;
  boost::shared_ptr<TranslationRequest> task;
  task = TranslationRequest::create(this, paramList,cond,mut, m_system, line, translationId);
  m_threadPool.Submit(task);
  boost::unique_lock<boost::mutex> lock(mut);
  while (!task->IsDone()) {
    cond.wait(lock);
  }
  *retvalP = xmlrpc_c::value_struct(task->GetRetData());
}

} /* namespace Moses2 */