|
|
#include "OutputCollector.h"
|
|
|
|
|
|
namespace Moses2
|
|
|
{
|
|
|
OutputCollector::OutputCollector(std::ostream* outStream,
|
|
|
std::ostream* debugStream) :
|
|
|
m_nextOutput(0), m_outStream(outStream), m_debugStream(debugStream), m_isHoldingOutputStream(
|
|
|
false), m_isHoldingDebugStream(false) {
|
|
|
}
|
|
|
|
|
|
OutputCollector::OutputCollector(std::string xout, std::string xerr) :
|
|
|
m_nextOutput(0) {
|
|
|
|
|
|
|
|
|
if (xout == "/dev/stderr") {
|
|
|
m_outStream = &std::cerr;
|
|
|
m_isHoldingOutputStream = false;
|
|
|
}
|
|
|
else if (xout.size() && xout != "/dev/stdout" && xout != "-") {
|
|
|
m_outStream = new std::ofstream(xout.c_str());
|
|
|
UTIL_THROW_IF2(!m_outStream->good(),
|
|
|
"Failed to open output file" << xout);
|
|
|
m_isHoldingOutputStream = true;
|
|
|
}
|
|
|
else {
|
|
|
m_outStream = &std::cout;
|
|
|
m_isHoldingOutputStream = false;
|
|
|
}
|
|
|
|
|
|
if (xerr == "/dev/stdout") {
|
|
|
m_debugStream = &std::cout;
|
|
|
m_isHoldingDebugStream = false;
|
|
|
}
|
|
|
else if (xerr.size() && xerr != "/dev/stderr") {
|
|
|
m_debugStream = new std::ofstream(xerr.c_str());
|
|
|
UTIL_THROW_IF2(!m_debugStream->good(),
|
|
|
"Failed to open debug stream" << xerr);
|
|
|
m_isHoldingDebugStream = true;
|
|
|
}
|
|
|
else {
|
|
|
m_debugStream = &std::cerr;
|
|
|
m_isHoldingDebugStream = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
OutputCollector::~OutputCollector() {
|
|
|
if (m_isHoldingOutputStream) delete m_outStream;
|
|
|
if (m_isHoldingDebugStream) delete m_debugStream;
|
|
|
}
|
|
|
|
|
|
|
|
|
void OutputCollector::Write(int sourceId, const std::string& output, const std::string& debug) {
|
|
|
#ifdef WITH_THREADS
|
|
|
boost::mutex::scoped_lock lock(m_mutex);
|
|
|
#endif
|
|
|
if (sourceId == m_nextOutput) {
|
|
|
|
|
|
*m_outStream << output << std::flush;
|
|
|
*m_debugStream << debug << std::flush;
|
|
|
++m_nextOutput;
|
|
|
|
|
|
std::unordered_map<int, std::string>::iterator iter;
|
|
|
while ((iter = m_outputs.find(m_nextOutput)) != m_outputs.end()) {
|
|
|
*m_outStream << iter->second << std::flush;
|
|
|
++m_nextOutput;
|
|
|
std::unordered_map<int, std::string>::iterator debugIter = m_debugs.find(
|
|
|
iter->first);
|
|
|
m_outputs.erase(iter);
|
|
|
if (debugIter != m_debugs.end()) {
|
|
|
*m_debugStream << debugIter->second << std::flush;
|
|
|
m_debugs.erase(debugIter);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
|
|
|
m_outputs[sourceId] = output;
|
|
|
m_debugs[sourceId] = debug;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|