/** * @RDE_HEADER@ * Routing Test - data writer thread * $Id$ * $HeadURL$ * $Author$ */ #include "data_writer_task.h" namespace RoutingService { DataWriterTask::DataWriterTask() : m_doShutdown(false) , m_logger(getLogger("DataWriterTask")) { DEBUG_LOG(m_logger) << this << ": init "; } DataWriterTask::~DataWriterTask() { std::lock_guard lock(m_queueLock); DEBUG_LOG(m_logger) << this << ": Cleaning up remaining writers: " << m_writerQueue.size(); while (!m_writerQueue.empty()) { delete m_writerQueue.front(); m_writerQueue.pop(); } } void DataWriterTask::enqueue(SampleWriterInterface *swi) { std::lock_guard lock(m_queueLock); TRACE_LOG(m_logger) << this << ": enqueue " << swi << " shutdown: " << m_doShutdown; if (m_doShutdown) { delete swi; return; } m_writerQueue.push(swi); m_waitForDataCondition.notify_one(); } void DataWriterTask::shutdown() { std::lock_guard l(m_queueLock); m_doShutdown = true; DEBUG_LOG(m_logger) << this << ": Cleaning up remaining writers: " << m_writerQueue.size(); while (!m_writerQueue.empty()) { delete m_writerQueue.front(); m_writerQueue.pop(); } m_waitForDataCondition.notify_one(); } bool DataWriterTask::waitForData() { TRACE_LOG(m_logger) << this << ": waiting for data "; std::unique_lock waitCondLock(m_queueLock); while (true) { if (m_doShutdown) return false; if (!m_writerQueue.empty()) return true; m_waitForDataCondition.wait(waitCondLock); // m_queueLock gets unlocked inside wait() // m_queueLock is locked now } return true; // dead code ... } SampleWriterInterface *DataWriterTask::getNextSampleWriter() { std::lock_guard lock(m_queueLock); if (m_writerQueue.empty()) return nullptr; TRACE_LOG(m_logger) << this << ": getData() queue size: " << m_writerQueue.size(); auto ret = m_writerQueue.front(); m_writerQueue.pop(); return ret; } void DataWriterTask::writeSamples() { while (true) { if (!waitForData()) return; SampleWriterInterface *swi = nullptr; while ((swi = getNextSampleWriter()) != nullptr) { swi->writeSamples(); TRACE_LOG(swi->logger()) << this << ": delete " << swi; delete swi; } } } } // namespace RoutingService