/// \brief Start the thread. void DBLoggerThread::run(void) { RunProlog(); // Wait a bit before we start logging to the DB.. If we wait too long, // then short-running tasks (like mythpreviewgen) will not log to the db // at all, and that's undesirable. while (true) { if ((m_aborted || (gCoreContext && m_logger->isDatabaseReady()))) break; QMutexLocker locker(&m_queueMutex); m_wait->wait(locker.mutex(), 100); } if (!m_aborted) { // We want the query to be out of scope before the RunEpilog() so // shutdown occurs correctly as otherwise the connection appears still // in use, and we get a qWarning on shutdown. MSqlQuery *query = new MSqlQuery(MSqlQuery::InitCon()); m_logger->prepare(*query); QMutexLocker qLock(&m_queueMutex); while (!m_aborted || !m_queue->isEmpty()) { if (m_queue->isEmpty()) { m_wait->wait(qLock.mutex(), 100); continue; } LoggingItem *item = m_queue->dequeue(); if (!item) continue; if (item->message()[0] != '\0') { qLock.unlock(); bool logged = m_logger->logqmsg(*query, item); qLock.relock(); if (!logged) { m_queue->prepend(item); m_wait->wait(qLock.mutex(), 100); delete query; query = new MSqlQuery(MSqlQuery::InitCon()); m_logger->prepare(*query); continue; } } item->DecrRef(); } delete query; } RunEpilog(); }