#include #include /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "indexer.h" #include "debuglog.h" #include "idxthread.h" static QMutex curfile_mutex; class IdxThread : public QThread , public DbIxStatusUpdater { virtual void run(); public: virtual bool update() { QMutexLocker locker(&curfile_mutex); m_statusSnap = status; LOGDEB1(("IdxThread::update: indexing %s\n", m_statusSnap.fn.c_str())); if (stopindexing) { stopindexing = 0; return false; } return true; } ConfIndexer *indexer; // Maintain a copy/snapshot of idx status DbIxStatus m_statusSnap; int loglevel; }; int stopindexing; int startindexing; int indexingdone = 1; IdxThreadStatus indexingstatus = IDXTS_NULL; string indexingReason; static int stopidxthread; void IdxThread::run() { DebugLog::getdbl()->setloglevel(loglevel); for (;;) { if (stopidxthread) { delete indexer; return; } if (startindexing) { startindexing = 0; indexingdone = 0; indexingstatus = IDXTS_NULL; if (indexer->index()) { indexingstatus = IDXTS_OK; indexingReason = ""; } else { indexingstatus = IDXTS_ERROR; indexingReason = "Indexation failed: " + indexer->getReason(); } indexingdone = 1; } msleep(100); } } static IdxThread idxthread; void start_idxthread(const RclConfig& cnf) { // We have to make a copy of the config (setKeydir changes it during // indexation) RclConfig *myconf = new RclConfig(cnf); ConfIndexer *ix = new ConfIndexer(myconf, &idxthread); idxthread.indexer = ix; idxthread.loglevel = DebugLog::getdbl()->getlevel(); idxthread.start(); } void stop_idxthread() { stopindexing = 1; stopidxthread = 1; idxthread.wait(); } DbIxStatus idxthread_idxStatus() { QMutexLocker locker(&curfile_mutex); return(idxthread.m_statusSnap); }